8 练习

  1. ☼ 将下列句子翻译成命题逻辑,并用Expression.fromstring()验证结果。提供显示你的翻译中命题变量如何对应英语表达的一个要点。

    1. If Angus sings, it is not the case that Bertie sulks.
    2. Cyril runs and barks.
    3. It will snow if it doesn’t rain.
    4. It’s not the case that Irene will be happy if Olive or Tofu comes.
    5. Pat didn’t cough or sneeze.
    6. If you don’t come if I call, I won’t come if you call.
  2. ☼ 翻译下面的句子为一阶逻辑的谓词参数公式。

    1. Angus likes Cyril and Irene hates Cyril.
    2. Tofu is taller than Bertie.
    3. Bruce loves himself and Pat does too.
    4. Cyril saw Bertie, but Angus didn’t.
    5. Cyril is a fourlegged friend.
    6. Tofu and Olive are near each other.
  3. ☼ 翻译下列句子为成一阶逻辑的量化公式。

    1. Angus likes someone and someone likes Julia.
    2. Angus loves a dog who loves him.
    3. Nobody smiles at Pat.
    4. Somebody coughs and sneezes.
    5. Nobody coughed or sneezed.
    6. Bruce loves somebody other than Bruce.
    7. Nobody other than Matthew loves somebody Pat.
    8. Cyril likes everyone except for Irene.
    9. Exactly one person is asleep.
  4. ☼ 翻译下列动词短语,使用λ-抽象和一阶逻辑的量化公式。

    1. feed Cyril and give a capuccino to Angus
    2. be given ‘War and Peace’ by Pat
    3. be loved by everyone
    4. be loved or detested by everyone
    5. be loved by everyone and detested by no-one
  5. ☼ 思考下面的语句:

    1. >>> read_expr = nltk.sem.Expression.fromstring
    2. >>> e2 = read_expr('pat')
    3. >>> e3 = nltk.sem.ApplicationExpression(e1, e2)
    4. >>> print(e3.simplify())
    5. exists y.love(pat, y)

    显然这里缺少了什么东西,即e1值的声明。为了ApplicationExpression(e1, e2)被β-转换为exists y.love(pat, y)e1必须是一个以pat为参数的λ-抽象。你的任务是构建这样的一个抽象,将它绑定到e1,使上面的语句都是满足(上到字母方差)。此外,提供一个e3.simplify()的非正式的英文翻译。

    现在根据e3.simplify()的进一步情况(如下所示)继续做同样的任务。

    1. >>> print(e3.simplify())
    2. exists y.(love(pat,y) | love(y,pat))
    1. >>> print(e3.simplify())
    2. exists y.(love(pat,y) | love(y,pat))
    1. >>> print(e3.simplify())
    2. walk(fido)
  6. ☼ 如前面的练习中那样,找到一个λ-抽象e1,产生与下面显示的等效的结果。

    1. >>> e2 = read_expr('chase')
    2. >>> e3 = nltk.sem.ApplicationExpression(e1, e2)
    3. >>> print(e3.simplify())
    4. \x.all y.(dog(y) -> chase(x,pat))
    1. >>> e2 = read_expr('chase')
    2. >>> e3 = nltk.sem.ApplicationExpression(e1, e2)
    3. >>> print(e3.simplify())
    4. \x.exists y.(dog(y) & chase(pat,x))
    1. >>> e2 = read_expr('give')
    2. >>> e3 = nltk.sem.ApplicationExpression(e1, e2)
    3. >>> print(e3.simplify())
    4. \x0 x1.exists y.(present(y) & give(x1,y,x0))
  7. ☼ 如前面的练习中那样,找到一个λ-抽象e1,产生与下面显示的等效的结果。

    1. >>> e2 = read_expr('bark')
    2. >>> e3 = nltk.sem.ApplicationExpression(e1, e2)
    3. >>> print(e3.simplify())
    4. exists y.(dog(x) & bark(x))
    1. >>> e2 = read_expr('bark')
    2. >>> e3 = nltk.sem.ApplicationExpression(e1, e2)
    3. >>> print(e3.simplify())
    4. bark(fido)
    1. >>> e2 = read_expr('\\P. all x. (dog(x) -> P(x))')
    2. >>> e3 = nltk.sem.ApplicationExpression(e1, e2)
    3. >>> print(e3.simplify())
    4. all x.(dog(x) -> bark(x))
  8. ◑ 开发一种方法,翻译英语句子为带有二元广义量词的公式。在此方法中,给定广义量词Q,量化公式的形式为Q(A, B),其中AB是〈e, t〉类型的表达式。那么,例如all(A, B)为真当且仅当A表示的是B所表示的一个子集。

  9. ◑ 扩展前面练习中的方法,使量词如 most 和 exactly three 的真值条件可以在模型中计算。

  10. ◑ 修改sem.evaluate代码,使它能提供一个有用的错误消息,如果一个表达式不在模型的估值函数的域中。

  11. ★ 从儿童读物中选择三个或四个连续的句子。一个例子是nltk.corpus.gutenberg中的故事集:bryant-stories.txtburgess-busterbrown.txtedgeworth-parents.txt。开发一个语法,能将你的句子翻译成一阶逻辑,建立一个模型,使它能检查这些翻译为真或为假。

  12. ★ 实施前面的练习,但使用 DRT 作为意思表示。

  13. (Warren & Pereira, 1982)为出发点,开发一种技术,转换一个自然语言查询为一种可以更加有效的在模型中评估的形式。例如,给定一个(P(x) & Q(x))形式的查询,将它转换为(Q(x) & P(x)),如果Q的范围比P小。

关于本文档…

针对 NLTK 3.0 作出更新。本章来自于 Natural Language Processing with PythonSteven Bird, Ewan KleinEdward Loper,Copyright © 2014 作者所有。本章依据 Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 United States License [http://creativecommons.org/licenses/by-nc-nd/3.0/us/] 条款,与 自然语言工具包 [http://nltk.org/] 3.0 版一起发行。

本文档构建于星期三 2015 年 7 月 1 日 12:30:05 AEST