如何解决单位分辨率?

时间:2011-06-07 14:59:05

标签: prolog logic

如何在代码方面表达单位分辨率?例如:

A1
-(A1 & A2 & A3 ... & An)

其中 - 不是,和&是运算符。

答案应该是:

-(A2 & ... & An)

如何以prolog(或scala或其他语言)编写它?

在我看来,它应该是某种类似的功能:

def unitResolution(sentence1, sentence2, ... sentence_n) : result

任何帮助表示感谢。

2 个答案:

答案 0 :(得分:2)

最近发生了类似的问题。我提出的方式有点不同。 让我们假设我们有一个Prolog程序。而不是做后退(这是 是输入分辨率)我们想做前向转换(单位分辨率)。

我还没有完全实现它。但是可以尝试以下方法。一般 反向链接规则如下:

p :- q1, q2, q3, .., qn. /* backward */

现在是一个正向链接规则,它使第一个目标的单位分辨率, 只需切换p和q1的位置即可。因此它看起来如下:

q1 :- p, q2, .., qn. /* forward */

然后,您可以利用Prolog谓词索引来搜索匹配子句 resoluton步骤。让我们先看一下单位r的分辨率步骤 正常后向链规则的情况。假设单位r与q1统一。所以 新条款将是:

p' :- q2', q3', ..., qn'. /* backward */

叛教者表示应用了mgu。现在我们想要我们的算法 在前向表示法中产生新规则。这将是:

q2' :- p',  q3', ..., qn'. /* forward */

或者在Prolog中,假设运算符(,)/ 2是xfy:

% resolution_step(+Unit,+TrickyClause,-TrickyClause or Unit)  
resolution_step(U,(U :- H, G, B),(G :- H, B)).  
resolution_step(U,(U :- H, G),(G :- H)).  
resolution_step(U,(U :- H),H).  

在这里,您可以看到如何迭代使用它。我使用谓词议程/ 1来持有单位。而Prolog数据库则包含棘手的条款,也包括新创建的条款。所以发挥作用的谓词必须被宣布为动态。

iterate :-  
  agenda(U),  
  clause(U,B),  
  resolution_step(U,(U:-B),C),  
  (C=(P :- Q) -> assertz((P:-Q)); assertz(agenda(C))).

现在只要有变化就必须进行迭代,并避免创建重复项。或者避免变体或假设。如果棘手的条款中没有更多的delta,或者议程中没有更多的delta,我们可以停止我们的前向搜索。当然,如果找到某个目标,我们也可以停止向前搜索。

但是现在你看到了这个单一分辨率步骤的问题。中间结果不仅是新单位,而且是新的非单位条款。所以在实践中我猜一个人不会实现单个单位分辨率步骤,而是一个被称为超分辨率的东西。即解析具有多个单元的子句,以便创建新单元。

超分辨率将简化迭代的管理。不需要存储中间非单位子句,并且可以更容易地检测到delta。还可以基于先前的增量来计算新的增量。避免对前向规则进行一些冗余的重新评估。但在超分辨率下,我们放弃了棘手条款的索引优势。因此,我仍然在等待一个有趣的提议,以获得适合Prolog代表前向条款的超分辨率。

最好的问候

编辑10.04.2012:
与此同时,我找到了一种超分辨率的方法。它基于转换条款:

P :- A

进入一个条款:

delta(X,P) :- A_new(X)

通过子句扩展。 Delta应该在P中计算新单元X到达时的分辨率结果。我已经做了几个成功的实验(*)(* *),但索引还没有实现。我有一个基于将X上的某些条件移到规则头部的索引的概念,但还没有时间来实现它。

(*) 8皇后通过单位决议
https://plus.google.com/u/0/b/103259555581227445618/103259555581227445618/posts/2q6nd6VbgZJ

(* *) Earley Chart Parser通过单位决议
https://plus.google.com/u/0/b/103259555581227445618/103259555581227445618/posts/4tFbxLbknYe

答案 1 :(得分:2)

这个想法是使用Prolog块指令来触发单位分辨率。 Howe& Sn有一篇非常好的文章“SAT上的珍珠和Prolog中的SMT解决方案”。 King对此技术以及源代码:http://www.soi.city.ac.uk/~jacob/solver/。 我们在Prolog编写的ProB工具的约束求解器中使用了类似的技术(如果您真的感兴趣,可以在这里找到最近的论文:http://www.stups.uni-duesseldorf.de/publications_detail.php?id=325)。