什么是`lexpr`和`ApplicationExpression` nltk?

Dav*_* Yi -4 python nlp nltk first-order-logic semantics

lexpr究竟是什么意思,以及r'/ F xx的含义是什么?什么是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()
Run Code Online (Sandbox Code Playgroud)

alv*_*vas 6

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

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

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

该类用于表示两种相关类型的逻辑表达式.

第一个是谓词表达式,例如"P(x,y)".谓词表达式由FunctionVariableExpression或组成 ConstantExpression作为谓词和表达式列表作为参数组成.

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

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

逻辑表达式读取器将始终在应用程序表达式中curry参数.因此,"\ x y.see(x,y)(john,mary)"将在内部表示为"((\ x y.(见(x))(y))(john))(mary)".这简化了内部,因为应用程序中始终只有一个参数.

str()方法通常会打印curried形式的应用程序表达式.一个例外是当应用程序表达式实际上是一个谓词表达式时(即底层函数是一个 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)
Run Code Online (Sandbox Code Playgroud)

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