65.9K
CodeProject 正在变化。 阅读更多。
Home

逻辑推理方法的设计

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.79/5 (9投票s)

2013年3月29日

CPOL

8分钟阅读

viewsIcon

14899

关于设计逻辑推理系统的文章

引言

构建一个谓词演算(PC)解析器的兴趣一直让我感到困惑。自 90 年代初第一次接触到演绎推理的简洁性以来,我一直想创建一个规则解析器,将其命名为我的 PC 解析器。在这里,我将描述这一步骤的“为什么”和“如何”,正如我们在尝试构建这种机制时,将英语句子、逻辑和计算机推理视为一体一样。

要理解逻辑推理和英语语言的关系,我们需要了解英语的语法规则;以及如何在上面构建谓词演算。逻辑推理,特别是谓词演算(命题演算)计算形式的演绎逻辑,是这样建立的:所有谓词(句子)构成推理的基础和知识闭包的基石;我们通过遍历这些使用 PC 规则集解析过的谓词句子来测试我们的结论(一个测试句子)。

一个简单的英语句子可能是:Tom loves Lucy,其中 Tom 是主语,“love”是动作,Lucy 是宾语。在 C# 中,我们使用正则表达式中的模式匹配来解析每个英语句子。

抽象的尝试

下面我随意写了一些出格的模式匹配方案,以一种简单的方式将我们的搜索限制在一组非常简单的语法句子中。

一个简单的句子模式可能是

((a|the) )?(\w)+ (am|is|was|were|are|had been|have been) ((a|the) )?(\w)+

例如:

                A dog is a friend

                Dogs are friends

                Doug is a friend

                Doug is furious

介词句式模式具有主语和宾语的关系,宾语后跟介词,如“after, around, from, …”。

((a|the) )?(\w)+ (am|is|was|were|are|had been|have been) (\w)+ (after|in|from|around|at|about) ((a|the) )?(\w)+

其中“be”后面的词是副词、进行时态的动词或描述动作已完成的过去时态,与“be”一起构成描述主语的副词。

例如:

                Doug is furious about the situation

因此,我们可以定义一个带介词的动词句式为

                Tom is furious about love, money, and power.

                Tom is both a romantic lover and a greedy merchant

                Chris was angry and Lucy lost her patience

                He can only choose either to hate or to ignore it.

以及它的模式

                ((a|the|an) )?(\w+) (is|was|am|are|were|had been|have been|has been) (\w+) (after|in|from|around|at|about) (a |the )?(\w+, )+(\w+)(,)? (and|or) (\w+)

时间线

一个句子应该有一个隐含的时间线或一个详细的显式时间线。

所以我们可以说

Tom has been very anxious in the past. (S1)

或者我们可以说

                Tom has been very anxious in the past two weeks.

隐含的时间线以某种模糊的方式涵盖了以下时间术语:

Long ago, past, recently, now, later, tomorrow, in a few days, in the future.

所以 (S1) 包括时间段 Long ago -> now。在没有其他谓词条件的情况下,我们可以得出结论:

                Tom still feels anxious right now.

逻辑句子解析器的设计要求

一个合理的逻辑句子解析器的设计要求至少要能够提取出英语语法学科的一个子集在语法上的逻辑结构。在学科中,我们指的是我们不想随意发言,而是遵循一套表达规则来书写我们的推理。因此,形成一系列逻辑谓词句子作为我们结论的闭包,我们称之为命题。命题必须为真,并且可以直接导向我们的假设,或者说我们的测试字符串,以便谓词测试为真。所以我们的工作是最终测试提供的测试句子,它是否应该返回布尔值 True 或 False,或者不确定(Null 值),因为命题不足以得出结论。

因此,我们首先将我们的命题列在一个名为 PropositionList 的列表中 -> 类型的 List<string>。这个列表是一个类,它使用 List<string> 来存储句子。首先,我们收集所有句子来形成我们的小宇宙列表。然后我们解析所有句子,首先是确保它们符合我们规则集的语法形式,通过使用正则表达式对句子进行模式匹配。这也定义了句子类型,可能是在 PC(谓词演算)中定义的简单(主语 动词 宾语)、复合(连词)或条件(if and iff)等。

为了简单起见,我们希望从我们逻辑构造中最合理、最简单的学科(语法规则)开始。通过示例,我们希望以以下最简单、最优雅的方式来说明:

  1. Tom is late           (简单副词谓词)
  2. Tom shoots a gun (简单动作谓词)
  3. Chris loves Lucy but Lucy hates Chris (这是一个 AND 运算符的简单复合)
  4. Chris loves gun and rose (这可以分解成两个简单的谓词)
  5. Chris knows neither Tom nor Nancy (另一个简单的复合)

这些简单的规则将使我们能够与一组我们接受为我们语言的有限语法句子进行交互。并且我们需要维护一个包含所有时态的动作词(或动词)的字典。在实际的 PC 实现中,我们应该有一个完整的字典作为参考。

所以我们定义以下(最简单的)

                Sentence = SimpleSentence | CompoundSentence | ConditionalSentence

                SimpleSentence = Subject Action Object

                CompoundSentence = SimpleSentence and|or SimpleSentence

                ConditionalSentence = IF SimpleSentence THEN SimpleSentence

然后我们在一个循环中解析我们的句子,该循环还会生成一个术语(符号)表查找。并且我们有一个谓词列表,类似于以下内容:

                T loves L

                L loves T | L loves C

                If not (A loves B) then A hates B

                L hates C

在符号查找中,我们已经累积了 T = Tom, L = Lucy, and C = Chris。并且我们提供了测试句子:L loves T?而我们漂亮的谓词解析器将解析所有这些,所以结论是真的。另一方面,如果我们测试:L Hates T;我们将在第二句话处有一个未解决的条件,所以结论将是假的。

另一种视角:图形解释

实现这个简单的逻辑语法解析器(或 PC – 谓词逻辑推理)的另一种方法是,我们来看一下节点的图形表示和解释,通过遍历来推导或类似地解析结论。

使用主语和宾语作为节点:包括名词和描述条件的副词;以及使用 BE(is, am, are, 等)和动作动词作为指针,我们可以将我们的闭合宇宙描述为一个标记图。

以下是我们的少量命题(谓词)列表:

  1. Tom loves Lucy
  2. Chris loves Lucy but Lucy hates Chris
  3. Lucy loves either Tom or Chris (Lucy 必须爱其中一个,我们确定!)

所以我们要解析的结论是 Lucy loves Tom。首先,我们需要快速构建我们的图形表示,通过解析节点……结果如下:

我们的术语词典

Key       Value

Tom       T

Lucy       L

Chris      C

我们需要绘制最小的无重叠图集。

所以在这个图中,直线蓝色指针表示两个节点之间带有动作标签的直接连接。曲线分隔符表示带有动作标签的 OR 条件。到目前为止,我们需要在我们的词典中添加更多细节——我们可能需要一个同义词词典来告诉我们哪些词是相似或相反的,这样我们就可以知道“love”和“hate”是相反的。我们的结论测试句子:Does Lucy Love Tom?我们用黄色绘制测试指针……

所以我们从节点‘L’开始,我们看到‘L’可以“Love”Tom 或“Love”Chris;并且‘L’“Hate”Chris。但是黄色指针是合法的吗?从这里我们测试所有连接的边(或弧)来看它们是否合法。这应该是一个 O(n) 算法,因为我们每个边只测试一次。但如果我们测试 Lucy Hates Tom——用红色曲线箭头表示,我们就不应该解析所有边都是合法的。因为从这里我们将得出以下矛盾:L (hate)-> T(e1); T (love)-> L(e2); L 要么 (love)->T 要么 (love)->C(e3); (但 e1 使 L(hate)->C(e4) 无效)。所以这个解析对测试句子得出了错误的结论。并且我们还通过同义词词典和否定(PC)知道 Lucy Hates Tom 为假意味着 Lucy Loves Tom 为真。所以两个解析都得出了相同的结论。

使用图形表示来解决逻辑推理可能参考这种方法,可以称为语义网络——因为它通过知识记录来解决。

比较两种方法论

在比较解决简单逻辑推理的两种方法时,我们正在比较解析器项目中的对象编译,或者语义网络的深度、范围和简洁性。两者都是 PC(谓词演算)的竞争方法。两种方法论都很重要。在常规范围内,未来我们绝对需要一个完整的英语语言解析器——连接字典、同义词词典和翻译器将产生全球性的影响。在此基础上,我们探索语义网络的简洁性,以便可以将极其复杂的推理以编译的方式构建和评估,从而动态推动人工智能推理模拟和人工智能咨询方案。当我们构建人工智能的知识和计算块时,我们将注意力集中在其应用上——这些最终都在语义网络的领域。

© . All rights reserved.