prolog - 序言中的合取与析取优先级

标签 prolog

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

我们有以下知识库:

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/

相关文章:

python - python中的逻辑编程

prolog - Prolog 中的命令行参数向量?

prolog - 我自己父亲的侄子在序言中

variables - 如何在 Prolog 中一致地用变量替换原子?

prolog - PROLOG 事实是双边的吗?

list - 将列表元素的连续重复项打包到子列表中

prolog - SWI Prolog Clpfd 库——具体化

prolog - Prolog语言中的逻辑

clojure - core.logic lvars 上的算术和 clojure 函数

prolog - Prolog计数的更深入说明