0

刚开始学习Prolog,不知道如何得到涉及“all tr​​ue”的结果,例如:

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。但是preAction4 的 是 (3,2) 并且没有action(3)。这不是我想要的。

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

4

2 回答 2

0

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

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

最后一行表示您要排除X是 的预操作ZZ不是操作(action(3)为假)的情况。

于 2015-02-27T22:28:19.513 回答
0

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

takeAction(X) :- 
   action(X), 
   forall(preAction(X, Y), action(Y)).
于 2015-02-27T23:22:55.587 回答