summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Mikkelsen <peter@pmikkelsen.com>2021-07-07 16:44:25 +0000
committerPeter Mikkelsen <peter@pmikkelsen.com>2021-07-07 16:44:25 +0000
commite6a38aa97b9de05ae0eede568212667b68784a60 (patch)
tree26cc01919d3502c9a66d734a616c9de8850b83b4
parent0f958749e189e4dacd7a1f70cfc33460e1228d3b (diff)
Add copy_term/2
-rw-r--r--builtins.c14
-rw-r--r--dat.h1
-rw-r--r--eval.c4
-rw-r--r--main.c1
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();