expr究竟是什么意思,以下r'/ F x.x是什么意思?什么是Application Expression?
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()
答案 0 :(得分:6)
请参阅http://goo.gl/zog68k,nltk.sem.logic.Expression
是:
“”“这是所有逻辑表达式”“”
的基本抽象对象
nltk
中实现了许多类型的逻辑表达式。见第1124行,ApplicationExpression
是:
此类用于表示两种相关类型的逻辑表达式。
第一个是谓词表达式,例如“P(x,y)”。谓词表达式由
FunctionVariableExpression
或。ConstantExpression
组成AbstractVariableExpression
作为谓词,表达式列表作为参数。第二个是将一个表达式应用于另一个表达式,例如 “(\ x.dog(X))(菲多)”。
谓词表达式被视为应用程序表达式的原因是 可以替换表达式的变量表达式谓词 使用另一个表达式,例如LambdaExpression,这意味着 应该认为谓词应用于论证。
逻辑表达式读取器将始终在应用程序表达式中使用参数。 因此,“\ x y.see(x,y)(john,mary)”将在内部表示为 “((\ x y。(见(x))(y))(约翰))(玛丽)”。这简化了内部因素 在应用程序中总会有一个参数。
str()方法通常会打印curried的应用程序 表达式。一个例外是应用程序表达式 真的是一个谓词表达式(即底层函数是一个
>>> 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)
)。这意味着上面的例子 将被返回为“(\ x y.see(x,y)(john))(mary)”。
我不是正式逻辑方面的专家,但上面的代码试图声明一个逻辑函数变量x:
{{1}}
有关速成课程,请参阅http://theory.stanford.edu/~arbrad/slides/cs156/lec2-4.pdf以及针对lambda表达式的nltk速成课程,请参阅http://www.cs.utsa.edu/~bylander/cs5233/nltk-intro.pdf
答案 1 :(得分:1)
您正在查看相当复杂的工具包的一小部分。我试着通过以下网络上的一些研究提供一些背景知识。或者,如果您愿意,可以跳到“直接答案”部分。我会尝试回答你引用的具体部分的问题,但我不是哲学逻辑或自然语言处理方面的专家。我读的越多,我似乎就越少知道,但我已经包含了大量有用的参考资料。
您发布的代码是针对python(NLTK)的自然语言工具包的逻辑模块的回归测试的子系列。此工具包在fairly accessible academic paper here中描述,似乎由该工具的作者编写。它描述了工具包的动机和编写逻辑模块 - 简而言之,它有助于自动解释自然语言。
您发布的代码定义了许多逻辑形式(我在链接的论文中引用了LF)。 LF覆盖First order predicate logic中的语句,并结合lambda运算符(即第一顺序lambda calculus)。我不会试图在这里完整地描述一阶谓词逻辑。有lambda calculus here.
的教程代码来自regression tests的一组the howto page(即工具箱在简单的,已知的exmample测试中正确运行的演示),演示如何使用它来演示工具箱{ {3}}。它们是nltk工具包中simple arithmetic operations的精确编码。
前四个是lambda演算中的前四个数字(this approach to arithmetic via lambda calculus (Wikipedia link))。接下来的四个是算术运算符 - succ
(后继),plus
(加法),mult
(乘法)和pred
(除法),你没有得到的测试和这些一起去,所以此刻,你只需要一些LF,然后是Lambda演算的一个例子,结合其中两个LF(succ
和zero
)得到{{1} }。正如您已将应用 v1
添加到succ
,结果应为1 - 这就是他们在howto页面上测试的内容 - 即zero
应评估{ {1}}。
让我们逐一浏览您发布的代码元素。
v1 == one
是生成逻辑EXPRessions的函数 - 它是True
的别名Church Encoding
需要一个字符串参数。字符串前面的r告诉python将其解释为 原始字符串文字 。出于这个问题的目的 - 这意味着我们不必逃避lexpr
符号
在字符串中,Expression.fromstring
是lambda运算符。
\
表示函数,\
是lambda演算中的绑定变量
F
或点运算符将绑定函数与表达式/抽象主体分开
所以 - 在问题中引用你引用的字符串:
x
零lexpr = Expression.fromstring
。教会编码是相当抽象的,很难让你的头脑。这Church Encoding - 我想我已经开始明白了...不幸的是你选择的例子是零,而我可以解决的是,这是一个定义,而不是你可以得到的东西。它无法在任何有意义的意义上“评估为0”。 tutorial might help。我无法对其严谨/正确性发表评论。
教会数字是一个带有一个参数的过程,而该参数本身就是另一个也带有一个参数的过程。过程零表示通过返回将其输入过程应用零次的过程来表示整数0
最后,.
正在使用一个表达式并将应用于另一个表达式,在这种情况下,将r'/F x.x'
(成功者)应用于ApplicationExpression
。这恰恰称为lambda演算中的应用程序
<强> 编辑: 强>
写下所有这些,然后发现隐藏在nltk网站上的This is the simplest explanation I've found - book特别适用于此问题,其中Chapter 10描述了lambda演算。