From 95f6ebc0002778b71d402e149e01b2031f74083a Mon Sep 17 00:00:00 2001 From: Mark Thom Date: Tue, 21 Feb 2023 20:53:13 -0700 Subject: [PATCH] assign responsibility for emitting dif goal to the first variable of the left-hand term (#1739) --- src/lib/dif.pl | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/lib/dif.pl b/src/lib/dif.pl index 33e3e44b..a59052ac 100644 --- a/src/lib/dif.pl +++ b/src/lib/dif.pl @@ -40,9 +40,6 @@ verify_attributes(Var, Value, Goals) :- ; Goals = [] ). -% Probably the world's worst dif/2 implementation. I'm open to -% suggestions for improvement. - %% dif(?X, ?Y). % % True iff X and Y are different terms. Unlike `\=/2`, `dif/2` is more declarative because if X and Y can @@ -69,12 +66,16 @@ dif(X, Y) :- ) ). -gather_dif_goals([]) --> []. -gather_dif_goals([(X \== Y) | Goals]) --> - [dif:dif(X, Y)], - gather_dif_goals(Goals). +gather_dif_goals(_, []) --> []. +gather_dif_goals(V, [(X \== Y) | Goals]) --> + ( { term_variables(X, [V0 | _]), + V == V0 } -> + [dif:dif(X, Y)] + ; [] + ), + gather_dif_goals(V, Goals). attribute_goals(X) --> { get_atts(X, +dif(Goals)) }, - gather_dif_goals(Goals), + gather_dif_goals(X, Goals), { put_atts(X, -dif(_)) }. -- 2.54.0