据我所知,合取的优先级高于析取。
我们有以下知识库:
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 运算符由可扩展谓词 op(+Precedence, +Type, :Name)
定义。在哪里 Precedence
是 0 到 1200 之间的整数,Type
指定关联性和 Name
给出实际的运算符。
下表显示了一些预定义的运算符:
1100 xfy ;, |
1000 xfy ,
对于歇斯底里的葡萄干,更小
Precedence
的整数值表示运算符绑定(bind) 更紧 (即,它具有 更高的 优先级)。所以析取运算符的优先级是下 比联合运算符之一,因为它的值
Precedence
更高。
关于prolog - 序言中的合取与析取优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29060684/