【问题标题】:Conjunction vs Disjunction precedence in prolog序言中的合取与析取优先级
【发布时间】:2015-03-15 12:39:28
【问题描述】:

据我所知,合取的优先级高于析取。

我们有以下知识库:

a(1).
a(2,3).
a(3,2).
a(4,5,3).
b.
b(1,2).
b(3).
c.

我们的目标是:

?- a(X,Y);b(Z),c,fail,d.

所以问题来了: 我的老师说目标分为 4 个子目标,通过连词连接:

(a(X,Y);b(Z)),
c,
fail,
d.

并且执行此查询时我不应该得到任何结果。 但是连词的优先级更高,对吧? 目标不应该分成两个子目标(不是四个),通过析取连接:

a(X,Y);
b(Z),c,fail,d.

所以现在我想知道谁是对的,谁是错的。 谁能解释一下?

**当我执行查询时,我实际上得到了结果。

【问题讨论】:

  • 文档明确指出, 的优先级高于;。你的解释是正确的,你的测试证实了这一点。
  • 非常感谢您的确认!

标签: prolog


【解决方案1】:

我认为问题主要是由于过度使用“优先”一词造成的误解。

Prolog 运算符由可扩展谓词 op(+Precedence, +Type, :Name) 定义,其中 Precedence 是 0 到 1200 之间的整数,Type 指定关联性,Name 给出实际运算符。

此表显示了一些预定义的运算符:

1100    xfy ;, |
1000    xfy ,

对于歇斯底里的葡萄干,Precedence较小整数值意味着运算符绑定更紧密(即,它具有更高优先级)。

所以析取运算符的优先级低于合取运算符的优先级,因为它的Precedence的值更高。

【讨论】:

    猜你喜欢
    • 2018-08-18
    • 1970-01-01
    • 1970-01-01
    • 2011-06-25
    • 1970-01-01
    • 2015-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多