4.2 λ演算
在3中,我们指出数学集合符号对于制定我们想从文档中选择的词的属性 P 很有用。我们用(31)说明这个,它是“所有 w 的集合,其中 w 是 V(词汇表)的元素且 w 有属性 P”的表示。
>>> read_expr = nltk.sem.Expression.fromstring
>>> expr = read_expr(r'\x.(walk(x) & chew_gum(x))')
>>> expr
<LambdaExpression \x.(walk(x) & chew_gum(x))>
>>> expr.free()
set()
>>> print(read_expr(r'\x.(walk(x) & chew_gum(y))'))
\x.(walk(x) & chew_gum(y))
我们对绑定表达式中的变量的结果有一个特殊的名字:λ-抽象。当你第一次遇到λ-抽象时,很难对它们的意思得到一个直观的感觉。(33b)的一对英语表示是“是一个 x,其中 x 步行且 x 嚼口香糖”或“具有步行和嚼口香糖的属性。”通常认为λ-抽象可以很好的表示动词短语(或无主语从句),尤其是当它作为参数出现在它自己的右侧时。如(34a)和它的翻译(34b)中的演示。
(walk(x) & chew_gum(x))[gerald/x]
虽然我们迄今只考虑了λ-抽象的主体是一个某种类型 t 的开放公式,这不是必要的限制;主体可以是任何符合语法的表达式。下面是一个有两个λ的例子。
>>> print(read_expr(r'\x.\y.(dog(x) & own(y, x))(cyril)').simplify())
\y.(dog(cyril) & own(y,cyril))
>>> print(read_expr(r'\x y.(dog(x) & own(y, x))(cyril, angus)').simplify()) ![[1]](/projects/nlp-py-2e-zh/Images/ab3d4c917ad3461f18759719a288afa5.jpg)
(dog(cyril) & own(angus,cyril))
我们所有的λ-抽象到目前为止只涉及熟悉的一阶变量:x
、y
等——类型 e 的变量。但假设我们要处理一个抽象,例如\x.walk(x)
作为另一个λ-抽象的参数?我们不妨试试这个:
\y.y(angus)(\x.walk(x))
当β-约减在一个应用f(a)
中实施时,我们检查是否有自由变量在a
同时也作为f
的子术语中绑定的变量出现。假设在上面讨论的例子中,x
是a
中的自由变量,f
包括子术语exists x.P(x)
。在这种情况下,我们产生一个exists x.P(x)
的字母变体,也就是说,exists z1.P(z1)
,然后再进行约减。这种重新标记由logic
中的β-约减代码自动进行,可以在下面的例子中看到的结果。
>>> expr3 = read_expr('\P.(exists x.P(x))(\y.see(y, x))')
>>> print(expr3)
(\P.exists x.P(x))(\y.see(y,x))
>>> print(expr3.simplify())
exists z1.see(z1,x)
注意
当你在下面的章节运行这些例子时,你可能会发现返回的逻辑表达式的变量名不同;例如你可能在前面的公式的z1
的位置看到z14
。这种标签的变化是无害的——事实上,它仅仅是一个字母变体的例子。
在此附注之后,让我们回到英语句子的逻辑形式建立的任务。