Cut and Fail in Prolog

JAN picture JAN · Feb 28, 2013 · Viewed 15.7k times · Source

Consider the following code:

a(X) :- b(X),!,c(X),fail.
a(X) :- d(X).

b(1).
b(4).
c(1).
c(3).

d(4).

The query a(X). produces

1 ?- a(X).
false.

2 ?-

but with this code

a(X) :- b(X),!,c(X).
a(X) :- d(X).

b(1).
b(4).
c(1).
c(3).

d(4).

The query a(X). results in :

1 ?- a(X).
X = 1.

So my question is, why does the fail/1 produces false? it is supposed to force backtracking, right ? then b(1) and c(1). would be checked, I think, so why does it fail?

Answer

CapelliC picture CapelliC · Feb 28, 2013

it fails because fail must fail.

The cut removes alternatives, then forbids values that otherwise would be 'returned' by means of X binding. Try

a(X) :- b(X),c(X),fail.
...

you'll get

?- a(X).
X = 4.