怎么知道prolog中的所有真实

时间:2015-02-27 17:28:19

标签: prolog negation

刚刚开始学习Prolog,并且无法弄清楚如何获得涉及"所有真实"的结果,例如:

preAction(4, 3).
preAction(4, 2).
preAction(2, 1).

action(4).
action(2).
action(1).

takeAction(X) :-
   action(X),
   preAction(X, Y),
   action(Y).

预期结果为2,因为action(2)action(1)都是真的。 但是当前结果是4和2.但是{4}的preAction是(3,2)并且没有action(3)。这不是我想要的。

如果我试图使用否定,因为4的preAction是可证明的,但仍然无法弄清楚如何去做。你知道怎么做吗?

2 个答案:

答案 0 :(得分:0)

您为使用否定的takeAction/1谓词添加了另一个条件:

takeAction(X) :-
    action(X),
    preAction(X, Y),
    action(Y),
    \+ (preAction(X, Z), \+ action(Z)).

最后一行表示您要排除 XZ的预先行动的案例,但Z不是行动({ {1}}是假的。

答案 1 :(得分:0)

您测试每个preAction(X,Y)都有一个动作(X):

takeAction(X) :- 
   action(X), 
   forall(preAction(X, Y), action(Y)).