天真评估和半天真评估有什么区别?

时间:2017-10-31 20:22:18

标签: prolog artificial-intelligence datalog knowledge-management

我一直在尝试为数据目录程序的半天真评估实现一种算法,但无法用简单的单词来解释差异。

根据我的理解,天真是一种自下而上的评估技术,所以是半天真的。

在第一次迭代中,两种评估技术都以空集开始。

随着迭代的进行,两者都会进行迭代并生成元组,直到达到新的元组。

所以半天真从规则的头部或身体开始?

path (X,Y):- edge(X,Y).

path (X,Y):- edge(X,Z),path (Z,Y).

有人可以解释在上述计划的每次迭代结束时EDB和IDB如何更新。元组是否存储在每个谓词下。就像边缘的单独列和路径的单独列一样,它们存储为集合。

全球统一与地方统一有什么区别?

2 个答案:

答案 0 :(得分:3)

Datalog中的naîve和半naîve评估之间的区别在于,当您使用天真的实现进行评估时,您将获取每次迭代的所有初始数据集(存在EDB)和新闻(推断的EDB)。 例如, 如果您有这样的IDB:

reachable(X,Y) :- link(X,Y).
reachable(X,Y) :- link(X,Z), reachable(Z,Y).

这样一组EDB:link = {(a,b), (b,c), (c,c), (c,d)} 执行评估的程序是: 1.首先假设所有IDB关系都是空的。 2.使用EDB和之前的IDB反复评估规则以获得新的IDB。 3.当IDB没有变化时结束。

当您在每个步骤中使用naîve方法时,您将把以下数据作为输入和输出:

 | Iteration |Input for the current iteration I_{i}            | New facts inferred           |
 |-----------|-------------------------------------------------|------------------------------|
 |  1        | {}                                              | {(a,b), (b,c), (c,c), (c,d)} |
 |  2        | {(a,b), (b,c), (c,c), (c,d)}                    | {(a,c),(b,c),(b,d),(c,d)}    |
 |  3        | {(a,b), (b,c), (c,c), (c,d), (a,c), (b,d)}      | {(a,d)}                      |
 |  4        | {(a,b), (b,c), (c,c), (c,d), (a,c), (b,d),(a,d)}| {}                           |

在第4次迭代中,您将停止,因为已达到 fixpoint ,并且不能推断出新的事实。 但是,在半天真的方法中,您应用优化,而不是在每次迭代时使用所有派生的事实作为规则的输入,可以仅向每次迭代发送在先前迭代中已经学习的元组,以避免使元组陷入困境。

 | Iteration |Input for the current iteration I_{i}  | New facts inferred           |
 |-----------|---------------------------------------|------------------------------|
 |  1        | {}                                    | {(a,b), (b,c), (c,c), (c,d)} |
 |  2        | {(a,b), (b,c), (c,c), (c,d)}          | {(a,c),(b,c),(b,d),(c,d)}    |
 |  3        | {(a,c), (b,d)}                        | {(a,d)}                      |
 |  4        | {(a,d)}                               | {}                           |

来源:Datalog and Recursive Query Processing

答案 1 :(得分:2)

我要告诉你关于Prolog的事。我不知道它是否同样适用于Datalog,所以如果我错了,别人就必须纠正我。

  

所以半天真从规则的头部或身体开始?

根据this handout,您可以继续使用基于变量或基于元组的算法,但在这两种情况下,您都可以从身体开始,只有在成功之后才添加表示头部的元组:< / p>

  

基于变量:考虑对正文变量的所有可能分配。如果赋值使body成为true,则将head的元组添加到结果中。

     

基于元组的:考虑来自非加密关系子目标的元组的所有赋值。如果赋值使body成为true,则将head的元组添加到结果中。

这与我对Prolog和后向链接的了解非常吻合:你想要结束头部,所以你必须首先证明身体。

你似乎也在问半天真是否有关于你是从头部还是从身体开始的话。基于我今天所回顾的内容,我认为半天真是对天真算法的一种扭曲,而不是一种全新的东西。它就像天真的方法的表格版本;如果有多种天真的方法,你将拥有同样多的半天真方法。如果只有一个天真的人,那么只会有一个半天真的人。

  

有人可以解释在上述计划的每次迭代结束时EDB和IDB如何更新。

这很简单:他们没有。 EDB是数据库中的一组事实。 IDB是数据库中的一组规则。查询只是一个查询,它不会修改数据库。查询返回的元组是另一回事。

  

元组是否存储在每个谓词下?

在EDB中代表事实的元组已作为事实存储在EDB中。从IDB中的规则派生的元组被计算并成为结果集的一部分并且不被存储。在这两种情况下,商店都不会因执行查询而更新。

如果我们在这里谈论Prolog,那么会有一堆递归调用继续进行。最外面的电话可能会说path(a, z);在该呼叫内部可能类似于edge(a, b), path(b, z),这将召唤一个呼叫edge(b, c), path(c, z)。在Prolog术语中,每次进入另一个调用时,你都会得到一组新的变量,一些是绑定的,一些是未绑定的。在您的数据记录世界中,在我看来,edge(a,b)edge(b,c)已经作为您的EDB中的元组存在。在查询期间,它们将成为表示结果的元组堆栈中元组的一部分。 IDB包含一个名为path/2的规则,一旦您满足递归调用,您将在结果中找到一些新的元组,如path(a,z)。但是,结果元组不是存储在EDB中的事实(仅包含edge/2之类的事实),也不会替换规则path/2。它只是查询结果的一部分。

  

全球统一与地方统一有什么区别?

我无法使用这些条款找到任何内容,我无法想象它们的意思。

所以,我的猜测。让我们看看我的标记有多宽。