向后链接变量
Backwards Chaining With Variables
我一直在阅读 Prolog/Datalog 中的推理,虽然前向链接似乎很容易掌握,但我对任何类型的复杂示例的后向链接有一些问题,这些示例不仅仅是命题或用于确定真值或假值。我正在阅读一篇文章,给出了以下示例:
sg(X,X)
sg(X,Y) :- par(X, X1), par(Y,Y1), sg(X1,Y1)
假设我们要查询 sg(a,W)
,其中 a
是常量,W
是变量。这可以理解为:
Give me all those who are in the same generation as a
.
文章首先指出这些特定规则将导致 Prolog/Datalog 中的无限循环,但可以通过将第二条规则更改为来解决:
sg(X,Y) :- par(X, X1), sg(X1,Y1), par(Y,Y1).
为什么原来会出现循环?其次,这种查询的执行是什么样的?值何时绑定到这些变量?
这篇文章似乎不是很解释。假设调用是 "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 /* bound in previous /, Y1), par(Y=W,Y1/ bound in以前的 */)。如您所见,在所有查询中,至少有一个参数已预先绑定。
我一直在阅读 Prolog/Datalog 中的推理,虽然前向链接似乎很容易掌握,但我对任何类型的复杂示例的后向链接有一些问题,这些示例不仅仅是命题或用于确定真值或假值。我正在阅读一篇文章,给出了以下示例:
sg(X,X)
sg(X,Y) :- par(X, X1), par(Y,Y1), sg(X1,Y1)
假设我们要查询 sg(a,W)
,其中 a
是常量,W
是变量。这可以理解为:
Give me all those who are in the same generation as
a
.
文章首先指出这些特定规则将导致 Prolog/Datalog 中的无限循环,但可以通过将第二条规则更改为来解决:
sg(X,Y) :- par(X, X1), sg(X1,Y1), par(Y,Y1).
为什么原来会出现循环?其次,这种查询的执行是什么样的?值何时绑定到这些变量?
这篇文章似乎不是很解释。假设调用是 "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 /* bound in previous /, Y1), par(Y=W,Y1/ bound in以前的 */)。如您所见,在所有查询中,至少有一个参数已预先绑定。