-4

lexpr 到底是什么意思,下面的 r'/F xx 是什么意思?还有什么是应用程序表达式?

from nltk.sem.logic import *
lexpr = Expression.fromstring

zero = lexpr(r'\F x.x')
one = lexpr(r'\F x.F(x)')
two = lexpr(r'\F x.F(F(x))')
three = lexpr(r'\F x.F(F(F(x)))')
four = lexpr(r'\F x.F(F(F(F(x))))')
succ = lexpr(r'\N F x.F(N(F,x))')
plus = lexpr(r'\M N F x.M(F,N(F,x))')
mult = lexpr(r'\M N F.M(N(F))')
pred = lexpr(r'\N F x.(N(\G H.H(G(F)))(\u.x)(\u.u))')
v1 = ApplicationExpression(succ, zero).simplify()
4

2 回答 2

6

http://goo.gl/zog68knltk.sem.logic.Expression是:

"""这是所有逻辑表达式的基本抽象对象"""

中实现了许多类型的逻辑表达式nltk。见第 1124 行,ApplicationExpression即:

此类用于表示两种相关类型的逻辑表达式。

第一个是谓词表达式,例如“P(x,y)”。谓词表达式由作为谓词的FunctionVariableExpressionor ConstantExpression和作为参数的表达式列表组成。

第二种是将一个表达式应用于另一个表达式,例如“(\x.dog(x))(fido)”。

谓词表达式被视为应用程序表达式的原因是表达式的变量表达式谓词可以替换为另一个表达式,例如 LambdaExpression,这意味着应该将谓词视为应用于参数。

逻辑表达式阅读器将始终在应用程序表达式中使用 curry 参数。因此,“\x y.see(x,y)(john,mary)”将在内部表示为“((\x y.(see(x))(y))(john))(mary)”。这简化了内部结构,因为应用程序中总是只有一个参数。

str() 方法通常会打印应用程序表达式的柯里化形式。一个例外是当应用程序表达式实际上是一个谓词表达式时(即,底层函数是一个 AbstractVariableExpression)。这意味着上面的示例将返回为“(\x y.see(x,y)(john))(mary)”。

我不是形式逻辑方面的专家,但您上面的代码试图声明一个逻辑函数变量 x:

>>> from nltk.sem.logic import *
>>> lexpr = Expression.fromstring
>>> zero = lexpr(r'\F x.x')
>>> succ = lexpr(r'\N F x.F(N(F,x))')
>>> v1 = ApplicationExpression(succ, zero).simplify()
>>> v1
<LambdaExpression \F x.F(x)>
>>> print v1
\F x.F(x)

有关速成课程,请参阅http://theory.stanford.edu/~arbrad/slides/cs156/lec2-4.pdf和有关 lambda 表达式的 nltk 速成课程,请参阅http://www.cs.utsa.edu/ ~bylander/cs5233/nltk-intro.pdf

于 2015-01-17T08:41:22.660 回答
1

您正在查看一个相当复杂的工具包的一小部分。我尝试从下面的网络上进行一些研究来提供一些背景。或者,如果您愿意,也可以直接跳到“直接答案”部分。我将尝试就您引用的特定部分回答您的问题,但我不是哲学逻辑或自然语言处理方面的专家。我读的越多,我似乎知道的越少,但我已经包含了很多希望有用的参考资料。

工具说明/原理/介绍

您发布的代码是 Python 自然语言工具包 (NLTK) 的逻辑模块的回归测试的子系列。该工具包在此处的一篇相当容易访问的学术论文中进行了描述,似乎由该工具的作者编写。它描述了工具包和编写逻辑模块的动机——简而言之,以帮助自动解释自然语言。

您发布的代码定义了许多逻辑形式(在我链接的论文中提到的 LF)。LF 涵盖一阶谓词逻辑中的语句,结合 lambda 运算符(即一阶lambda 演算)。我不会尝试在这里完全描述一阶谓词逻辑。这里有一个关于lambda 演算的教程。

代码来自howto 页面上的一组回归测试(即工具箱在简单的已知示例测试中正确工作的演示),展示了如何通过使用它来执行简单的算术运算来演示工具箱。它们是通过nltk 工具包中的lambda 演算(维基百科链接)对这种算术方法的精确编码。

前四个是 lambda 演算(教堂编码)中的前四个数字。接下来的四个是算术运算符 - succ(successor)、plus(addition)、mult(multiplication) 和pred(division),您还没有得到与这些相关的测试,所以目前,您只需要一些 LF,然后是Lambda 演算的一个例子,将其中两个 LF (succzero) 组合起来得到v1. 正如您所申请 succ的那样zero,结果应该是 1 - 这就是他们在 howto 页面上测试的内容 - 即v1 == one应该评估True

直接回答python位

让我们一一浏览您发布的代码的元素。

lexpr是生成逻辑表达式的函数 - 它是Expression.fromstringas的别名lexpr = Expression.fromstring

它需要一个字符串参数。字符串前面的 r 告诉 python 将其解释为原始字符串文字。出于这个问题的目的 - 这意味着我们不必转义\符号

在字符串中,\是 lambda 运算符。

F表示xlambda 演算中的函数和绑定变量

或点运算符将.绑定函数与表达式/抽象的主体分开

所以 - 取你在问题中引用的字符串:

r'/F x.x'

它是零的教会编码。Church 编码非常抽象,很难理解。本教程可能会有所帮助-我想我开始明白了...不幸的是,您选择的示例为零,并且据我所知,这是一个定义,而不是您可以推导出的东西。在任何有意义的意义上,它都不能“评估为 0”。 这是我找到的最简单的解释。我无法评论其严谨性/正确性。

Church 数字是一个接受一个参数的过程,而那个参数本身就是另一个也接受一个参数的过程。过程零通过返回一个应用其输入过程零次的过程来表示整数 0

最后,ApplicationExpression是采用一个表达式并将其应用于另一个表达式,在这种情况下将succ(succesor) 应用于zero。这被恰当地称为lambda 演算中的应用程序

编辑:

写完所有这些,然后在 nltk 网站上找到了一本隐藏的书——第 10 章特别适用于这个问题,本节描述了 lambda 演算。

于 2015-01-23T00:31:09.020 回答