diff options
-rw-r--r-- | builtins.c | 14 | ||||
-rw-r--r-- | dat.h | 1 | ||||
-rw-r--r-- | eval.c | 4 | ||||
-rw-r--r-- | main.c | 1 |
4 files changed, 16 insertions, 4 deletions
@@ -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 * @@ -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 @@ -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; } @@ -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(); |