|
我们的方法遵循1和2 r-1之间的二进制枚举,对于这些二进制数中的每一个,它生成一个di-ertial规则;特别是,如果二进制数上的位置j包含一个0,那么pk-2ji被放入相应的规则中,其他w iseutlanpk-1ji使用d。对于前面的例子,在我们的方法中,规则(r)是用上面所示的连接(1)、(2)和(3)来评估的。逻辑程序设计的理论与实践13是一个半朴素的(输入:r,)。...,RL。输出:Q,...,Qm,P,...,Pn)beginfor i:=1到m do//计算非递归谓词(1)qi=EVAL(qi,R,...,Rl,Q,...,Qm);对于i:=1到n,请开始//初始化递归谓词(2)pk-2i=EVAL(pi,R,...,Rl,Q,..,Qm);(3)pk-1i=pk-2i;结束;repeatfor i:=1到n做begin(4)pki=EVALDIFF(pi,pk-2,..,pk-2n,pk-1,....pk-1 n,R,...,Rl,Q,...,Qm);(5)pki=pki-pk-2i-pk-1i;结束;对于i:=1至n,开始(6)pk-2i=pk-2ipk-1i=pki;结束;直到pki=i 1≤i≤n;对于i:=1至n,开始(8)pi=pk-2i;结束。图3.算法di-ertial半天真地认为这种方法产生更多的辅助规则W.R.T.(Balbin和Ramamohanarao 19 87;扎尼奥洛等人。1997)但是,在避免执行同一组冗余连接的同时,它允许处理较小的关系。在处理大量数据时,这可能是一个很好的优势,因为管理几个小连接比执行几个大连接需要更少的资源。它为输入程序P的每个组件PCC执行,并假定输入DLPArules已经被转换为SQL语句。这里,comp onent PCdepe nds关于谓词r,...,rn在以前的组件中解决并具有q,..,qmas非递归谓词或事实和p,...,pnas递归预测。函数EVAL(qi,R,..,Rl,Q,..,Qm)执行具有qias头的非递归规则的计算如下:它运行与具有qias头的规则相对应的每个SQL查询;函数EVALDIFF(pi,pk-2,..,pk-2 n,pk-1,..,pk-1 n,R,..,Rl,Q,..,Qm)实现了对半朴素方法的优化;它计算谓词piat当前迭代k的新值,从直到迭代k-2的计算值和在前一个迭代k-1中获得的新值开始。更详细地说,将考虑每个具有pias头的重复规则对应的SQL语句。EVALDIFF的最终结果存储在table(R)PKI中。显然,不能证明EVALDIFF不重新计算在以前的迭代中得到的任何一个metruth va lue s a lready。结果,在计算EVAL差值后,pkimustbe从这些值中清除;这正是算法的指令(5)所做的。说明(6)和(7)在每次迭代中重复使用相同的关系式(pki,pk-1i,pk-2i)。最后,值得指出的是,为了清楚地说明,给出了算法的最后一个for(说明14 G.Terracina,N.Leone,V.Lio,C.Panetta(8));实际上,在实际实现中,我们所表示的pk-2ii正是表pi。值得指出的是,计算的基本步骤是对底层数据执行标准d SQL查询。事实上,DLVDBB实现的主要目标之一是将单个(非递归)SQL语句与程序的每个规则(递归或NOT)相关联,而无需主存数据结构对计算的支持。这使得DLVDBB可以最小化由有限的mainmemory维度引起的“内存不足”问题。
|