From: Mark Thom Date: Wed, 22 Feb 2023 03:53:13 +0000 (-0700) Subject: assign responsibility for emitting dif goal to the first variable of the left-hand... X-Git-Tag: v0.9.2~178 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=95f6ebc0002778b71d402e149e01b2031f74083a;p=scryer-prolog.git assign responsibility for emitting dif goal to the first variable of the left-hand term (#1739) --- 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(_)) }.