想象你是一位密室寻宝者,手中握着一张写满线索的藏宝图。这张图上写着:“所有房间里都有一个宝箱”,以及“某个房间里藏着钥匙”。仅凭这两句话,你该如何一步步找到钥匙、开启宝箱?你不能直接闯进每个房间翻箱倒柜——那太鲁莽了。你需要一套推理规则,像侦探破案一样从泛泛的陈述中提取出具体的线索,再将这些线索串联起来,最终锁定宝箱的位置。 这就是一阶逻辑推理规则的威力。它把自然语言中的“所有”“存在”“如果……那么”等量词,转化为一套严谨的推导步骤。从全称实例化(从“所有房间”推出“3号房间”)到归结原理(用矛盾排除法证明结论必然成立),这些都是AI系统进行自动推理、程序验证和知识表示的核心引擎。掌握了它们,你就拥有了让机器像侦探一样思考的密钥。

岗位关联

一阶逻辑推理是AI推理引擎的基石,掌握它,你便能读懂知识图谱的推导逻辑、程序验证的证明机制,甚至亲手为AI编写推理规则,这是通往人工智能核心的必经之路。

目录
  1. 可视化演示
  2. 全称实例化
  3. 存在实例化
  4. 量词引入规则
  5. 自然演绎系统
  6. 前束范式
  7. Skolem化
  8. 归结原理
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

一阶逻辑推理规则包括全称实例化、存在实例化与量词处理规则。本文详解量词消去与引入规则、自然演绎推理系统中的量词... 切换模式查看不同维度。

本节配有交互动效(进入视口后自动加载,约 3KB)。

全称实例化与:核心原理 动态展示关键流程与数据流动 交互控件调节参数实时渲染 f(x) = transform(x) 核心概念的可视化呈现

全称实例化

作为密室寻宝者,你打开藏宝图的第一行写着:“所有房间里都有一个宝箱”。这句话信息量巨大,但你此刻站在1号房间门口,你需要的是一个具体的判断:“1号房间有宝箱吗?”全称实例化(Universal Instantiation, UI)就是那把将“所有”翻译成“这一个”的万能钥匙。它告诉我们:如果某个性质对论域中的所有对象成立,那么对其中任意一个具体的对象也必然成立。

在形式化推理中,全称命题形如 $\forall x P(x)$,它断言论域中的每一个个体都具有性质 $P$。全称实例化规则允许我们从 $\forall x P(x)$ 推出 $P(a)$,其中 $a$ 是论域中的任意一个项(个体常项、变元或复合项)。就像藏宝图告诉你“所有房间都有宝箱”,你便可以理直气壮地写下“4号房间有宝箱”。

∀x P(x)  ⟹  P(a)\forall x\, P(x) \;\Longrightarrow\; P(a)

1. 全称量词:$\forall x$ 表示“对论域中的所有 $x$”,它是全称命题的标记。

∀x\forall x

2. 谓词公式:$P(x)$ 是一个关于 $x$ 的断言,读作“$x$ 具有性质 $P$”。

P(x)P(x)

3. 实例项:$a$ 可以是论域中任意一个具体的项(常项、变元或函数项)。

aa

4. 推出关系:$\Longrightarrow$ 表示推导方向,从普遍到特殊。

∀x P(x)  ⟹  P(a)\forall x\, P(x) \;\Longrightarrow\; P(a)

注意,全称实例化虽然简单,但有一个重要的限制:被替换的项 $a$ 必须是论域中合法的项。如果 $P(x)$ 表示“$x$ 是偶数”,而你试图用“3“代入得到”3是偶数“,这不是规则的问题——那是前提本身不成立。规则保证的是形式上的有效性:只要前提为真,结论必然为真。就像密室中,若”所有房间都有宝箱”是千真万确的,那么每一个具体房间的宝箱都真实存在。

存在实例化

藏宝图的第二行写着:“某个房间里藏着钥匙。”这句话让你知道钥匙一定存在,但它没有告诉你具体在哪个房间。存在实例化(Existential Instantiation, EI)允许你为这个“某个”引入一个临时的名字——好比侦探说“我们暂时称那位神秘人为X先生”——然后基于这个名字继续推理。

∃x P(x)  ⟹  P(c)\exists x\, P(x) \;\Longrightarrow\; P(c)

这里的 $c$ 必须是一个全新的常项——它在之前的推导中没有出现过。这个限制至关重要:你不能用已经提到的“4号房间”去代入,因为你并不确定钥匙就在4号房间。新常项 $c$ 代表的是一个“我们知道它存在,但不知道具体是谁”的对象。

1. 存在量词:$\exists x$ 表示“存在至少一个 $x$”,是存在命题的核心符号。

∃x\exists x

2. 性质断言:$P(x)$ 说明这个存在的个体满足性质 $P$。

P(x)P(x)

3. 新常项:$c$ 是一个新的、尚未在推导中使用过的常项符号。

cc

4. 推出结论:从“存在某个 $x$ 满足 $P$”推出“新常项 $c$ 满足 $P$”。

∃x P(x)  ⟹  P(c)\exists x\, P(x) \;\Longrightarrow\; P(c)

存在实例化的“新常项”要求,好比侦探不能把“某个目击者”直接认定为已有的嫌疑人张三——那会冤枉好人。同理,在逻辑推导中,若用旧常项代入存在量词,就可能引入不存在的证据,导致整个证明崩塌。这条规则为后续推导提供了一个“真实存在但身份未知”的锚点,是自然演绎中不可或缺的步骤。

量词引入规则

密室探索过半,你积累了丰富的线索:你逐一检查了每个房间,确认每个房间都有宝箱。这时,你便可以大胆地在笔记上写下总结性结论:“所有房间都有宝箱。”这个从个体证据上升到普遍结论的过程,就是全称引入(Universal Generalization, UG)。它的形式是:如果从任意选取的 $a$ 能推出 $P(a)$,那么可以推出 $\forall x\, P(x)$。

P(a)∀x P(x)\frac{P(a)}{\forall x\, P(x)}

关键在于 $a$ 必须是“任意”的——你不能因为3号房间有宝箱就说所有房间都有。全称引入要求证明过程对论域中每一个个体都成立。这就像你逐一检查了每一扇门,确认每个房间都有宝箱,才能写下全称结论。如果你只检查了一间房就写“所有房间”,那便是以偏概全。

与之相对的是存在引入(Existential Generalization, EG):如果你已经证明了 $P(a)$,那么必然存在某个 $x$ 使得 $P(x)$ 成立。找到了一间有宝箱的房间,就能说“至少有一间房有宝箱”。

P(a)∃x P(x)\frac{P(a)}{\exists x\, P(x)}

1. 前提任意项:$P(a)$ 中的 $a$ 表示论域中任意选取的个体,不能是特指。

P(a)P(a)

2. 全称量词引入:$a$ 的任意性保证了结论的普遍性。

P(a)∀x P(x)\frac{P(a)}{\forall x\, P(x)}

3. 存在量词引入:$P(b)$ 中 $b$ 是某个具体个体,它足够支撑存在结论。

P(b)∃x P(x)\frac{P(b)}{\exists x\, P(x)}

量词引入规则与消去规则互为逆过程,它们共同构成了量词推理的完整闭环。就像你在密室中既可以用“所有”推导“单个”,也可以用足够的“单个”证据归纳出“所有”,这套双向规则让逻辑推理严密而完备。任何一个合格的侦探都知道:从“某个人有嫌疑”到“所有人都有嫌疑”,这中间隔着一道叫做“任意性”的鸿沟——量词引入规则就是跨越这道鸿沟的桥梁。

自然演绎系统

密室寻宝途中,你发现只靠零散的规则还不够,你需要一个完整的记录系统:哪些是前提、哪些是推导出的中间结论、每一步用了哪条规则。自然演绎系统(Natural Deduction)就是这样的“侦探笔记系统”——它模仿人类自然的推理方式,提供了从前提推出结论的一整套规则集合。

自然演绎包含两类规则:引入规则(如何得到带量词的公式)和消去规则(如何使用带量词的公式)。全称实例化是“全称消去”,存在实例化是“存在消去”,全称引入和存在引入则对应各自的引入规则。这些规则必须协同使用,形成一个前后呼应的推理链。

Γ⊢φΓ⊢ψΓ⊢φ∧ψ\frac{\Gamma \vdash \varphi \quad \Gamma \vdash \psi}{\Gamma \vdash \varphi \land \psi}

1. 前提集合:$\Gamma$ 代表一个公式集合,即已知前提的“笔记库”。

Γ\Gamma

2. 推导符号:$\vdash$ 表示语法推导,从 $\Gamma$ 经过若干步规则推得结论。

Γ⊢φ\Gamma \vdash \varphi

3. 合取引入:从 $\varphi$ 和 $\psi$ 分别可推出,得出 $\varphi \land \psi$。

Γ⊢φΓ⊢ψΓ⊢φ∧ψ\frac{\Gamma \vdash \varphi \quad \Gamma \vdash \psi}{\Gamma \vdash \varphi \land \psi}

自然演绎中还有一个重要的技巧——条件证明法:要证明 $\varphi \rightarrow \psi$,可以先假设 $\varphi$ 成立,然后在这个假设下推导出 $\psi$,最后将假设撤销,得到 $\varphi \rightarrow \psi$。这就像侦探说:“假设嫌疑犯X在案发现场,那么……”,在假设下推出一系列结论,最终证明“如果X在案发现场,那么他一定是凶手”。自然演绎之所以“自然”,正是因为它模拟了人类从假设到结论的思维路径。

前束范式

密室探索接近尾声,你整理藏宝图上的所有线索,发现它们混杂着各种量词和逻辑连接词,难以一眼看清。前束范式(Prenex Normal Form, PNF)就像是一位图书管理员将乱序的线索卡片重新排序:把所有量词集中到公式的最前面,形成“量词前缀+无量词母体”的整洁结构。

∀x∃y (P(x)→Q(x,y))\forall x \exists y\, (P(x) \rightarrow Q(x, y))

1. 量词前缀:$\forall x \exists y$ 连续排列在公式开头,形成一个“前缀区”。

∀x∃y\forall x \exists y

2. 母体公式:$(P(x) \rightarrow Q(x, y))$ 不再含有量词,是纯命题结构。

P(x)→Q(x,y)P(x) \rightarrow Q(x, y)

3. 辖域覆盖:前缀中的量词管辖范围为整个母体公式。

∀x∃y (⋯ )\forall x \exists y\, (\cdots)

将任意一阶公式转化为前束范式需要三步:消去多余连接词(如 $\rightarrow$ 和 $\leftrightarrow$)、将否定词内移、将量词向外移动。过程中要特别注意约束变元改名——如果两个量词使用了相同的变元名,必须先将其中一个改名,避免“名字冲突”。这就像两个同名的档案袋不能放在同一个抽屉里,否则会混淆。前束范式虽然不改变公式的真值,但它为后续的Skolem化铺平了道路,是通往归结原理的必经驿站。

Skolem化

整理完线索,藏宝图上仍有一个麻烦的量词——“存在某个房间”。要对公式做机械化推理,最好连这个“存在”也一并消去。Skolem化(Skolemization)就是这样一种操作:用一个新的常项或函数来“命名”那个存在的对象,从而消去存在量词。

∃x P(x)  ⟹  P(sk)\exists x\, P(x) \;\Longrightarrow\; P(sk)

这里 $sk$ 是一个全新的常项。而在更复杂的情形下,当存在量词位于全称量词的辖域内时,需要用Skolem函数来替代:$\forall x \exists y\, P(x, y)$ 可以化为 $\forall x\, P(x, sk(x))$。为什么需要函数?因为 $y$ 的存在可能依赖于 $x$——不同的 $x$ 对应的 $y$ 可能不同,一个固定的常项无法表达这种依赖关系。

1. 存在量词:$\exists x$ 是待消去的目标。

∃x\exists x

2. Skolem常项:$sk$ 是一个全新的常项符号,取代“存在的某个对象”。

sksk

3. Skolem函数:当存在量词嵌套在全称量词下时,$sk(x)$ 随 $x$ 变化。

sk(x)sk(x)

4. 等值变换:Skolem化保持公式的不可满足性——原公式不可满足当且仅当Skolem化后的公式不可满足。

∃x P(x)  ⟺  P(sk)\exists x\, P(x) \;\Longleftrightarrow\; P(sk)

Skolem化最重要的性质是保持不可满足性,而非等价性。对于证明目的而言,这已经足够:我们要证明一个公式是定理,只需证明其否定不可满足。Skolem化像是一位“命名师”,为每个神秘的存在者赋予一个明确的代号,让整个推理过程不再有“未知的某个”——每个对象都有名有姓,机械化推理才得以施展拳脚。

归结原理

最后,你面对终极挑战:证明一个结论必然成立。归结原理(Resolution Principle)提供了终极武器——反证法。要证明结论 $\varphi$ 是前提 $\Gamma$ 的推论,只需证明 $\Gamma \cup \{\neg \varphi\}$ 不可满足。归结原理通过不断在子句集内寻找互补的文字对($P$ 与 $\neg P$),将它们“碰撞”出新的子句,直到推出空子句,从而证明矛盾存在。

P∨Q¬P∨RQ∨R\frac{P \vee Q \quad \neg P \vee R}{Q \vee R}

1. 子句1:$P \vee Q$,析取式子句,$P$ 和 $Q$ 至少一个成立。

P∨QP \vee Q

2. 子句2:$\neg P \vee R$,与子句1互补——一个含 $P$,一个含 $\neg P$。

¬P∨R\neg P \vee R

3. 归结式:消去互补对 $P$ 和 $\neg P$,合并剩余部分 $Q \vee R$。

P∨Q¬P∨RQ∨R\frac{P \vee Q \quad \neg P \vee R}{Q \vee R}

在一阶逻辑中,归结需要结合合一(Unification)操作:通过变元替换使两个互补文字完全一致。例如 $P(x)$ 与 $\neg P(c)$,可以通过替换 $x := c$ 实现合一,然后归于矛盾。归结原理极其优雅,它只需一条规则,就能用于所有命题和一阶谓词的自动证明。这也是Prolog语言和现代自动定理证明器的理论基石。当归结推导出空子句 $\square$ 时,就像侦探破案时所有线索在矛盾点汇总——你证明了结论必然成立,密室寻宝圆满成功。

AI 应用场景

知识图谱的自动推理引擎

阶段:知识表示与推理

解决的问题:传统知识图谱只能存储“实体-关系-实体”三元组,无法回答隐含的推理问题。例如图谱中存储了“所有人类都会死”和“苏格拉底是人”,要回答“苏格拉底会死吗”,需要推理引擎自动完成全称实例化:从“所有人类”推导出“苏格拉底”。

具体案例:医疗诊断知识图谱中存储了“所有糖尿病患者需要定期检查血糖”和“张先生患糖尿病”。通过一阶逻辑推理规则,系统自动生成“张先生需要定期检查血糖”的结论,并触发健康管理提醒。这背后正是全称实例化和自然演绎的机械执行。

程序验证中的数学定理证明

阶段:形式化验证

解决的问题:程序验证需要证明“对于所有输入,程序输出满足某性质”。传统测试只能覆盖有限样例,无法保证全面正确。归结原理结合Skolem化可以将验证问题转化为不可满足性判定,实现自动化证明。

具体案例:在智能合约安全审计中,工程师将合约的行为规范表达为一阶逻辑公式,使用基于归结原理的定理证明器(如Vampire、E)自动证明合约是否满足规范。若证明器推出空子句,说明存在安全漏洞;若推导不出矛盾,则合约规范得到验证。这一过程已成为区块链安全领域的标准实践。

Python 演示

python84 行
"""一阶逻辑归结推理演示实现从"所有人类会死"+"苏格拉底是人"推导出"苏格拉底会死""""from collections import defaultdict  class Clause:    """子句类:由一组原子文字组成"""     def __init__(self, literals):        self.literals = set(literals)     def resolve(self, other):        """归结两个子句,返回所有可能的归结式"""        resolvents = []        for a in self.literals:            for b in other.literals:                # 检查是否存在互补对 P 与 ¬P                if a.name == b.name and a.neg != b.neg:                    new_set = (self.literals - {a}) | (other.literals - {b})                    resolvents.append(Clause(list(new_set)))        return resolvents     def __repr__(self):        return " ∨ ".join(str(l) for l in sorted(self.literals, key=lambda x: x.name))  class Literal:    """文字:谓词加上否定标记"""     def __init__(self, name, neg=False):        self.name = name        self.neg = neg     def __repr__(self):        return ("¬" if self.neg else "") + self.name     def __eq__(self, other):        return self.name == other.name and self.neg == other.neg     def __hash__(self):        return hash((self.name, self.neg))  def resolution(clauses):    """归结证明:若推出空子句则不可满足"""    steps = 0    while True:        pairs = [(clauses[i], clauses[j])                 for i in range(len(clauses))                 for j in range(i + 1, len(clauses))]        if not pairs:            return False        for c1, c2 in pairs:            for res in c1.resolve(c2):                if not res.literals:                    print(f"第{steps}步: 推出空子句,矛盾成立!")                    return True                if res not in clauses:                    clauses.append(res)                    print(f"第{steps}步: {c1} 与 {c2} 归结 => {res}")                    steps += 1  # 构建子句集:# 1. 所有人类会死: ¬Human(x) ∨ Mortal(x)# 2. 苏格拉底是人: Human(s)# 3. 否定结论: ¬Mortal(s)mortal = Literal("Mortal")human_neg = Literal("Human", neg=True)human = Literal("Human")mortal_neg = Literal("Mortal", neg=True) clauses = [    Clause([human_neg, mortal]),  # 全称实例化后的子句    Clause([human]),              # 苏格拉底是人    Clause([mortal_neg]),         # 假设苏格拉底不会死] print("=== 归结推理过程 ===")result = resolution(clauses)print("结论: 苏格拉底会死" if result else "无法证明")
目的:演示如何使用归结原理进行自动定理证明——将“所有人必死、苏格拉底是人”编码为子句集,通过归结反证法推出“苏格拉底会死”。
  1. mortal = Literal("Mortal")定义谓词“Mortal“,表示”会死的”。
  2. human_neg = Literal("Human", neg=True)定义否定文字"¬Human",用于编码蕴含式。
  3. a.name == b.name and a.neg != b.neg检查两个文字是否互补,这是归结的触发条件。
  4. new_set = (self.literals - {a}) | (other.literals - {b})从两个子句中剔除互补对,合并剩余文字。
  5. if not res.literals:若归结结果为空子句,说明前提集合矛盾,证明完成。
  6. for res in c1.resolve(c2)枚举两个子句的所有可能归结式。
  7. pairs = [(clauses[i], clauses[j]) for i ...]生成所有子句对组合。
  8. clauses.append(res)将新归结式加入子句集,持续推导直到空子句。

常见误区

误区既然全称量词表示“所有对象都成立”,那我是不是可以把任意的项代入 $x$,包括那些在公式中尚未出现过的函数项和变元?

正解全称实例化确实允许代入论域中的任意项,但要保证这个项在论域中是有意义的。如果公式中使用了变元 $y$,代入 $\forall x P(x)$ 得到 $P(y)$ 时,$y$ 必须满足一定的约束条件——即 $y$ 在推导中不能被其他假设所限定。更关键的是,被替换的项不能与公式中其他量词产生绑定冲突。这就像藏宝图说“所有房间都有宝箱”,你可以推断“走廊尽头的储物间”有宝箱,但不能推断“钥匙所在的房间”有宝箱——因为后者此时还不明确。

为何常见:初学者看到“任意”一词,便以为无拘无束。忽略了“任意”指的是论域内的任意,而不是逻辑上不受约束的任意。

误区藏宝图说“某个房间有钥匙”,我手上已经知道3号房间的位置了,那我可以直接推出“3号房间有钥匙”吗?

正解不可以!存在实例化要求引入的常项必须是全新的、之前从未出现过的。用已有常项去代入存在量词,会将“不确定的存在”错认为“已知的具体对象”,导致推理失效。比如前提“某人是凶手”和阿里的存在,不能推出“阿里是凶手”。你必须引入一个全新的代号“嫌疑人X”来代表那个未知者。如果后来证明阿里和X是同一人,那需要额外的推理依据。

为何常见:人们习惯用已知信息填补未知空缺,但逻辑推理要求每一步都有严格的依据。用旧常项代入存在量词,本质上是一种“以偏概全”。

误区Skolem化只是消去存在量词,原公式和Skolem化后的公式在任何情况下真值都一样,可以互相替代。

正解Skolem化并不保持等价性,它只保持不可满足性。原公式 $\exists x P(x)$ 和 $P(sk)$ 在语义上有微妙差别:前者说“至少有一个对象满足 $P$”,后者说“某个特定的对象 $sk$ 满足 $P$”。如果论域中有多个满足 $P$ 的对象,后者选定了其中一个,这显然改变了原意。但对于反证法证明而言,我们只关心“是否存在矛盾”——Skolem化后的公式如果不可满足,原公式也不可满足,反之亦然。这足以支撑归结原理的证明。

为何常见:初学者容易将“保持不可满足性”误解为“保持等价性”,因为两者的差别非常细微,只有在关注模型论细节时才显现。

误区归结原理就是命题逻辑里的那个“消去P”,一阶逻辑里变量太多,归结没法直接用。

正解归结原理完全可以扩展到一阶逻辑,关键在于引入合一机制。当两个子句中含有变量时,通过寻找一个最一般合一替换,使两个互补文字完全一致,然后执行归结。例如 $P(x)$ 和 $\neg P(c)$ 可以通过替换 $x:=c$ 归结为空子句。一阶归结还是完备的:如果一个子句集不可满足,那么通过反复归结必能导出空子句。这是一阶逻辑自动推理的理论基石。

为何常见:看到一阶逻辑中的变量和量词,就觉得比命题逻辑复杂得多,忽视了合一机制的力量。实际上归结原理在一阶逻辑中的能力远超命题逻辑。

误区自然演绎是一种手工证明方法,对AI自动推理没有实际意义,现代AI都用归结原理。

正解自然演绎虽然源于人类自然的推理方式,但它已被成功地自动化。交互式定理证明器(如Coq、Isabelle/HOL)正是以自然演绎风格的规则为核心,允许人类与机器协作完成复杂证明。在AI领域,自然演绎的风格更接近人类可理解的证明步骤,常用于可解释性AI——让机器不仅给出结论,还能给出人类可读的推理路径。归结原理擅长全自动证明,自然演绎擅长可交互证明,两者各有所长。

为何常见:技术文章常强调归结的效率,无意中忽略了自然演绎在交互证明和可解释性上的独特价值。

面试题

Q1. 一阶逻辑中,从 $\forall x (P(x) \rightarrow Q(x))$ 可以推出下列哪一项?

单选题 · easy

  • A.$P(a) \rightarrow Q(a)$← 正确答案
  • B.$\exists x Q(x)$
  • C.$\forall x P(x)$
  • D.$Q(a) \rightarrow P(a)$

答案:A。全称实例化规则允许将全称量词 $\forall x$ 替换为论域中的任意项 $a$,得到 $P(a) \rightarrow Q(a)$。这就像藏宝图说“所有房间都有宝箱”,那么4号房间自然有宝箱。其他选项要么颠倒了蕴含方向,要么量词处理有误。

Q2. 存在实例化要求引入的常项必须满足什么条件?

单选题 · easy

  • A.必须已在前提中出现
  • B.必须是全新的常项← 正确答案
  • C.必须是论域中最大的对象
  • D.必须与结论中的常项一致

答案:B。存在实例化要求引入一个全新的常项,因为“某个房间有钥匙”中的“某个房间”是未知的,不能用已有常项硬套。这就像警察发现陌生指纹后,会为未知者起代号“X先生”,而不会直接认定是已掌握的嫌疑人。

Q3. Skolem化 $\forall x \exists y P(x, y)$ 的正确结果是?

单选题 · mid

  • A.$\forall x P(x, sk)$
  • B.$\forall x P(sk, x)$
  • C.$\forall x P(x, sk(x))$← 正确答案
  • D.$\exists y P(sk, y)$

答案:C。当存在量词位于全称量词辖域内时,被消去的变元 $y$ 依赖于全称变元 $x$,需要引入Skolem函数 $sk(x)$ 来表达这种依赖关系。这就像每个房间的宝箱位置各不相同,必须用“3号房间的暗格”而非笼统的“那个暗格”来描述。

Q4. 下列哪项是前束范式的标准形态?

单选题 · mid

  • A.$(P(x) \rightarrow Q(x)) \land \forall x R(x)$
  • B.$\forall x \exists y (P(x) \rightarrow Q(x, y))$← 正确答案
  • C.$\neg \forall x P(x)$
  • D.$P(x) \land \forall x Q(x) \land \exists x R(x)$

答案:B。前束范式的核心是“量词集中在前,母体无量词”。$\forall x \exists y (P(x) \rightarrow Q(x, y))$ 符合这一结构,量词连续排列且辖域覆盖整个母体。其他选项的量词散落在公式各处,像乱序的档案卡片,尚未整理成前束范式。

Q5. 归结原理中,两个子句 $P \vee Q$ 和 $\neg P \vee R$ 的归结式是?

单选题 · mid

  • A.$Q \vee R$← 正确答案
  • B.$P \vee \neg P$
  • C.$Q \land R$
  • D.$\square$

答案:A。归结规则消去互补文字对 $P$ 和 $\neg P$,合并剩余部分得到 $Q \vee R$。就像两位证人对质,一个说“要么张三在,要么李四在”,另一个说“张三不在,要么王五在”,消除张三这个分歧点,剩下的共识是“李四或王五在场”。

Q6. 关于全称引入规则(UG),下列说法正确的有?

多选题 · mid

  • A.可以从 $P(a)$ 推出 $\forall x P(x)$,只要 $a$ 是任意选取的← 正确答案
  • B.可以从 $P(a)$ 直接推出 $\forall x P(x)$,无需任何限制
  • C.全称引入是从个体证据上升到普遍结论的过程← 正确答案
  • D.若 $a$ 在推导中受到其他前提限定,则不能使用全称引入← 正确答案

答案:ACD。全称引入要求 $a$ 必须是任意选取的,且未受任何前提限定,否则可能以偏概全——好比只检查了3号房间就断言所有房间都有宝箱。B选项忽视了“任意性”这一关键限制,故错误。

Q7. 一阶逻辑归结需要哪些前置步骤?

多选题 · mid

  • A.将公式转化为前束范式← 正确答案
  • B.执行Skolem化消去存在量词← 正确答案
  • C.将母体转化为合取范式← 正确答案
  • D.将所有子句合并为一个超长子句

答案:ABC。归结的完整流程是:前束范式 → Skolem化 → 母体化为合取范式(CNF)→ 拆分为子句集。前束范式整理量词、Skolem化消去存在量词、CNF化准备子句,每一步都缺一不可。D选项“合并为一个子句”违背了归结需要多个子句交互消解的基本逻辑。

Q8. 关于Skolem化的性质,以下理解正确的有?

多选题 · hard

  • A.Skolem化保持原公式的可满足性← 正确答案
  • B.Skolem化保持原公式的不可满足性← 正确答案
  • C.原公式与Skolem化后的公式语义等价
  • D.Skolem函数用于表达被消去变元对其他变元的依赖← 正确答案

答案:ABD。Skolem化保持可满足性和不可满足性,但不保持等价性——它引入了新的常项/函数,语义上“选择”了某个特定对象,与“存在某个对象”在模型论上不等价。A与B都在描述“可满足性等价”这一性质的两个侧面,故都正确。

Q9. 自然演绎中“条件证明法”的核心思想是?

单选题 · hard

  • A.先假设前提 $\varphi$,推导出 $\psi$,从而证明 $\varphi \rightarrow \psi$← 正确答案
  • B.对 $\varphi \rightarrow \psi$ 的所有可能取值做真值表分析
  • C.将 $\varphi \rightarrow \psi$ 转化为 $\neg \varphi \vee \psi$
  • D.用归结原理消去 $\varphi$

答案:A。条件证明法假设 $\varphi$ 为真,在其下推导出 $\psi$,最后撤销假设得到 $\varphi \rightarrow \psi$。这正是侦探的思维模式:“假设嫌疑犯X在场,那么……”,推理完成后得到一个条件结论。C选项描述的是逻辑等价变换而非证明策略,B和D更不相干。

Q10. 在一阶逻辑归结中,“合一”(Unification)的作用包括?

多选题 · hard

  • A.将两个互补文字变成完全一致的形式← 正确答案
  • B.通过变量替换实现 $P(x)$ 与 $\neg P(c)$ 的消解← 正确答案
  • C.消去所有存在量词
  • D.使得 $P(f(x))$ 与 $\neg P(f(c))$ 可以通过 $x:=c$ 合一← 正确答案

答案:ABD。合一通过寻找最一般替换使两个互补文字一致,从而可能产生空子句。$P(x)$ 与 $\neg P(c)$ 通过 $x:=c$ 合一,$P(f(x))$ 与 $\neg P(f(c))$ 同理。C选项描述的是Skolem化的功能,与合一无关。合一相当于让两个证人用同一套语言描述同一个事实,调解矛盾方能进行。