析取运算符和定义与等价规则的等效性

时间:2019-02-14 13:47:18

标签: prolog iso-prolog

我只是在SWI Prolog Manual中偶然发现了;/2的定义,其中指出:

The `or' predicate is defined as:

Goal1 ; _Goal2 :- Goal1.
_Goal1 ; Goal2 :- Goal2.

这是否意味着;/2的行为就像我们编写了由两个规则组成的自己的辅助谓词一样?我已经记住;/2是一个不纯净的结构(但是我可能会将其与if-then-else混合使用),但是这个定义是纯正的(尽管是元逻辑的)。

;/2的语义在ISO标准的7.8.6段中定义,但这是根据对当前状态,选择点等的操作完成的。

SWI手册中的定义是否等同于ISO定义?如果没有,您是否知道它们之间有何不同的示例?

2 个答案:

答案 0 :(得分:4)

  

这是否意味着; / 2的行为就好像我们编写了由两个规则组成的自己的辅助谓词一样?

不。术语到正文的转换有所不同。

但是首先,它的(;)/2两者 7.8.6(分词)和7.8.8(if-then-else)中都有定义-是7.8中的第一句话。 6建议。有关;周围的圆括号,请参见7.1.6.6中的注释。

因此,第一个问题是,如果您在程序中看到( G_0 ; H_0 ),如何决定哪个条款适用。这不取决于调用(;)/2时的实例化,而是取决于术语到正文转换(7.6.2)期间的实例化。

?- G_0 = ( true -> X = si ), ( G_0 ; X = nisi ).
   G_0 =  (true->si=si),
   X = si
;  G_0 =  (true->nisi=si),
   X = nisi.

?- G_0 = ( true -> X = si ), call( ( G_0 ; X = nisi ) ).
   G_0 =  (true->si=si),
   X = si.

在第一个查询中,词项到主体的转换在析取词G_0中被call(G_0)取代,因此

( call( ( true -> X = si ) ) ; X = nisi ) )

将被执行。

在第二个查询中,有两次术语到主体的转换,一次是针对整个查询,一次是针对显式call/1,但两者都保持不变,因此

call( ( true -> X = si ; X = nisi ) )

将被执行,其他情况将被忽略。

由于术语到身体的转换而产生的其他差异是由于畸形的身体造成的切割和错误。

答案 1 :(得分:3)

据我所知,定义

p(X) :- G1 ; G2 .

与定义相同

p(X) :- G1 .
p(X) :- G2 .

是的,您正在将此;与有些相关但完全不同的_ -> _ ; _混合在一起。