assign responsibility for emitting dif goal to the first variable of the left-hand term (#1739)
This commit is contained in:
@@ -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(_)) }.
|
||||||
|
|||||||
Reference in New Issue
Block a user