6

我知道这只是编程问题的一部分,但目前,我正在做一些逻辑编程。我仍然无法正确理解的一件事是一阶逻辑中的统一。

我阅读了维基百科的文章,或多或少地清楚目的是搜索一个统一两个句子的术语......本文中也有示例,但我只是不明白为什么这应该有用。任何人都可以用现实世界的对象而不是 A、B、C 等举个例子吗?我希望这能帮助我理解。谢谢

4

3 回答 3

5

感谢您提供这些详细的答案。现在我真的明白了。但是,我想在这里写下我在 Stuart Russell 和 Peter Norvig 的“人工智能:一种现代方法”一书中找到的一个例子,以防有人再次寻找同样的问题。我认为这个答案使用了一种非常实用的方法:

提升的推理规则需要找到使不同逻辑表达式看起来相同的替换。这个过程称为统一,是所有一阶推理算法的关键组成部分。UNIFY 算法采用两个句子,如果存在一个,则为它们返回一个统一符。

让我们看一些 UNIFY 应该如何表现的例子。假设我们有一个查询 Knows(John, x):John 认识谁?通过查找知识库中与 Knows(John, x) 统一的所有句子,可以找到该查询的一些答案。以下是可能在知识库中的四个不同句子的统一结果:

UNIFY(Knows(John, x), Knows(John, Jane)) = {x/Jane}
UNIFY(Knows(John, x), Knows(y, Bill)) = {x/Bill, y/John}
UNIFY(Knows(John, x), Knows(y, Mother(y))) = {y/John, x/Mother(John)}
UNIFY(Knows(John, x), Knows(x, Elisabeth)) = fail

最后一个统一失败了,因为 x 不能同时取值 John 和 Elizabeth。

于 2010-06-03T19:44:11.727 回答
3

如果您正在查看使用统一且有用的实际示例,请查看计算语言学中使用的基于统一的语法,例如 HPSG 和 LFG。从表面上看,这看起来像是另一种统一的味道,但它们实际上是一样的。

基于统一的语法可以被认为是一种 CFG(上下文无关语法),其中产生式通过统一进行扩展。CGF 中的每个术语都有一个 AVM(属性值矩阵),它是特征和值的有向无环图。这里的想法有点类似于编译器中使用的属性语法。

想象一下这个玩具语法:

 S -> NP VP  
 NP -> Kim  
 NP -> The cats  
 VP -> V NP  
 V -> see  
 V -> sees

我们在协议中有一些轻微的过度生成:

*猫看到金 [S [NP 猫] [VP [V 看到] [NP 金]]]

为了解决这个问题,我们可以改进 CFG 以包含协议的概念:

 S -> NP_sg VP_sg  
 S -> NP_sg VP_pl  
 NP_sg -> Kim  
 NP_pl -> The cats  
 VP_sg -> V_sg NP_sg  
 VP_sg -> V_sg NP_pl  
 V_sg -> sees  
 V_pl -> see  
 VP_pl -> V_pl NP_pl  
 VP_pl -> V_pl NP_sg

在这里,我们将拒绝以前的过度生成。但这会很快导致组合探索。但是,我们可以使用 AVM 来扩充每个术语,并在解析时将它们统一在一起:

 S -> NP VP , C = A unified with B.  
 NP -> kim /[ AGR sg ]. We mark Kim as being singular   
 NP -> The cats / [ AGR pl ]  
 VP[ AGR #1 ] -> V [ AGR #1 ] NP 

#1-notation 是reentrancies,这意味着这个特征的值必须相同,实际上它们在统一后将指向图中的同一个节点,如果它成功。在实践中,我们说动词短语的一致性特征与短语中动词的一致性相同。

 V -> See / [ AGR pl ]  
 V -> Sees / [ AGR sg ]

使用我们的增强玩具语法“Kim see the cats”被拒绝,因为 NP 和 VP 不会统一,其 AGR 功能具有不同的值。当我们解析时,我们将 AVM 统一在一起,因此在表达能力上获得了很大的提升,使语法工程师更容易编写语法。通常,广泛覆盖的 UBG 具有大约一百条规则,而可能不存在的等效 CFG 具有统一的 CFG 是图灵完备的,将具有数千个或更多的规则。

有关详细信息,请参阅 HPSGLFG

于 2010-06-03T10:07:21.097 回答
1

AFAIK,逻辑编程几乎都是统一的。你向解释器提供一个声明,解释器试图将它与它知道是“真实”的东西统一起来,即在它的数据库中的东西。

例如

cat(tom) :- true.

断言汤姆是一只猫。

然后就可以查询了

?- cat(X).

序言将返回

 X = tom

Prolog 查看其数据库并尝试将您提供的语句 ( cat(X)) 与它已经“知道”的事实统一起来。在这种情况下,它会找到cat(tom)并因此告诉您X=tom.

于 2010-06-03T09:31:00.197 回答