3.7 量词范围歧义

当我们给一个句子的形式化表示 个量词时,会发生什么?

  1. >>> v2 = """
  2. ... bruce => b
  3. ... elspeth => e
  4. ... julia => j
  5. ... matthew => m
  6. ... person => {b, e, j, m}
  7. ... admire => {(j, b), (b, b), (m, e), (e, m)}
  8. ... """
  9. >>> val2 = nltk.Valuation.fromstring(v2)

admire 关系可以使用(28)所示的映射图进行可视化。

  1. >>> dom2 = val2.domain
  2. >>> m2 = nltk.Model(dom2, val2)
  3. >>> g2 = nltk.Assignment(dom2)
  4. >>> fmla4 = read_expr('(person(x) -> exists y.(person(y) & admire(x, y)))')
  5. >>> m2.satisfiers(fmla4, 'x', g2)
  6. {'e', 'b', 'm', 'j'}

这表明fmla4包含域中每一个个体。相反,思考下面的公式fmla5;没有满足y的值。

  1. >>> fmla5 = read_expr('(person(y) & all x.(person(x) -> admire(x, y)))')
  2. >>> m2.satisfiers(fmla5, 'y', g2)
  3. set()

也就是说,没有大家都钦佩的人。看看另一个开放的公式fmla6,我们可以验证有一个人,即 Bruce,它被 Julia 和 Bruce 都钦佩。

  1. >>> fmla6 = read_expr('(person(y) & all x.((x = bruce | x = julia) -> admire(x, y)))')
  2. >>> m2.satisfiers(fmla6, 'y', g2)
  3. {'b'}

注意

轮到你来:基于m2设计一个新的模型,使(27a)在你的模型中为假;同样的,设计一个新的模型使(27b)为真。