diff options
author | Peter Mikkelsen <peter@pmikkelsen.com> | 2021-07-19 14:26:18 +0000 |
---|---|---|
committer | Peter Mikkelsen <peter@pmikkelsen.com> | 2021-07-19 14:26:18 +0000 |
commit | 6c539b4da8be5dd00a6685d744544275774128d0 (patch) | |
tree | f455015d86516a085b742a661f05ba273dddaf11 | |
parent | 6b3d59a3256a292b582e4313325ca14154211671 (diff) |
Try to print A = B instead of A = _X, B = _X when two variables are equal
-rw-r--r-- | repl.pl | 25 |
1 files changed, 23 insertions, 2 deletions
@@ -35,8 +35,9 @@ read_eval_print :- !, abolish(found_a_solution/0). -eval_and_print(Goal, Vars, Choicecount) :- +eval_and_print(Goal, Vars0, Choicecount) :- user:call(Goal), + rewrite_equations(Vars0, Vars), abolish(found_a_solution/0), asserta(found_a_solution :- !), '$choicestack_size'(ChoicecountNew), @@ -58,6 +59,26 @@ eval_and_print(Goal, _, _) :- write('false.'), nl. +rewrite_equations(Eqs0, Eqs) :- + apply_bindings(Eqs0), + remove_identities(Eqs0, Eqs). + +apply_bindings([]). +apply_bindings([A = B|Rest]) :- + ( var(B) + -> call(B = A) + ; true + ), + apply_bindings(Rest). + +remove_identities([], []). +remove_identities([A = B|Rest0], Result) :- + remove_identities(Rest0, Rest), + ( A == B + -> Result = Rest + ; Result = [A = B|Rest] + ). + write_state(end) :- write('.'), nl. write_state(more). @@ -68,7 +89,7 @@ write_bindings([]). write_bindings([Var = Val|Bs]) :- write(Var), write(' = '), - writeq(Val), + write(Val), ( Bs = [] -> true ; put_char(','), nl |