我一直在尝试为数据目录程序的半天真评估实现一种算法,但无法用简单的单词来解释差异。
根据我的理解,天真是一种自下而上的评估技术,所以是半天真的。
在第一次迭代中,两种评估技术都以空集开始。
随着迭代的进行,两者都会进行迭代并生成元组,直到达到新的元组。
所以半天真从规则的头部或身体开始?
path (X,Y):- edge(X,Y).
path (X,Y):- edge(X,Z),path (Z,Y).
有人可以解释在上述计划的每次迭代结束时EDB和IDB如何更新。元组是否存储在每个谓词下。就像边缘的单独列和路径的单独列一样,它们存储为集合。
全球统一与地方统一有什么区别?
答案 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)} | {} |
答案 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
。它只是查询结果的一部分。
全球统一与地方统一有什么区别?
我无法使用这些条款找到任何内容,我无法想象它们的意思。
所以,我的猜测。让我们看看我的标记有多宽。