我只是偶然在定义;/2中SWI Prolog的手册的规定:
The `or' predicate is defined as:
Goal1 ; _Goal2 :- Goal1.
_Goal1 ; Goal2 :- Goal2.
Run Code Online (Sandbox Code Playgroud)
这是否意味着;/2行为完全像我们编写自己的包含两个规则的辅助谓词一样?我记得这;/2是一个不纯的结构(但我可能将它与if-then-else混合在一起)但这个定义是纯粹的(虽然是元逻辑的).
语义;/2在第7.8.6段的ISO标准中定义,但这是在操纵当前状态,选择点等方面完成的.
SWI手册中的定义是否等同于ISO定义?如果不是,你知道他们不同的例子吗?
\n\n这是否意味着 ;/2 的行为就像我们编写自己的由两个规则组成的辅助谓词一样?
\n
不会。术语到正文的转换会产生影响。
\n但首先,它在7.8.6(;)/2 (析取)和 7.8.8(if-then-else)\xe2\x80\x94中都有定义,正如 7.8.6 中第一句话所暗示的那样。周围的圆括号见7.1.6.6中的注释。;
( G_0 ; H_0 )因此,第一个问题是,如果您在程序中看到,如何确定适用哪个子条款。这不取决于调用时存在的实例化(;)/2,而是取决于术语到正文转换期间的实例化(7.6.2)。
?- G_0 = ( true -> X = si ), ( G_0 ; X = nisi ).\n G_0 = (true->si=si), X = si\n; G_0 = (true->nisi=si), X = nisi.\n\n?- G_0 = ( true -> X = si ), call( ( G_0 ; X = nisi ) ).\n G_0 = (true->si=si), X = si.\nRun Code Online (Sandbox Code Playgroud)\n在第一个查询中,术语到正文的转换在析取中替换G_0为call(G_0)and 因此
( call( ( true -> X = si ) ) ; X = nisi ) )\nRun Code Online (Sandbox Code Playgroud)\n将被执行。
\n在第二个查询中,有两次术语到正文的转换,一次用于整个查询,一次用于显式查询call/1,但两者都保留所有内容不变,因此
call( ( true -> X = si ; X = nisi ) )\nRun Code Online (Sandbox Code Playgroud)\n将被执行,并且 else 情况被忽略。
\n由于术语到正文的转换而导致的进一步差异是由于畸形正文导致的剪切和错误。
\n