Prolog 如何解决单位分辨率问题?

Prolog 如何解决单位分辨率问题?,prolog,logic,Prolog,Logic,如何用代码表示单元分辨率?例如: A1 -(A1 & A2 & A3 ... & An) 其中-不是,而&是和运算符 答案应该是: -(A2 & ... & An) 我该如何编写它,比如用prolog(或scala,或其他语言)编写 在我看来,它应该是一种功能,它可以做这样的事情: def unitResolution(sentence1, sentence2, ... sentence_n) : result 感谢您的帮助。最近我遇到了类似的问题。

如何用代码表示单元分辨率?例如:

A1
-(A1 & A2 & A3 ... & An)
其中-不是,而&是运算符

答案应该是:

-(A2 & ... & An)
我该如何编写它,比如用prolog(或scala,或其他语言)编写

在我看来,它应该是一种功能,它可以做这样的事情:

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

感谢您的帮助。

最近我遇到了类似的问题。我的姿势有点不同。 假设我们有一个Prolog程序。而不是做反向链接(这 是输入分辨率)我们想做正向链接(单位分辨率)

我还没有完全执行它。但我们可以尝试以下方法。正常人 反向链接规则如下所示:

p :- q1, q2, q3, .., qn. /* backward */
q1 :- p, q2, .., qn. /* forward */
现在是一个正向链接规则,它使单位分辨率与第一个目标一致, 只需切换p和q1的位置。因此,情况如下:

p :- q1, q2, q3, .., qn. /* backward */
q1 :- p, q2, .., qn. /* forward */
然后,您可以使用Prolog谓词索引在中搜索匹配子句 resoluton步骤。让我们先来看看分辨率步骤中的单位r 正常反向链接规则的情况。假设单位r与q1一致。所以 新订的条文是:

p' :- q2', q3', ..., qn'. /* backward */
q2' :- p',  q3', ..., qn'. /* forward */
撇号表示已应用mgu。现在我们希望我们的算法 以正向表示法生成新规则。这将是:

p' :- q2', q3', ..., qn'. /* backward */
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).  
在这里,您可以看到如何迭代地使用它。我使用谓词agenda/1来保存单元。和Prolog数据库来保存复杂的子句,以及新创建的子句。因此起作用的谓词必须声明为动态的

iterate :-  
  agenda(U),  
  clause(U,B),  
  resolution_step(U,(U:-B),C),  
  (C=(P :- Q) -> assertz((P:-Q)); assertz(agenda(C))).
现在,只要有更改,就必须进行迭代,并避免创建重复项。或者避免变体或包含。如果棘手的条款中没有更多的增量,或者议程中没有更多的增量,我们可以停止向前搜索。当然,如果找到某个目标,我们也可以停止向前搜索

但是现在您看到了这个单单元解析步骤的问题。中间结果不仅是新的单位,而且是新的非单位子句。所以在实践中,我想人们不会实现单单位分辨率步骤,而是已经被称为超分辨率的步骤。即使用多个单位解析子句,以便创建新的单位

超分辨率将简化迭代的管理。不需要存储中间非单位子句,而且可以更容易地检测增量。此外,还可以根据以前的增量计算新的增量。避免对远期规则进行一些冗余的重新评估。但在超分辨率中,我们失去了我们复杂子句的索引优势。因此,我仍然在等待一个有趣的建议,即适合于超分辨率的Prolog表示的向前子句

致意

2012年4月10日编辑:
同时,我发现了一种实现超分辨率的方法。它基于转换一个子句:

P :- A
delta(X,P) :- A_new(X)
在条款中:

P :- A
delta(X,P) :- A_new(X)
通过子句扩展的方式。Delta应在P中计算新单位X到达时的分辨率结果。我已经做了两个成功的实验(*)(**),但索引尚未实现。我有一个索引的概念,基于将X上的某些条件移到规则的开头,但还没有时间实现它

(*) 8个皇后通过单位分辨率

(**) 通过单位分辨率的Earley图表解析器

最近我也遇到了类似的问题。我的姿势有点不同。 假设我们有一个Prolog程序。而不是做反向链接(这 是输入分辨率)我们想做正向链接(单位分辨率)

我还没有完全执行它。但我们可以尝试以下方法。正常人 反向链接规则如下所示:

p :- q1, q2, q3, .., qn. /* backward */
q1 :- p, q2, .., qn. /* forward */
现在是一个正向链接规则,它使单位分辨率与第一个目标一致, 只需切换p和q1的位置。因此,情况如下:

p :- q1, q2, q3, .., qn. /* backward */
q1 :- p, q2, .., qn. /* forward */
然后,您可以使用Prolog谓词索引在中搜索匹配子句 resoluton步骤。让我们先来看看分辨率步骤中的单位r 正常反向链接规则的情况。假设单位r与q1一致。所以 新订的条文是:

p' :- q2', q3', ..., qn'. /* backward */
q2' :- p',  q3', ..., qn'. /* forward */
撇号表示已应用mgu。现在我们希望我们的算法 以正向表示法生成新规则。这将是:

p' :- q2', q3', ..., qn'. /* backward */
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).  
在这里,您可以看到如何迭代地使用它。我使用谓词agenda/1来保存单元。和Prolog数据库来保存复杂的子句,以及新创建的子句。因此起作用的谓词必须声明为动态的

iterate :-  
  agenda(U),  
  clause(U,B),  
  resolution_step(U,(U:-B),C),  
  (C=(P :- Q) -> assertz((P:-Q)); assertz(agenda(C))).
现在,只要有更改,就必须进行迭代,并避免创建重复项。或者避免变体或包含。如果棘手的条款中没有更多的增量,或者议程中没有更多的增量,我们可以停止向前搜索。当然,如果找到某个目标,我们也可以停止向前搜索

但是现在您看到了这个单单元解析步骤的问题。中间结果不仅是新的单位,而且是新的非单位子句。所以在实践中,我想人们不会实现单单位分辨率步骤,而是已经被称为超分辨率的步骤。即使用多个单位解析子句,以便创建新的单位

超分辨率将简化迭代的管理。不需要存储中间非单位子句,而且可以更容易地检测增量。此外,还可以根据以前的增量计算新的增量。避免对远期规则进行一些冗余的重新评估。但在超分辨率中,我们失去了我们复杂子句的索引优势。因此,我仍然在等待一个有趣的建议,即适合于超分辨率的Prolog表示的向前子句

致意

2012年4月10日编辑:
同时我有