shithub: pprolog

Download patch

ref: 66a7040df6897e60ee1a513b95f4b04e687bbf0a
parent: 7db38904537603dabe960f32fa505e27db89e27b
author: Peter Mikkelsen <peter@pmikkelsen.com>
date: Sat Jul 3 16:59:27 EDT 2021

Add one global choicestack so we don't need to pass it around

--- a/builtins.c
+++ b/builtins.c
@@ -5,7 +5,7 @@
 #include "dat.h"
 #include "fns.h"
 
-#define BuiltinProto(name) int name(Term *, Term *, Goal **, Choicepoint **, Binding **)
+#define BuiltinProto(name) int name(Term *, Term *, Goal **, Binding **)
 #define Match(X, Y) (runestrcmp(name, X) == 0 && arity == Y)
 #define Throw(What) do{\
 	Goal *g = malloc(sizeof(Goal)); \
@@ -128,21 +128,19 @@
 }
 
 int
-builtinfail(Term *database, Term *goal, Goal **goals, Choicepoint **choicestack, Binding **bindings)
+builtinfail(Term *database, Term *goal, Goal **goals, Binding **bindings)
 {
 	USED(database);
 	USED(goal);
 	USED(goals);
-	USED(choicestack);
 	USED(bindings);
 	return 0;
 }
 
 int
-builtincall(Term *database, Term *goal, Goal **goals, Choicepoint **choicestack, Binding **bindings)
+builtincall(Term *database, Term *goal, Goal **goals, Binding **bindings)
 {
 	USED(database);
-	USED(choicestack);
 	USED(bindings);
 
 	Goal *g = malloc(sizeof(Goal));
@@ -155,13 +153,13 @@
 }
 
 int
-builtincut(Term *database, Term *goal, Goal **goals, Choicepoint **choicestack, Binding **bindings)
+builtincut(Term *database, Term *goal, Goal **goals, Binding **bindings)
 {
 	USED(database);
 	USED(goals);
 	USED(bindings);
 
-	Choicepoint *cp = *choicestack;
+	Choicepoint *cp = choicestack;
 
 	/* Cut all choicepoints with an id larger or equal to the goal clause number, since they must have been introduced
 	   after this goal's parent.
@@ -168,16 +166,15 @@
 	*/
 	while(cp != nil && cp->id >= goal->clausenr)
 		cp = cp->next;
-	*choicestack = cp;
+	choicestack = cp;
 	return 1;
 }
 
 int
-builtinvar(Term *database, Term *goal, Goal **goals, Choicepoint **choicestack, Binding **bindings)
+builtinvar(Term *database, Term *goal, Goal **goals, Binding **bindings)
 {
 	USED(database);
 	USED(goals);
-	USED(choicestack);
 	USED(bindings);
 	Term *arg = goal->children;
 	return (arg->tag == VariableTerm);
@@ -184,11 +181,10 @@
 }
 
 int
-builtinatom(Term *database, Term *goal, Goal **goals, Choicepoint **choicestack, Binding **bindings)
+builtinatom(Term *database, Term *goal, Goal **goals, Binding **bindings)
 {
 	USED(database);
 	USED(goals);
-	USED(choicestack);
 	USED(bindings);
 	Term *arg = goal->children;
 	return (arg->tag == AtomTerm);
@@ -195,11 +191,10 @@
 }
 
 int
-builtininteger(Term *database, Term *goal, Goal **goals, Choicepoint **choicestack, Binding **bindings)
+builtininteger(Term *database, Term *goal, Goal **goals, Binding **bindings)
 {
 	USED(database);
 	USED(goals);
-	USED(choicestack);
 	USED(bindings);
 	Term *arg = goal->children;
 	return (arg->tag == NumberTerm && arg->numbertype == NumberInt);
@@ -206,11 +201,10 @@
 }
 
 int
-builtinfloat(Term *database, Term *goal, Goal **goals, Choicepoint **choicestack, Binding **bindings)
+builtinfloat(Term *database, Term *goal, Goal **goals, Binding **bindings)
 {
 	USED(database);
 	USED(goals);
-	USED(choicestack);
 	USED(bindings);
 	Term *arg = goal->children;
 	return (arg->tag == NumberTerm && arg->numbertype == NumberFloat);
@@ -217,11 +211,10 @@
 }
 
 int
-builtinatomic(Term *database, Term *goal, Goal **goals, Choicepoint **choicestack, Binding **bindings)
+builtinatomic(Term *database, Term *goal, Goal **goals, Binding **bindings)
 {
 	USED(database);
 	USED(goals);
-	USED(choicestack);
 	USED(bindings);
 	Term *arg = goal->children;
 	return (arg->tag == AtomTerm || arg->tag == NumberTerm);
@@ -228,11 +221,10 @@
 }
 
 int
-builtincompound(Term *database, Term *goal, Goal **goals, Choicepoint **choicestack, Binding **bindings)
+builtincompound(Term *database, Term *goal, Goal **goals, Binding **bindings)
 {
 	USED(database);
 	USED(goals);
-	USED(choicestack);
 	USED(bindings);
 	Term *arg = goal->children;
 	return (arg->tag == CompoundTerm);
@@ -239,11 +231,10 @@
 }
 
 int
-builtinnonvar(Term *database, Term *goal, Goal **goals, Choicepoint **choicestack, Binding **bindings)
+builtinnonvar(Term *database, Term *goal, Goal **goals, Binding **bindings)
 {
 	USED(database);
 	USED(goals);
-	USED(choicestack);
 	USED(bindings);
 	Term *arg = goal->children;
 	return (arg->tag != VariableTerm);
@@ -250,11 +241,10 @@
 }
 
 int
-builtinnumber(Term *database, Term *goal, Goal **goals, Choicepoint **choicestack, Binding **bindings)
+builtinnumber(Term *database, Term *goal, Goal **goals, Binding **bindings)
 {
 	USED(database);
 	USED(goals);
-	USED(choicestack);
 	USED(bindings);
 	Term *arg = goal->children;
 	return (arg->tag == NumberTerm);
@@ -316,11 +306,10 @@
 }
 
 int
-builtincompare(Term *database, Term *goal, Goal **goals, Choicepoint **choicestack, Binding **bindings)
+builtincompare(Term *database, Term *goal, Goal **goals, Binding **bindings)
 {
 	USED(database);
 	USED(goals);
-	USED(choicestack);
 	Term *order = goal->children;
 	Term *t1 = order->next;
 	Term *t2 = t1->next;
@@ -339,11 +328,10 @@
 }
 
 int
-builtinfunctor(Term *database, Term *goal, Goal **goals, Choicepoint **choicestack, Binding **bindings)
+builtinfunctor(Term *database, Term *goal, Goal **goals, Binding **bindings)
 {
 	USED(database);
 	USED(goals);
-	USED(choicestack);
 
 	Term *term = goal->children;
 	Term *name = term->next;
@@ -378,11 +366,10 @@
 }
 
 int
-builtinarg(Term *database, Term *goal, Goal **goals, Choicepoint **choicestack, Binding **bindings)
+builtinarg(Term *database, Term *goal, Goal **goals, Binding **bindings)
 {
 	USED(database);
 	USED(goals);
-	USED(choicestack);
 
 	Term *n = goal->children;
 	Term *term = n->next;
@@ -416,11 +403,10 @@
 }
 
 int
-builtinuniv(Term *database, Term *goal, Goal **goals, Choicepoint **choicestack, Binding **bindings)
+builtinuniv(Term *database, Term *goal, Goal **goals, Binding **bindings)
 {
 	USED(database);
 	USED(goals);
-	USED(choicestack);
 	Term *term = goal->children;
 	Term *list = term->next;
 
@@ -491,11 +477,10 @@
 }
 
 int
-builtinis(Term *database, Term *goal, Goal **goals, Choicepoint **choicestack, Binding **bindings)
+builtinis(Term *database, Term *goal, Goal **goals, Binding **bindings)
 {
 	USED(database);
 	USED(goals);
-	USED(choicestack);
 	Term *result = goal->children;
 	Term *expr = result->next;
 
@@ -508,10 +493,9 @@
 }
 
 int
-builtincatch(Term *database, Term *goal, Goal **goals, Choicepoint **choicestack, Binding **bindings)
+builtincatch(Term *database, Term *goal, Goal **goals, Binding **bindings)
 {
 	USED(database);
-	USED(choicestack);
 	USED(bindings);
 
 	Term *catchgoal = goal->children;
@@ -534,10 +518,9 @@
 }
 
 int
-builtinthrow(Term *database, Term *goal, Goal **goals, Choicepoint **choicestack, Binding **bindings)
+builtinthrow(Term *database, Term *goal, Goal **goals, Binding **bindings)
 {
 	USED(database);
-	USED(choicestack);
 	USED(bindings);
 	USED(goals);
 
@@ -564,10 +547,10 @@
 				*goals = newgoal;
 				applybinding(newgoal->goal, *bindings);
 
-				Choicepoint *cp = *choicestack;
+				Choicepoint *cp = choicestack;
 				while(cp != nil && cp->id >= goal->clausenr)
 					cp = cp->next;
-				*choicestack = cp;
+				choicestack = cp;
 				return 1;
 			}
 		}
@@ -576,21 +559,19 @@
 }
 
 int
-builtincurrentprologflag(Term *database, Term *goal, Goal **goals, Choicepoint **choicestack, Binding **bindings)
+builtincurrentprologflag(Term *database, Term *goal, Goal **goals, Binding **bindings)
 {
 	USED(database);
 	USED(goal);
 	USED(goals);
-	USED(choicestack);
 	USED(bindings);
 	return 0;
 }
 
 int
-builtinsetprologflag(Term *database, Term *goal, Goal **goals, Choicepoint **choicestack, Binding **bindings)
+builtinsetprologflag(Term *database, Term *goal, Goal **goals, Binding **bindings)
 {
 	USED(database);
-	USED(choicestack);
 	USED(bindings);
 	Term *key = goal->children;
 	Term *value = key->next;
@@ -608,11 +589,10 @@
 }
 
 int
-builtinopen(Term *database, Term *goal, Goal **goals, Choicepoint **choicestack, Binding **bindings)
+builtinopen(Term *database, Term *goal, Goal **goals, Binding **bindings)
 {
 	USED(database);
 	USED(goals);
-	USED(choicestack);
 	USED(bindings);
 
 	Term *sourcesink = goal->children;
@@ -646,11 +626,10 @@
 }
 
 int
-builtinclose(Term *database, Term *goal, Goal **goals, Choicepoint **choicestack, Binding **bindings)
+builtinclose(Term *database, Term *goal, Goal **goals, Binding **bindings)
 {
 	USED(database);
 	USED(goals);
-	USED(choicestack);
 	USED(bindings);
 	
 	Term *stream = goal->children;
@@ -674,11 +653,10 @@
 }
 
 int
-builtincurrentinput(Term *database, Term *goal, Goal **goals, Choicepoint **choicestack, Binding **bindings)
+builtincurrentinput(Term *database, Term *goal, Goal **goals, Binding **bindings)
 {
 	USED(database);
 	USED(goals);
-	USED(choicestack);
 	USED(bindings);
 
 	Term *stream = goal->children;
@@ -690,11 +668,10 @@
 }
 
 int
-builtincurrentoutput(Term *database, Term *goal, Goal **goals, Choicepoint **choicestack, Binding **bindings)
+builtincurrentoutput(Term *database, Term *goal, Goal **goals, Binding **bindings)
 {
 	USED(database);
 	USED(goals);
-	USED(choicestack);
 	USED(bindings);
 
 	Term *stream = goal->children;
@@ -706,11 +683,10 @@
 }
 
 int
-builtinsetinput(Term *database, Term *goal, Goal **goals, Choicepoint **choicestack, Binding **bindings)
+builtinsetinput(Term *database, Term *goal, Goal **goals, Binding **bindings)
 {
 	USED(database);
 	USED(goals);
-	USED(choicestack);
 	USED(bindings);
 
 	Term *stream = goal->children;
@@ -731,11 +707,10 @@
 }
 
 int
-builtinsetoutput(Term *database, Term *goal, Goal **goals, Choicepoint **choicestack, Binding **bindings)
+builtinsetoutput(Term *database, Term *goal, Goal **goals, Binding **bindings)
 {
 	USED(database);
 	USED(goals);
-	USED(choicestack);
 	USED(bindings);
 
 	Term *stream = goal->children;
@@ -756,11 +731,10 @@
 }
 
 int
-builtinreadterm(Term *database, Term *goal, Goal **goals, Choicepoint **choicestack, Binding **bindings)
+builtinreadterm(Term *database, Term *goal, Goal **goals, Binding **bindings)
 {
 	USED(database);
 	USED(goals);
-	USED(choicestack);
 	USED(bindings);
 
 	Term *stream = goal->children;
@@ -789,11 +763,10 @@
 }
 
 int
-builtinwriteterm(Term *database, Term *goal, Goal **goals, Choicepoint **choicestack, Binding **bindings)
+builtinwriteterm(Term *database, Term *goal, Goal **goals, Binding **bindings)
 {
 	USED(database);
 	USED(goals);
-	USED(choicestack);
 	USED(bindings);
 	
 	Term *stream = goal->children;
--- a/dat.h
+++ b/dat.h
@@ -2,7 +2,7 @@
 typedef struct Binding Binding;
 typedef struct Goal Goal;
 typedef struct Choicepoint Choicepoint;
-typedef int (*Builtin)(Term *, Term *, Goal **, Choicepoint **, Binding **);
+typedef int (*Builtin)(Term *, Term *, Goal **, Binding **);
 
 struct Term
 {
@@ -66,3 +66,5 @@
 
 int flagdoublequotes;
 
+/* Staate of the running system */
+Choicepoint *choicestack;
\ No newline at end of file
--- a/eval.c
+++ b/eval.c
@@ -14,10 +14,9 @@
 static uvlong clausenr;
 
 int
-evalquery(Term *database, Term *query, Binding **resultbindings, Choicepoint **resultchoicestack)
+evalquery(Term *database, Term *query, Binding **resultbindings)
 {
 	Goal *goals;
-	Choicepoint *choicestack = *resultchoicestack;
 
 	if(choicestack == nil){
 	/*
@@ -66,7 +65,7 @@
 		/* Try to see if the goal can be solved using a builtin first */
 		Builtin builtin = findbuiltin(goal);
 		if(builtin != nil){
-			int success = builtin(database, goal, &goals->next, &choicestack, &bindings);
+			int success = builtin(database, goal, &goals->next, &bindings);
 			if(!success)
 				goto Backtrack;
 		}else{
@@ -115,7 +114,6 @@
 	}
 	goals = goals->next;
 	unify(query, goals->goal, resultbindings);
-	*resultchoicestack = choicestack;
 	return 1;
 }
 
--- a/fns.h
+++ b/fns.h
@@ -16,7 +16,7 @@
 Term *mklist(Term *);
 
 /* eval.c */
-int evalquery(Term *, Term *, Binding **, Choicepoint **);
+int evalquery(Term *, Term *, Binding **);
 int unify(Term *, Term *, Binding **);
 void applybinding(Term *, Binding *);
 
--- a/main.c
+++ b/main.c
@@ -48,8 +48,7 @@
 		Term *goal;
 		for(goal = initgoals; goal != nil; goal = goal->next){
 			Binding *bindings = nil;
-			Choicepoint *choicestack = nil;
-			evalquery(database, goal, &bindings, &choicestack);
+			evalquery(database, goal, &bindings);
 		}
 	}
 
--- a/repl.c
+++ b/repl.c
@@ -15,10 +15,9 @@
 		print("?- ");
 		Term *query = parse(fd, nil, 1);
 		Binding *bindings = nil;
-		Choicepoint *choicestack = nil;
 		int success;
 FindMore:
-		success = evalquery(database, query, &bindings, &choicestack);
+		success = evalquery(database, query, &bindings);
 		if(success == 0)
 			print("false.\n");
 		else{