• 3.3 一阶逻辑语言总结

    3.3 一阶逻辑语言总结

    我们将借此机会重新表述前面的命题逻辑的语法规则,并添加量词的形式化规则;所有这些一起组成一阶逻辑的句法。此外,我们会明确相关表达式的类型。我们将采取约定:〈e<sup>n</sup>, t〉一种由 n 个类型为 e 的参数组成产生一个类型为 t 的表达式的谓词的类型。在这种情况下,我们说 n 是谓词的元数。

    1. If P is a predicate of type 〈e<sup>n</sup>, t〉, and α<sub>1</sub>, … α<sub>n</sub> are terms of type e, then P(α<sub>1</sub>, … α<sub>n</sub>) is of type t.
    2. If α and β are both of type e, then (α = β) and (α != β) are of type t.
    3. If φ is of type t, then so is -φ.
    4. If φ and ψ are of type t, then so are (φ & ψ), (φ | ψ), (φ -&gt; ψ) and (φ &lt;-&gt; ψ).
    5. If φ is of type t, and x is a variable of type e, then exists x.φ and all x.φ are of type t.

    3.1总结了logic模块的新的逻辑常量,以及Expression模块的两个方法。

    表 3.1:

    一阶逻辑所需的新的逻辑关系和运算符总结,以及Expression类的两个有用的方法。

    1. >>> dom = {'b', 'o', 'c'}

    我们使用工具函数Valuation.fromstring()将 symbol =&gt; value 形式的字符串序列转换成一个Valuation对象。

    1. >>> v = """
    2. ... bertie => b
    3. ... olive => o
    4. ... cyril => c
    5. ... boy => {b}
    6. ... girl => {o}
    7. ... dog => {c}
    8. ... walk => {o, c}
    9. ... see => {(b, o), (c, b), (o, c)}
    10. ... """
    11. >>> val = nltk.Valuation.fromstring(v)
    12. >>> print(val)
    13. {'bertie': 'b',
    14. 'boy': {('b',)},
    15. 'cyril': 'c',
    16. 'dog': {('c',)},
    17. 'girl': {('o',)},
    18. 'olive': 'o',
    19. 'see': {('o', 'c'), ('c', 'b'), ('b', 'o')},
    20. 'walk': {('c',), ('o',)}}

    根据这一估值,see的值是一个元组的集合,包含 Bertie 看到 Olive、Cyril 看到 Bertie 和 Olive 看到 Cyril。

    注意

    轮到你来:模仿1.2绘制一个图,描述域m和相应的每个一元谓词的集合。

    你可能已经注意到,我们的一元谓词(即boygirldog)也是以单个元组的集合而不是个体的集合出现的。这使我们能够方便的统一处理任何元数的关系。一个形式为 P(τ<sub>1</sub>, … τ<sub>n</sub>)的谓词,其中 P 是 n 元的,为真的条件是对应于(τ<sub>1</sub>, … τ<sub>n</sub>) 的值的元组属于 P 的值的元组的集合。

    1. >>> ('o', 'c') in val['see']
    2. True
    3. >>> ('b',) in val['boy']
    4. True