【问题标题】:how to represent OR function in prolog如何在prolog中表示OR函数
【发布时间】:2016-02-28 05:33:36
【问题描述】:

我刚刚弄清楚如何运行 gprolog,prolog 的新问题让我很困惑。问题是指prolog中的二叉搜索树,假设

      8      
    /  \
   3   10  
  / \
 1   6

这里有两种类型的事实,当 X 是 Y 的左叶时 left(X,Y) 和当 X 是 Y 的右叶时 right(X,Y),所以我可以说 left(3,8)和左(1,3)和右(10,8)作为我的事实。当 X 在事实方面高于 Y 时,是否执行上述规则(X,Y)?所以我在想的是,当 Y 是 X 的左叶或 Y 是 X 的右叶时,X 在 Y 之上。

我尝试了规则

  above(X,Y) :- left(Y,X); right(Y,X).

当我在 gprolog 中运行上面的查询 (3,1) 时。它问我真的吗?当我按下回车并返回是时,当我按下“;”它返回 no,因为系统一直在搜索第二个目标“right(1,3)”。 我只是在徘徊,无论我按回车还是分号,有没有可能返回yes?

【问题讨论】:

    标签: prolog logic logical-operators


    【解决方案1】:

    如果我理解正确,你的代码(相关部分)是

    left(1,3).
    above(X,Y) :- left(Y,X); right(Y,X).
    

    您的查询是:

    ?-above(3,1).
    

    查询首先返回 true,因为您的目标已达到。然后它会询问您是否要寻找其他结果(分号),您告诉它继续寻找其他方式来证明您的目标,它会回答没有其他办法(因此是“不”)。

    您是否在问是否有办法更改 gprolog 的顶级行为,以便它对第二个问题回答“是”?

    理论上,可以重新实现您自己的 Prolog 编译器并使其在表示“不”时输出“是”,但为什么要这样做呢?除此之外,不,你不能改变它。

    【讨论】:

    • 是的,您理解正确。我想这样做的原因是,如果 prolog 能够识别出其中一个目标是真实的,那么它会变得更加智能。因为当我尝试更进一步的规则时,比如以上(X,Y):X 是 Y 的祖先,我仍然需要考虑继续搜索还是不提问。这是我的计算,但不是序言计算。我被认为是“;” in 子句意味着如果其中一个目标匹配,无论它是否继续搜索,它都会返回 yes。有意义吗?
    • @user1234567 我认为这不会使 prolog 更智能。但是,尽情享受新编译器的编程吧!
    猜你喜欢
    • 2012-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多