我一直在阅读Prolog / Datalog中的推理,虽然正向链接似乎相当容易掌握,但我有一些问题与任何复杂的例子进行反向链接,这不是简单的命题或用于确定真值或假值。我正在读一篇文章,给出了以下例子:
utf8_bin
假设我们要查询sg(X,X)
sg(X,Y) :- par(X, X1), par(Y,Y1), sg(X1,Y1)
,其中sg(a,W)
是常量,a
是变量。这可以理解为:
给我所有与
W
同代的人。
本文首先声明这些特定规则将导致Prolog / Datalog中的无限循环,但可以通过将第二个规则更改为:
来修复a
为什么原始结果会循环?其次,这种查询的执行会是什么样的?值何时绑定到这些变量?
答案 0 :(得分:1)
这篇文章似乎不是很明确。假设呼叫是“sg(a,W)”。让分析第一种可能性:
sg(X,Y) :- par(X, X1), par(Y,Y1), sg(X1,Y1)
第一个“par”将被查询为“par(X = a,X1)”,其次为“par(Y = W,Y1)”。最后一个查询是完全未绑定的查询,可能是本文试图跳过的内容。
现在,第二种可能性:
sg(X,Y) :- par(X, X1), sg(X1,Y1), par(Y,Y1).
执行为par(X = a,X1),sg(X1 / *在前一个 /,Y1中绑定),par(Y = W,Y1 / 在前一个* /中绑定)。如您所见,在所有查询中,至少有一个参数先前已被绑定。