summaryrefslogtreecommitdiff
path: root/eval.c
diff options
context:
space:
mode:
authorPeter Mikkelsen <peter@pmikkelsen.com>2021-07-27 15:20:29 +0000
committerPeter Mikkelsen <peter@pmikkelsen.com>2021-07-27 15:20:29 +0000
commit4fba3e66dce0d167d2031a0d1f1f6f4571cbd981 (patch)
treea9ec00bc693e40ec4debca451de495889177b090 /eval.c
parent0a706b5b413aa96a944f45f28fb948c62e763555 (diff)
Don't use strings to identify vars, use numbers
Diffstat (limited to 'eval.c')
-rw-r--r--eval.c11
1 files changed, 4 insertions, 7 deletions
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;