序言中的合取与析取优先级
Conjunction vs Disjunction precedence in 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.
所以现在我想知道谁对谁错。
有人可以解释一下吗?
**我在执行查询时实际上得到了结果。
我认为问题主要是由于过度使用 "precedence" 这个词造成的误解。
Prolog 运算符由可扩展谓词 op(+Precedence, +Type, :Name)
定义,其中 Precedence
是 0 到 1200 之间的整数,Type
指定关联性,Name
给出实际运算符.
这个table显示了一些预定义的运算符:
1100 xfy ;, |
1000 xfy ,
对于歇斯底里的葡萄干,更小整数值 Precedence
意味着运算符绑定 更紧密(即,它具有 更高 的优先级)。
所以析取运算符的优先级比合取运算符的优先级低,因为它的值Precedence
更高。
据我所知,合取比取取优先。
我们有以下知识库:
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.
所以现在我想知道谁对谁错。 有人可以解释一下吗?
**我在执行查询时实际上得到了结果。
我认为问题主要是由于过度使用 "precedence" 这个词造成的误解。
Prolog 运算符由可扩展谓词 op(+Precedence, +Type, :Name)
定义,其中 Precedence
是 0 到 1200 之间的整数,Type
指定关联性,Name
给出实际运算符.
这个table显示了一些预定义的运算符:
1100 xfy ;, |
1000 xfy ,
对于歇斯底里的葡萄干,更小整数值 Precedence
意味着运算符绑定 更紧密(即,它具有 更高 的优先级)。
所以析取运算符的优先级比合取运算符的优先级低,因为它的值Precedence
更高。