Prolog 变量反向链接

Prolog 变量反向链接,prolog,logic,datalog,Prolog,Logic,Datalog,我一直在阅读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中出现无限循环,但可以

我一直在阅读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)
 sg(X,Y) :- par(X, X1),  sg(X1,Y1), par(Y,Y1). 
第一个“par”将被查询为“par(X=a,X1)”,下一个为“par(Y=W,Y1)”。最后一个查询是一个完全未绑定的查询,可能是本文试图跳过的

现在,第二种可能性是:

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

作为par(X=a,X1)、sg(X1/*上一个绑定/,Y1)、par(Y=W,Y1/上一个绑定*/)执行。如您所见,在所有查询中,至少有一个参数以前已绑定。

在数据日志中肯定不会循环。在Prolog中,您应该确保依赖关系图可以通过深度优先搜索解决……为什么在第二个示例中X1会被绑定,而不是第一个?