【问题标题】:Backwards Chaining With Variables带变量的反向链接
【发布时间】:2015-06-08 05:15:09
【问题描述】:

我一直在阅读有关 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). 

为什么原来的结果会循环?其次,这种查询的执行会是什么样子?值何时绑定到这些变量?

【问题讨论】:

  • 在 Datalog 中肯定不会循环。在 Prolog 中,应该确保依赖关系图可以通过深度优先搜索来解决...

标签: prolog logic datalog


【解决方案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/ 绑定在前一个 */)。如您所见,在所有查询中,之前至少绑定了一个参数。

【讨论】:

  • 为什么 X1 会在第二个例子中被绑定而不是第一个?
猜你喜欢
  • 2018-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-06
  • 2020-12-09
  • 1970-01-01
  • 1970-01-01
  • 2016-03-29
相关资源
最近更新 更多