From 13efe91101a11f41caf6321a8b2fbdd96ef9927a Mon Sep 17 00:00:00 2001 From: Peter Mikkelsen Date: Tue, 27 Jul 2021 16:41:12 +0000 Subject: remove clausenr from terms, and put it into goals instead. Next up is implementing the control constructs in C, since they misbehave right now due to the new changes --- builtins.c | 99 ++++++++------------------------------------------------------ 1 file changed, 12 insertions(+), 87 deletions(-) (limited to 'builtins.c') diff --git a/builtins.c b/builtins.c index 7d32d98..7ef74df 100644 --- a/builtins.c +++ b/builtins.c @@ -20,7 +20,6 @@ BuiltinProto(builtintrue); BuiltinProto(builtinfail); BuiltinProto(builtincall); -BuiltinProto(builtincut); BuiltinProto(builtinvar); BuiltinProto(builtinatom); BuiltinProto(builtininteger); @@ -36,7 +35,6 @@ BuiltinProto(builtinuniv); BuiltinProto(builtincopyterm); BuiltinProto(builtinis); BuiltinProto(builtincatch); -BuiltinProto(builtinthrow); BuiltinProto(builtinsetprologflag); BuiltinProto(builtincurrentprologflags); BuiltinProto(builtinopen); @@ -101,8 +99,6 @@ findbuiltin(Term *goal) return builtinfail; if(Match(L"call", 1)) return builtincall; - if(Match(L"!", 0)) - return builtincut; if(Match(L"var", 1)) return builtinvar; if(Match(L"atom", 1)) @@ -133,8 +129,6 @@ findbuiltin(Term *goal) return builtinis; if(Match(L"catch", 3)) return builtincatch; - if(Match(L"throw", 1)) - return builtinthrow; if(Match(L"$set_prolog_flag", 2)) return builtinsetprologflag; if(Match(L"current_prolog_flags", 1)) @@ -241,21 +235,6 @@ canbecalled(Term *t) return 1; } -void -updateclausenr(Term *t, uvlong nr) -{ - /* Change the clause number on the term and its subterms, unless it is a variable */ - if(t->tag == VariableTerm) - return; - - t->clausenr = nr; - if(t->tag == CompoundTerm){ - Term *child; - for(child = t->children; child != nil; child = child->next) - updateclausenr(child, nr); - } -} - int builtincall(Term *goal, Binding **bindings, Module *module) { @@ -265,27 +244,7 @@ builtincall(Term *goal, Binding **bindings, Module *module) if(!canbecalled(callgoal)) Throw(typeerror(L"callable", callgoal)); - updateclausenr(callgoal, clausenr); - clausenr++; - - goalstack = addgoals(goalstack, callgoal, module); - return 1; -} - -int -builtincut(Term *goal, Binding **bindings, Module *module) -{ - USED(bindings); - USED(module); - - 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. - */ - while(cp != nil && cp->id >= goal->clausenr) - cp = cp->next; - choicestack = cp; + goalstack = addgoals(goalstack, callgoal, module, clausenr++); return 1; } @@ -563,7 +522,7 @@ builtinuniv(Term *goal, Binding **bindings, Module *module) list = list->children->next; for(i = 1; i < len; i++){ - Term *t = copyterm(list->children, nil); + Term *t = copyterm(list->children); elems = appendterm(elems, t); list = list->children->next; } @@ -575,7 +534,7 @@ builtinuniv(Term *goal, Binding **bindings, Module *module) Term *reallist = mklist(elems); return unify(list, reallist, bindings); }else{ - Term *t = copyterm(term, nil); + Term *t = copyterm(term); t->next = mkatom(L"[]"); Term *reallist = mkcompound(L".", 2, t); return unify(list, reallist, bindings); @@ -588,8 +547,8 @@ builtincopyterm(Term *goal, Binding **bindings, Module *module) USED(module); Term *term1 = goal->children; Term *term2 = term1->next; - Term *t = copyterm(term1, &clausenr); - clausenr++; + Term *t = copyterm(term1); + renametermvars(t); return unify(term2, t, bindings); } @@ -623,43 +582,10 @@ builtincatch(Term *goal, Binding **bindings, Module *module) catchframe->next = goalstack; goalstack = catchframe; - goalstack = addgoals(goalstack, catchgoal, module); + goalstack = addgoals(goalstack, catchgoal, module, clausenr++); return 1; } -int -builtinthrow(Term *goal, Binding **bindings, Module *module) -{ - USED(bindings); - USED(module); - - Term *ball = goal->children; - - Goal *g; - for(g = goalstack; g != nil; g = g->next){ - if(g->catcher == nil) - continue; - - if(unify(g->catcher, ball, bindings)){ - goalstack = g->next; - Goal *newgoal = gmalloc(sizeof(Goal)); - newgoal->goal = copyterm(g->goal, nil); - newgoal->module = g->module; - newgoal->catcher = nil; - newgoal->next = goalstack; - goalstack = newgoal; - applybinding(newgoal->goal, *bindings); - - Choicepoint *cp = choicestack; - while(cp != nil && cp->id >= goal->clausenr) - cp = cp->next; - choicestack = cp; - return 1; - } - } - return 0; -} - int builtincurrentprologflags(Term *goal, Binding **bindings, Module *module) { @@ -852,13 +778,13 @@ builtinreadterm(Term *goal, Binding **bindings, Module *module) if(options->tag == CompoundTerm){ VarName *vn; for(vn = varnames; vn != nil; vn = vn->next){ - uniquevars = appendterm(uniquevars, copyterm(vn->var, nil)); + uniquevars = appendterm(uniquevars, copyterm(vn->var)); Term *name = mkatom(vn->name); - name->next = copyterm(vn->var, nil); + name->next = copyterm(vn->var); Term *vnpair = mkcompound(L"=", 2, name); varsnames = appendterm(varsnames, vnpair); if(vn->count == 1) - singlevars = appendterm(singlevars, copyterm(vnpair, nil)); + singlevars = appendterm(singlevars, copyterm(vnpair)); } } @@ -1053,11 +979,10 @@ assertclause(Term *clause, Module *module, int after, int dynamic) else arity = 0; - uvlong id = 0; Clause *cl = gmalloc(sizeof(Clause)); - cl->head = copyterm(head, &id); - cl->body = copyterm(body, &id); - cl->clausenr = id; + cl->head = copyterm(head); + cl->body = copyterm(body); + cl->clausenr = 0; cl->next = nil; Predicate *p; -- cgit v1.2.3