变量的反向链接



我一直在阅读Prolog/Datalog中的推理,虽然前向链接似乎很容易掌握,但我对任何类型的复杂示例的后向链接都有一些问题,这些示例不仅仅是命题或用于确定真或假值。我正在阅读一篇文章,给出了下面的例子:

sg(X,X)
sg(X,Y) :- par(X, X1), par(Y,Y1), sg(X1,Y1)

假设我们要查询sg(a,W),其中a是常数,W是变量。这可以理解为:

把和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 previous */)方式执行。如您所见,在所有查询中,至少有一个参数先前已被绑定。

相关内容

  • 没有找到相关文章

最新更新