所以我有一个递归谓词,如下所示:
top_predicate(A, B, C):-
finish(A, B, C).
top_predicate(A, B, C):-
sub_predicate_1(B,E),
E > 10,
predicate(D, E, F).
top_predicate(A,B,C):-
% some other predicate
predicate(D,E,F).
sub_predicate_1有很多选择。我希望Prolog只考虑从sub_predicate_1获得的第一个答案,但仍然可以在它背后回溯。这是因为如果sub_predicate_1的第一个答案小于或等于10,那么所有这些答案都将是。第一个答案总是最好的答案。
我尝试在这里添加剪辑:
predicate(A, B, C):-
sub_predicate_1(B,E),
E > 10,!,
predicate(D, E, F).
但是,如果在一些递归过程中,E> 10失败,程序回溯到top_predicate的第三个定义,然后失败,然后整个程序失败。
我尝试在sub_predicate_1中添加一个剪切(同时在内部拉动E> 10条件),但它产生相同的效果。我可能要求的是什么?
原谅高度抽象的问题,我想知道它为什么会起作用或者不起作用,而不是有人为我解决它。如果您需要更多信息,请询问。