From 4fba3e66dce0d167d2031a0d1f1f6f4571cbd981 Mon Sep 17 00:00:00 2001 From: Peter Mikkelsen Date: Tue, 27 Jul 2021 15:20:29 +0000 Subject: Don't use strings to identify vars, use numbers --- eval.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) (limited to 'eval.c') diff --git a/eval.c b/eval.c index 429d98f..c8388e6 100644 --- a/eval.c +++ b/eval.c @@ -157,6 +157,7 @@ findclause(Clause *clauses, Term *goal, Binding **bindings) Clause *clause; for(; clauses != nil; clauses = clauses->next){ clause = copyclause(clauses, &clausenr); + renameclausevars(clause); clausenr++; clause->next = clauses->next; if(unify(clause->head, goal, bindings)) @@ -216,12 +217,8 @@ unify(Term *a, Term *b, Binding **bindings) right = tmp; } - if(runestrcmp(left->text, L"_") == 0) - continue; /* _ doesn't introduce a new binding */ - Binding *b = gmalloc(sizeof(Binding)); - b->name = left->text; - b->nr = left->clausenr; + b->varnr = left->varnr; b->value = right; b->next = *bindings; *bindings = b; @@ -267,7 +264,7 @@ equalterms(Term *a, Term *b) case AtomTerm: return runestrcmp(a->text, b->text) == 0; case VariableTerm: - return (runestrcmp(a->text, b->text) == 0 && a->clausenr == b->clausenr); + return a->varnr == b->varnr; case FloatTerm: return a->dval == b->dval; case IntegerTerm: @@ -283,7 +280,7 @@ applybinding(Term *t, Binding *bindings) if(t->tag == VariableTerm){ Binding *b; for(b = bindings; b != nil; b = b->next){ - if(runestrcmp(t->text, b->name) == 0 && t->clausenr == b->nr){ + if(b->varnr == t->varnr){ Term *next = t->next; memcpy(t, b->value, sizeof(Term)); t->next = next; -- cgit v1.2.3