使用NLTK简化逻辑表达式

2024-05-28 20:19:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我对使用自然语言工具包(NLTK)有疑问。我正在尝试制作一个应用程序,以便将自然语言问题转换为逻辑表示,并将查询转换为数据库。在

在下面使用simplify()方法后得到的结果逻辑打包并得到以下表达式:

exists z2.(owner(fido, z2) & (z0 = z2))

但我需要简化如下:

^{pr2}$

有没有别的方法可以按我的意思减刑?在


Tags: 方法数据库应用程序工具包表达式exists逻辑simplify
1条回答
网友
1楼 · 发布于 2024-05-28 20:19:21

在NLTK中,simplify()执行beta缩减(according to the book),这不是您需要的。当你运用某些策略时,你所要求的只有在定理证明者的情况下才是可行的。在这种情况下,你要么需要知道你希望得到什么,要么你知道什么样的公理可以用来得到这样的结果。在

NLTK中的定理证明器是Prover9,它提供了检查蕴涵关系的工具。基本上,您只能检查是否存在从表达式列表(前提)到目标表达式的有限步骤的证明。例如,在您的案例中,结果是:

============================== PROOF =================================

%      Comments from original proof     
% Proof 1 at 0.00 (+ 0.00) seconds.
% Length of proof is 8.
% Level of proof is 4.
% Maximum clause weight is 4.
% Given clauses 0.

1 (exists x (owner(fido,x) & y = x)) # label(non_clause).  [assumption].
2 owner(fido,x) # label(non_clause) # label(goal).  [goal].
3 owner(fido,f1(x)).  [clausify(1)].
4 x = f1(x).  [clausify(1)].
5 f1(x) = x.  [copy(4),flip(a)].
6 -owner(fido,c1).  [deny(2)].
7 owner(fido,x).  [back_rewrite(3),rewrite([5(2)])].
8 $F.  [resolve(7,a,6,a)].

============================== end of proof ==========================

在NLTK python中:

^{pr2}$

更新

如果您坚持使用python中可用的工具,并且希望用正则表达式手动检查这个特定的模式。您可能可以使用正则表达式执行类似的操作(我不赞成,但让我们试试我那讨厌的策略):

def my_nasty_tactic(exp):
    parameter = re.findall(r'exists ([^.]*)\..*', exp)
    if len(parameter) == 1:
        parameter = parameter[0]
        substitution = re.findall(r'&[ ]*\([ ]*([^ ]+)[ ]*=[ ]*'+parameter+r'[ ]*\)', exp)
        if len(substitution) == 1:
             substitution = substitution[0]
             exp_abs = re.sub(r'exists(?= [^.]*\..*)', "\ ", exp)
             exp_abs = re.sub(r'&[ ]*\([ ]*' + substitution + '[ ]*=[ ]*'+parameter+r'[ ]*\)', '', exp_abs)
             return read_expr('(%s)(%s)' % (exp_abs, substitution)).simplify()

然后你可以这样使用它:

my_nasty_tactic('exists z2.(owner(fido, z2) & (z0 = z2))')
# <ApplicationExpression owner(fido,z0)>

相关问题 更多 >

    热门问题