Considérons le code suivant :
a(X) :- b(X),!,c(X),fail.
a(X) :- d(X).
b(1).
b(4).
c(1).
c(3).
d(4).
La requête a(X).
produit
1 ?- a(X).
false.
2 ?-
mais avec ce code
a(X) :- b(X),!,c(X).
a(X) :- d(X).
b(1).
b(4).
c(1).
c(3).
d(4).
La requête a(X).
résulte en :
1 ?- a(X).
X = 1.
Donc ma question est, pourquoi le fail/1
produit un faux ? il est censé forcer le retour en arrière, non ? alors b(1)
y c(1).
serait vérifié, je pense, alors pourquoi échouer ?