使用Prolog时,有时需要人为的终止回溯,此时会用到谓词cut,使用符号!来表示。
data(one).
data(two).
data(three).
cut_test_a(X) :- data(X).
cut_test_a('last clause').
cut_test_b(X) :- data(X), !.
cut_test_b('last clause').
cut_test_c(X,Y) :- data(X), !, data(Y).
cut_test_c('last clause').
来测试一下
1- cut_test_a(X), write(X), nl, fail. one two three last clause false. 2- cut_test_b(X), write(X), nl, fail. one false. 3- cut_test_c(X,Y), write(X-Y), nl, fail. one-one one-two one-three false.
此外,可以用not谓词判断条件是否成立
not(X) :- call(X), !, fail. not(X)
下面两种方式是等效的:
have(apple).
eat():-
write('yummy...').
eat_fruit_a(X):-
have(X),
!,
eat().
eat_fruit_b(X):- not(can_not_eat(X)),eat().
can_not_eat(X):-
not(have(X)).
eat_fruit_c(X):- can_eat(X),eat().
can_eat(X):- have(X).
can_eat(X):- fail.
1- eat_fruit_a(apple). yummy... true. 2- eat_fruit_a(pear). false. 3- eat_fruit_b(apple). yummy... true. 4- eat_fruit_b(pear). false. 5- eat_fruit_c(apple). yummy... true . 6- eat_fruit_c(pear). false.