From e6a38aa97b9de05ae0eede568212667b68784a60 Mon Sep 17 00:00:00 2001 From: Peter Mikkelsen Date: Wed, 7 Jul 2021 16:44:25 +0000 Subject: Add copy_term/2 --- builtins.c | 14 ++++++++++++++ dat.h | 1 + eval.c | 4 ---- main.c | 1 + 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/builtins.c b/builtins.c index 5751502..95b6438 100644 --- a/builtins.c +++ b/builtins.c @@ -32,6 +32,7 @@ BuiltinProto(builtincompare); BuiltinProto(builtinfunctor); BuiltinProto(builtinarg); BuiltinProto(builtinuniv); +BuiltinProto(builtincopyterm); BuiltinProto(builtinis); BuiltinProto(builtincatch); BuiltinProto(builtinthrow); @@ -98,6 +99,8 @@ findbuiltin(Term *goal) return builtinarg; if(Match(L"=..", 2)) return builtinuniv; + if(Match(L"copy_term", 2)) + return builtincopyterm; if(Match(L"is", 2)) return builtinis; if(Match(L"catch", 3)) @@ -461,6 +464,17 @@ builtinuniv(Term *goal, Binding **bindings, Module *module) } } +int +builtincopyterm(Term *goal, Binding **bindings, Module *module) +{ + USED(module); + Term *term1 = goal->children; + Term *term2 = term1->next; + Term *t = copyterm(term1, &clausenr); + clausenr++; + return unify(term2, t, bindings); +} + #define ToFloat(t) (t->tag == IntegerTerm ? (double)t->ival : t->dval) Term * diff --git a/dat.h b/dat.h index 1bde347..6e93b84 100644 --- a/dat.h +++ b/dat.h @@ -97,3 +97,4 @@ Goal *goalstack; Module *modules; Module *systemmodule; /* The module for the builtins. Everything has access to those */ Module *usermodule; /* The default module for user defined predicates */ +uvlong clausenr; \ No newline at end of file diff --git a/eval.c b/eval.c index 6c20a7e..3201286 100644 --- a/eval.c +++ b/eval.c @@ -12,8 +12,6 @@ Goal *copygoals(Goal *); Builtin findbuiltin(Term *); void addchoicepoints(Clause *, Term *, Goal *, Module *); -static uvlong clausenr; - int evalquery(Term *query, Binding **resultbindings) { @@ -39,8 +37,6 @@ evalquery(Term *query, Binding **resultbindings) /* Now add the actual goals */ goalstack = addgoals(goalstack, query, usermodule); - clausenr = 2; /* Start at two since 0 is for the facts in the database, and 1 is for queries */ - }else{ goto Backtrack; } diff --git a/main.c b/main.c index 7c1b1ca..f97a466 100644 --- a/main.c +++ b/main.c @@ -18,6 +18,7 @@ main(int argc, char *argv[]) usage(); }ARGEND + clausenr = 2; /* Start at two since 0 is for the facts in the database, and 1 is for queries */ initflags(); initstreams(); initmodules(); -- cgit v1.2.3