assign responsibility for emitting dif goal to the first variable of the left-hand term (#1739)

This commit is contained in:
Mark Thom
2023-02-21 20:53:13 -07:00
parent 6e9cd072c5
commit 95f6ebc000

View File

@@ -40,9 +40,6 @@ verify_attributes(Var, Value, Goals) :-
; Goals = [] ; Goals = []
). ).
% Probably the world's worst dif/2 implementation. I'm open to
% suggestions for improvement.
%% dif(?X, ?Y). %% dif(?X, ?Y).
% %
% True iff X and Y are different terms. Unlike `\=/2`, `dif/2` is more declarative because if X and Y can % 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(_, []) --> [].
gather_dif_goals([(X \== Y) | Goals]) --> gather_dif_goals(V, [(X \== Y) | Goals]) -->
[dif:dif(X, Y)], ( { term_variables(X, [V0 | _]),
gather_dif_goals(Goals). V == V0 } ->
[dif:dif(X, Y)]
; []
),
gather_dif_goals(V, Goals).
attribute_goals(X) --> attribute_goals(X) -->
{ get_atts(X, +dif(Goals)) }, { get_atts(X, +dif(Goals)) },
gather_dif_goals(Goals), gather_dif_goals(X, Goals),
{ put_atts(X, -dif(_)) }. { put_atts(X, -dif(_)) }.