diff options
Diffstat (limited to 'eval.c')
-rw-r--r-- | eval.c | 11 |
1 files changed, 4 insertions, 7 deletions
@@ -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; |