什么是 'lexpr' 和 'ApplicationExpression' nltk



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

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()

请参阅 http://goo.gl/zog68k,nltk.sem.logic.Expression是:

"

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

nltk 中实现的逻辑表达式有很多类型。请参阅第 1124 行,ApplicationExpression为:

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

第一个是谓词表达式,例如"P(x,y)"。 谓词表达式由FunctionVariableExpressionConstantExpression作为谓词,表达式列表作为参数。

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

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

逻辑表达式读取器将始终在应用程序表达式中引用参数。 因此,"\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

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

工具说明/原理/简介

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

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

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

前四个

是lambda演算(教会编码)中的前四个数字。 接下来的四个是算术运算符 - succ(后继)、plus(加法)、mult(乘法)和pred(除法),您还没有获得与这些相关的测试,因此目前,您只需要一些 LF,然后是 Lambda 演算的一个例子,将其中两个 LF(succzero )组合在一起以获得v1。 当您将succ应用于zero时,结果应该是一个 - 这就是他们在 HowTo 页面上测试的内容 - 即 v1 == one应该评估True

直接回答 python 位

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

lexpr是生成逻辑 EXPRessions 的函数 - 它是Expression.fromstring的别名,作为lexpr = Expression.fromstring

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

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

F表示函数,x lambda 演算中的绑定变量

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

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

r'/F x.x'

它是零的教会编码。 教会编码非常抽象,很难让你头脑清醒。 本教程可能会有所帮助 - 我想我开始明白了... 不幸的是,你选择的例子是零,从我能得出的,这是一个定义,而不是你可以推导出来的东西。 它不能在任何有意义的意义上"评估为 0"。 这是我找到的最简单的解释。 我无法评论它的严谨性/正确性。

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

最后,ApplicationExpression采用一个表达式并将其应用于另一个表达式,在本例中,将succ(成功者)应用于zero。 这在lambda演算中被称为应用程序

编辑:

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

相关内容

  • 没有找到相关文章

最新更新