您正在查看一个相当复杂的工具包的一小部分。我尝试从下面的网络上进行一些研究来提供一些背景。或者,如果您愿意,也可以直接跳到“直接答案”部分。我将尝试就您引用的特定部分回答您的问题,但我不是哲学逻辑或自然语言处理方面的专家。我读的越多,我似乎知道的越少,但我已经包含了很多希望有用的参考资料。
工具说明/原理/介绍
您发布的代码是 Python 自然语言工具包 (NLTK) 的逻辑模块的回归测试的子系列。该工具包在此处的一篇相当容易访问的学术论文中进行了描述,似乎由该工具的作者编写。它描述了工具包和编写逻辑模块的动机——简而言之,以帮助自动解释自然语言。
您发布的代码定义了许多逻辑形式(在我链接的论文中提到的 LF)。LF 涵盖一阶谓词逻辑中的语句,结合 lambda 运算符(即一阶lambda 演算)。我不会尝试在这里完全描述一阶谓词逻辑。这里有一个关于lambda 演算的教程。
代码来自howto 页面上的一组回归测试(即工具箱在简单的已知示例测试中正确工作的演示),展示了如何通过使用它来执行简单的算术运算来演示工具箱。它们是通过nltk 工具包中的lambda 演算(维基百科链接)对这种算术方法的精确编码。
前四个是 lambda 演算(教堂编码)中的前四个数字。接下来的四个是算术运算符 - succ
(successor)、plus
(addition)、mult
(multiplication) 和pred
(division),您还没有得到与这些相关的测试,所以目前,您只需要一些 LF,然后是Lambda 演算的一个例子,将其中两个 LF (succ
和zero
) 组合起来得到v1
. 正如您所申请 succ
的那样zero
,结果应该是 1 - 这就是他们在 howto 页面上测试的内容 - 即v1 == one
应该评估True
。
直接回答python位
让我们一一浏览您发布的代码的元素。
lexpr
是生成逻辑表达式的函数 - 它是Expression.fromstring
as的别名lexpr = Expression.fromstring
它需要一个字符串参数。字符串前面的 r 告诉 python 将其解释为原始字符串文字。出于这个问题的目的 - 这意味着我们不必转义\
符号
在字符串中,\
是 lambda 运算符。
F
表示x
lambda 演算中的函数和绑定变量
或点运算符将.
绑定函数与表达式/抽象的主体分开
所以 - 取你在问题中引用的字符串:
r'/F x.x'
它是零的教会编码。Church 编码非常抽象,很难理解。本教程可能会有所帮助-我想我开始明白了...不幸的是,您选择的示例为零,并且据我所知,这是一个定义,而不是您可以推导出的东西。在任何有意义的意义上,它都不能“评估为 0”。 这是我找到的最简单的解释。我无法评论其严谨性/正确性。
Church 数字是一个接受一个参数的过程,而那个参数本身就是另一个也接受一个参数的过程。过程零通过返回一个应用其输入过程零次的过程来表示整数 0
最后,ApplicationExpression
是采用一个表达式并将其应用于另一个表达式,在这种情况下将succ
(succesor) 应用于zero
。这被恰当地称为lambda 演算中的应用程序
编辑:
写完所有这些,然后在 nltk 网站上找到了一本隐藏的书——第 10 章特别适用于这个问题,本节描述了 lambda 演算。