人工智能中的匹配和统一化

3

尝试实现匹配,这是一种有限的统一形式。

如果我们可以找到出现在公式中的变量的替换,使得两个公式在语法上等效,则尝试匹配这两个公式。

我需要编写一个函数来确定与地面术语对应的常量(例如Brother(George))和与量化公式对应的模式(例如Brother(x))是否匹配。 如果它们匹配,则该函数返回一组称为绑定的替换,将变量映射到术语。 如果两个常量相等,则一个常量与另一个常量匹配。 未绑定的变量(当前没有绑定)与任何公式匹配。 如果变量绑定了一个值,则绑定的变量与常量匹配,如果常量和变量绑定的值相等,则绑定的变量与常量匹配。

示例:

match( Loves(Dog(Fred), Fred)

Loves(x,y))

如果x = Dog(Fred)且y = Fred,则返回true

另一个例子:

match( Loves(Dog(Fred), Fred)

Loves(x,x)

失败


为什么不使用Prolog?它自带统一化功能。 - dpalma
实现为正则表达式?用什么语言?Sed?Perl?Grep?不幸的是,正则表达式有不同的风格。 - Beta
想在Python中实现吗? - user3769499
1个回答

1
MGUs(最一般合一子)的概念似乎在这里很有用。解决方法如下所示。
让我们拥有一个名为mgu的初始空集和另一个空集E。
mgu = {}
G = match(Loves(Dog(Fred),Fred),Loves(x,y))
E = {Loves(Dog(Fred),Fred),Loves(x,y)}


mgu = {Fred|y}             // Replace Fred by y, variables to be replaced first.
G = match(Loves(Dog(y),y),Loves(x,y))
E = {Loves(Dog(y),y),Loves(x,y)}


mgu = {Fred|y,Dog(y)|x}    // Replace Dog(y) by x
G = match(Loves(x,y),Loves(x,y))  
E = {Loves(x,y)}           // E becomes a singleton set here, we stop here.
                           // No more substitutions are possible at this stage.

match()函数在不再进行替换时,如果E变成单例集,则返回True,否则返回False。而mgu可以作为所需的替换集合返回。

G = True
mgu = {Fred|y,Dog(y)|x}

另一个例子可以如下所示。
mgu = {}
G = match(Loves(Dog(Fred),Fred),Loves(x,x))
E = {Loves(Dog(Fred),Fred),Loves(x,x)}


mgu = {Fred|x}             // Replace Fred by x.
G = match(Loves(Dog(x),x),Loves(x,x))
E = {Loves(Dog(x),x),Loves(x,x)}


mgu = {Fred|x,Dog(x)|y}       // Replace Dog(x) by y
G = match(Loves(y,x),Loves(x,x))  
E = {Loves(y,x),Loves(x,x)}   // E does not becomes a singleton set here.
                              // But no more substitutions are 
                              // possible at this stage.

因此,
G = False

你能帮我在Python中解析它们吗?我知道Prolog很容易做到这一点,所以在Python中我需要通过逗号进行分割,但如果有多个逗号怎么办? - user3769499

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接