compare_args(_, _, _, _, Yes) :-
nonvar(Yes).
compare_args(A1, A2, Link, NewLink, Yes) :-
var(Yes),
(A1 == A2 ->
Link = NewLink
;
(var(A1);var(A2)) ->
(not_unify(A1, A2) ->
Yes = yes
;
suspend(compare_args(A1, A2, Link, NewLink, Yes), 3,
[[A1|A2]->constrained, Yes->inst])
)
;
compare_terms(A1, A2, Link, NewLink, Yes)
).
Now our
[eclipse 1]: dif3(A, B, Y, N), A::1..10, B::20..30.
Y = yes
N = N
A = A{[1..10]}
B = B{[20..30]}
yes.
[eclipse 2]: dif3(A, B, Y, N), A::1..10, B = 5, A ## 5.
Y = yes
N = N
B = 5
A = A{[1..4, 6..10]}
yes.
[eclipse 18]: dif3(A, B, Y, N), A + B $= 1, A $= 1/2.
Y = Y
N = no
B = 1 / 2
A = 1 / 2
yes.