4.2 λ演算

3中,我们指出数学集合符号对于制定我们想从文档中选择的词的属性 P 很有用。我们用(31)说明这个,它是“所有 w 的集合,其中 w 是 V(词汇表)的元素且 w 有属性 P”的表示。

  1. >>> read_expr = nltk.sem.Expression.fromstring
  2. >>> expr = read_expr(r'\x.(walk(x) & chew_gum(x))')
  3. >>> expr
  4. <LambdaExpression \x.(walk(x) & chew_gum(x))>
  5. >>> expr.free()
  6. set()
  7. >>> print(read_expr(r'\x.(walk(x) & chew_gum(y))'))
  8. \x.(walk(x) & chew_gum(y))

我们对绑定表达式中的变量的结果有一个特殊的名字:λ-抽象。当你第一次遇到λ-抽象时,很难对它们的意思得到一个直观的感觉。(33b)的一对英语表示是“是一个 x,其中 x 步行且 x 嚼口香糖”或“具有步行和嚼口香糖的属性。”通常认为λ-抽象可以很好的表示动词短语(或无主语从句),尤其是当它作为参数出现在它自己的右侧时。如(34a)和它的翻译(34b)中的演示。

  1. (walk(x) & chew_gum(x))[gerald/x]

虽然我们迄今只考虑了λ-抽象的主体是一个某种类型 t 的开放公式,这不是必要的限制;主体可以是任何符合语法的表达式。下面是一个有两个λ的例子。

  1. >>> print(read_expr(r'\x.\y.(dog(x) & own(y, x))(cyril)').simplify())
  2. \y.(dog(cyril) & own(y,cyril))
  3. >>> print(read_expr(r'\x y.(dog(x) & own(y, x))(cyril, angus)').simplify()) ![[1]](/projects/nlp-py-2e-zh/Images/ab3d4c917ad3461f18759719a288afa5.jpg)
  4. (dog(cyril) & own(angus,cyril))

我们所有的λ-抽象到目前为止只涉及熟悉的一阶变量:xy等——类型 e 的变量。但假设我们要处理一个抽象,例如\x.walk(x)作为另一个λ-抽象的参数?我们不妨试试这个:

  1. \y.y(angus)(\x.walk(x))

当β-约减在一个应用f(a)中实施时,我们检查是否有自由变量在a同时也作为f的子术语中绑定的变量出现。假设在上面讨论的例子中,xa中的自由变量,f包括子术语exists x.P(x)。在这种情况下,我们产生一个exists x.P(x)的字母变体,也就是说,exists z1.P(z1),然后再进行约减。这种重新标记由logic中的β-约减代码自动进行,可以在下面的例子中看到的结果。

  1. >>> expr3 = read_expr('\P.(exists x.P(x))(\y.see(y, x))')
  2. >>> print(expr3)
  3. (\P.exists x.P(x))(\y.see(y,x))
  4. >>> print(expr3.simplify())
  5. exists z1.see(z1,x)

注意

当你在下面的章节运行这些例子时,你可能会发现返回的逻辑表达式的变量名不同;例如你可能在前面的公式的z1的位置看到z14。这种标签的变化是无害的——事实上,它仅仅是一个字母变体的例子。

在此附注之后,让我们回到英语句子的逻辑形式建立的任务。