# Equivalence relation in prolog

Your code introduces a choice point because it contains a choice introduced by the `;` operator. You might think of this as a “logical or” operator, and somewhat informally it is. But procedurally it is an “introduce a choice point here, and on backtracking, explore the second branch as well” operator.

It’s true that a Sufficiently Powerful Prolog Compiler™ might be able to recognize that the two branches here are mutually exclusive, but it appears that your Prolog system isn’t that powerful. I would be at least mildly surprised if any Prolog you can get for free would be able to do this without a choice point. Especially if your actual conditions are more complex, as you say.

If you want this to be more readable, some tips:

• In general, never use `;` at the end of a line as if it were just a variant of `,`. It’s too easy to miss it, since the general expectation is that lines end in `,`. Try to format your code in some way that really makes the `;` stick out (see examples below).

• In general, if you want to use `;` (not `_ -> _ ; _`), especially as the single top-level goal in a clause, consider using separate clauses instead:

``````  a_iff_b(a, b).
a_iff_b(X, Y) :-
X \= a,
Y \= b.
``````

In any case, all of the following are possible ways of cutting away the choice:

``````a_iff_b_1(a, b) :-
!.
a_iff_b_1(X, Y) :-
X \= a,
Y \= b.

a_iff_b_2(X, Y) :-
(   X = a, Y = b
->  true
;   X \= a, Y \= b ).

a_iff_b_3(X, Y) :-
(   X = a, Y = b,
!
;   X \= a, Y \= b ).

a_iff_b_4(X, Y) :-
(   X = a, Y = b
;   X \= a, Y \= b ),
!.

a_iff_b_5(X, Y) :-
once(( X = a, Y = b
; X \= a, Y \= b )).
``````

CLICK HERE to find out more related problems solutions.

Scroll to Top