【问题标题】:how to know all true in prolog如何在序言中知道一切都是真的
【发布时间】:2015-02-27 17:28:19
【问题描述】:

刚开始学习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。但是 4 的 preAction 是 (3,2) 并且没有 action(3)。这不是我想要的。

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

【问题讨论】:

  • @IMolly:1 也可能是一个解决方案。
  • preAction "of" 4 不是 (3,2)。它是32。而action 不是21,而是2 1
  • 那么,如果我需要获取所有 preActions 所采取的操作的结果,该怎么做呢?

标签: prolog negation


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 谢谢!虽然要求我们不要使用任何“高级函数”,但对纠正我的逻辑思维还是很有帮助的。
    • @lMolly 这是一个很奇怪的要求,不要在Prolog中使用“高级函数”。无论哪种方式,请记住,forall(preAction(X, Y), action(Y)) 根据定义表现为\+ (preAction(X, Y), \+ action(Y)),这基本上是您获得的另一个解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-02
    相关资源
    最近更新 更多