序言中的连词与析取优先级

K.T*_*nov 4 prolog

据我所知,连接比分离具有更高的优先级。

我们有以下知识库:

a(1).
a(2,3).
a(3,2).
a(4,5,3).
b.
b(1,2).
b(3).
c.
Run Code Online (Sandbox Code Playgroud)

我们的目标是:

?- a(X,Y);b(Z),c,fail,d.
Run Code Online (Sandbox Code Playgroud)

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

(a(X,Y);b(Z)),
c,
fail,
d.
Run Code Online (Sandbox Code Playgroud)

并且在执行此查询时我不应该得到任何结果。但是连词有更大的优先级,对吧?目标不应该被分解为两个子目标(而不是四个),通过分离连接:

a(X,Y);
b(Z),c,fail,d.
Run Code Online (Sandbox Code Playgroud)

所以现在我想知道谁对谁错。有人可以解释一下吗?

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

rep*_*eat 5

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

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

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

1100    xfy ;, |
1000    xfy ,
Run Code Online (Sandbox Code Playgroud)

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

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