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.