3.7 量词范围歧义
当我们给一个句子的形式化表示 两 个量词时,会发生什么?
>>> v2 = """
... bruce => b
... elspeth => e
... julia => j
... matthew => m
... person => {b, e, j, m}
... admire => {(j, b), (b, b), (m, e), (e, m)}
... """
>>> val2 = nltk.Valuation.fromstring(v2)
admire 关系可以使用(28)所示的映射图进行可视化。
>>> dom2 = val2.domain
>>> m2 = nltk.Model(dom2, val2)
>>> g2 = nltk.Assignment(dom2)
>>> fmla4 = read_expr('(person(x) -> exists y.(person(y) & admire(x, y)))')
>>> m2.satisfiers(fmla4, 'x', g2)
{'e', 'b', 'm', 'j'}
这表明fmla4
包含域中每一个个体。相反,思考下面的公式fmla5
;没有满足y
的值。
>>> fmla5 = read_expr('(person(y) & all x.(person(x) -> admire(x, y)))')
>>> m2.satisfiers(fmla5, 'y', g2)
set()
也就是说,没有大家都钦佩的人。看看另一个开放的公式fmla6
,我们可以验证有一个人,即 Bruce,它被 Julia 和 Bruce 都钦佩。
>>> fmla6 = read_expr('(person(y) & all x.((x = bruce | x = julia) -> admire(x, y)))')
>>> m2.satisfiers(fmla6, 'y', g2)
{'b'}
注意