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)"。 谓词表达式由
FunctionVariableExpression
或ConstantExpression
作为谓词,表达式列表作为参数。第二种是将一个表达式应用于另一个表达式,例如 "(\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(succ
和 zero
)组合在一起以获得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演算。