LOGIC:Coq 逻辑库的深入解析
1. 逻辑基础类型类
在逻辑系统的构建中,我们首先会遇到一些基础的类型类,它们为后续的逻辑推导和证明提供了基础。以下是一些重要的类型类定义:
Class Provable (L : Language) :=
{ provable : expr -> Prop }.
(*|--x *)
Class Derivable (L : Language) :=
{
derivable : setofexpr -> expr -> Prop
}.
(*X |---x *)
Class Derivable1 (L : Language) :=
{
derivable1 : expr -> expr -> Prop
}.
(*x |--y *)
Class LogicEquiv (L : Language) :=
{
logicequiv : expr -> expr -> Prop
}.
(*x --||--y *)
“Provable L” 并不假定 ⊢ϕ 是一个原始定义。逻辑学家可以选择 ⊢ϕ 或 Φ ⊢ϕ 作为原始定义,然后推导出另一个。此外,计算机科学家在形式化程序验证项目中通常使用 ϕ ⊢ψ 作为他们的原始符号。LOGIC 支持所有这些不同的选择,并使用额外的类型类来定义它们之间的转换。例如:
Class DerivableProvable (L : Language)
(GammaP: Provable L)
(GammaD: Derivable L) {
: ImpLanguage L} :=
{
derivable_provable :
for any Φ ϕ, Φ ⊢ϕ iff.
there exists ϕ1, ϕ2, ..., ϕn ∈Φ, s.t. ⊢ϕ1 →ϕ2 →· · · →ϕn →ϕ
}.
2. 证明规则
2.1 分离逻辑的证明规则示例
在构建分离逻辑时,关于分离合取 “∗” 通常需要以下三条规则:
- SepconComm:对于任意 ϕ 和 ψ,有 ϕ ∗ψ ⊢ψ ∗ϕ;
- SepconAssoc:对于任意 ϕ、ψ 和 χ,有 ϕ ∗(ψ ∗χ) ⊢(ϕ ∗ψ) ∗χ;
- SepconMono:对于任意 ϕ、ψ、ϕ′ 和 ψ′,如果 ϕ ⊢ϕ′ 且 ψ ⊢ψ′,那么 ϕ ∗ψ ⊢ϕ′ ∗ψ′。
如果存在分离蕴含 “−∗”,我们可能会有以下证明规则:
- WandSepconAdjoint:对于任意 ϕ、ψ 和 χ,有 ϕ ∗ψ ⊢χ 当且仅当 ϕ ⊢ψ −∗χ。
已知 SepconMono 可以从 SepconComm、SepconAssoc 和 WandSepconAdjoint 推导得出。
2.2 内部使用的主要规则类
以下是两个供 LOGIC 内部使用的规则类:
Class SepconDeduction (L : Language)
(GammaD1 : Derivable1 L)
{
: SepconLanguage} :=
{
sepcon_comm :
for any ϕ ψ, ϕ ∗ψ ⊢ψ ∗ϕ ;
sepcon_assoc :
for any ϕ ψ χ, ϕ ∗(ψ ∗χ) ⊢(ϕ ∗ψ) ∗χ ;
sepcon_mono :
for any ϕ ψ ϕ′ ψ, if ϕ ⊢ϕ′ and ψ ⊢ψ′, then ϕ ∗ψ ⊢ϕ′ ∗ψ′
}.
Class WandDeduction (L : Language)
(GammaD1 : Derivable L)
{
: SepconLanguage L} {
: WandLanguage L} :=
{
wand_sepcon_adjoint :
for any ϕ ψ χ, ϕ ∗ψ ⊢χ iff. ϕ ⊢ψ −∗χ
}.
利用上述规则类,我们可以构造其他规则的参数化证明。例如,分离蕴含 “−∗” 的单调性可以从给定的上下文(包括判断的基本属性 BasicDeduction 和上述的 WandDeduction)推导得出,这在以下引理中得到了形式化:
Lemma derivable1_wand_mono :
forall
{L : Language}
{sepconL : SepconLanguage L} {wandL : WandLanguage L}
{GammaD1 : Derivable L} {bD : BasicDeduction L GammaD1}
{wandD : WandDeduction L GammaD1},
for any ϕ1 ϕ2 ψ1 ψ2, if ϕ2 ⊢ϕ1 and ψ2 ⊢ψ1, then ϕ1 −∗ψ1 ⊢ϕ2 −∗ψ2
2.3 用户构建的规则类
对于上述分离逻辑示例,有三个供用户构建的类型类,如下所示:
Class SepconDeductionWeak (L : Language)
(GammaD1 : Derivable1 L)
{
: SepconLanguage} :=
{
sepcon_comm :
for any ϕ ψ, ϕ ∗ψ ⊢ψ ∗ϕ ;
sepcon_assoc :
for any ϕ ψ χ, ϕ ∗(ψ ∗χ) ⊢(ϕ ∗ψ) ∗χ
}.
Class SepconDeductionMono (L : Language)
(GammaD1 : Derivable1 L)
{
: SepconLanguage} :=
{
sepcon_mono :
for any ϕ ψ ϕ′ ψ, if ϕ ⊢ϕ′ and ψ ⊢ψ′, then ϕ ∗ψ ⊢ϕ′ ∗ψ′
}.
Class WandDeduction (L : Language)
(GammaD1 : Derivable L)
{
: SepconLanguage L} {
: WandLanguage L} :=
{
wand_sepcon_adjoint :
for any ϕ ψ χ, ϕ ∗ψ ⊢χ iff. ϕ ⊢ψ −∗χ
}.
这允许用户在构建逻辑时具有灵活性。如果所需的逻辑不涉及分离蕴含 “−∗”,用户可以选择 SepconDeductionWeak 和 SepconDeductionMono 作为主要规则类。否则,可以选择 SepconDeductionWeak 和 WandDeduction 作为逻辑的主要规则类,这样规则 SepconMono 可以自动推导得出。
2.4 从输入构建主要规则
在 LOGIC 中,规则类之间的推导使用 Coq 引理来描述,这允许根据用户的输入证明构建主要规则。例如,以下引理表明,一旦证明了 SepconComm、SepconAssoc(在类型类 SepconDeductionWeak 中给出)和 WandSepconMono(在类型类 WandDeduction 中给出),就可以推导出 SepconMono:
Lemma WeakAdjoint2Mono :
forall
{L : Language} {GammaD1 : Derivable1 L}
{
: SepconLanguage L} {
: WandLanguage L}
{
: SepconDeductionWeak L GammaD1}
{
: WandDeduction L GammaD1},
SepconDeductionMono L GammaD1.
2.5 派生连接词的规则
LOGIC 中 Coq 引理的另一个用途在于连接词和判断的语法糖。LOGIC 支持使用语法糖从原始连接词(判断)定义新的连接词(判断)。例如,OrFromDefToAx Imp Neg 证明了,如果将析取定义为 ϕ∨ψ ≜¬ϕ →ψ,那么析取将具有其引入规则和消除规则。
3. 语义和可靠性
3.1 语义的类型类定义
双转门 “· ⊨·” 通常描述一个满足关系,其左侧可能根据语义而有所不同。因此,我们使用 Coq 类型类对不同可能性进行参数化:
Class Model := {model : Type }.
Class Semantics (L : Language)
(MD : Model) :=
{ denotation : expr -> model -> Prop }.
也就是说,只要一个指称函数将每个命题表达式映射到 “模型” 的一个子集(即该表达式在其中得到满足的模型集合),就定义了一个语义。这里,“模型” 集合(在不同语义中可能不同)由类型类 Model 定义。基于 Model 和 Semantics,我们可以定义不同连接词的语义。例如:
Class AndSemantics (L : Language) {
: AndLanguage L}
(MD: Model)
(SM: Semantics L MD) :=
{ denote_andp :
for any m ϕ ψ, m ⊨ϕ ∧ψ iff. m ⊨ϕ and m ⊨ψ
}.
3.2 可靠性证明
通常,逻辑的可靠性通过对证明树进行归纳来证明,并且只需证明所有主要证明规则都保持有效性即可。在 LOGIC 中,我们通过在语义定义的参数化假设下形式化这些有效性保持引理来实现证明重用。例如,假言推理(ModusPonens)的有效性保持在以下引理中得到形式化:
Lemma sound_modus_ponens :
forall
{L : Language} {MD: Model} {kMD: KripkeModel MD}
{M: Kmodel} {SM: Semantics L MD}
{
: ImpLanguage L} {
: IL. Relation (Kworlds M)}
{
: KripkeIntuitionisticSemantics L MD M SM}
{
: KripkeImpSemantics L MD M SM},
for any ϕ ψ, if ϕ →ψ and ϕ are valid on M, then ψ is valid on M.
4. 完备性
4.1 Henkin 风格的完备性证明步骤
Henkin 风格的完备性证明包括以下步骤:
1. 反证法:假设 Φ ̸⊢ϕ。
2. Lindenbaum 构造:找到一个 “好” 的集合 Ψ,使得 Ψ ⊇Φ 且 Ψ ̸⊢ϕ。
3. 典范模型构造:定义一个 Kripke 模型 Mc,其可能世界是所有 “好” 的集合。
4. 真值引理:证明对于任意 Θ 和 θ,Mc, Θ ⊨θ 当且仅当 θ ∈Θ。
5. 得出矛盾:因为 Mc, Ψ ⊨Φ 但 Mc, Ψ ̸⊨ϕ,所以 Φ ̸⊨ϕ。
4.2 参数化的 Lindenbaum 构造
Lindenbaum 构造的目标是找到一个超集 Ψ ⊇Φ(给定 Φ),使得 F(Ψ)。Lindenbaum 构造总是遵循以下常规:
Φ0 = Φ, Ψ = ⋃n Φn
Φn+1 = Φn ∪ϕn if Φn ∪ϕn has property G
Φn+1 = Φn if Φn ∪ϕn does not have property G
where {ϕn|n ∈N} are all propositions.
在 LOGIC 中,我们首先将上述 Lindenbaum 构造过程形式化为:Ψ = LC(Φ, G)。然后,所有 Lindenbaum 构造引理都具有相同的格式:对于任意 Φ,如果 G(Φ),那么 F(LC(Φ, G))。我们将其称为 LLS(F, G),其中 LLS 代表 Lindenbaum 引理陈述。值得注意的是,LLS(F, G) 的定义仅依赖于语言,而不依赖于证明理论或语义。只有当用具体的命题集合实例化 F 和 G 时,才需要在它们的定义中使用证明理论。我们在 Coq 中证明了 LLS(F, G) 在 F 上是可组合的(Lindenbaum by conj)。此外,我们还证明了一些通用引理,如 Lindenbaum self by finiteness 和 Lindenbaum derivable closed 用于 F 的常见合取项。
Lemma Lindenbaum_by_conj {L : Language } :
for any F1, F2, and G, if LLS(F1, G) and LLS(F2, G), then LLS(F1 and F2, G) .
Lemma Lindenbaum_self_by_finiteness {L : Language } :
for any G, if G is finite-captured and subset-preserved, then LLS(G, G) .
Lemma Lindenbaum_derivable_closed {L : Language} {Gamma: Derivable L} :
for any G, if G ◦∂is subset-preserved and LLS(G, G), then LLS(derivable-closed, G) .
Corollary Lindenbaum_cannot_derive {L : Language} {Gamma: Derivable L} :
for any G ϕ, if G(Φ) has form Φ ̸⊢ϕ for any Φ, then LLS(derivable-closed, G) .
这里,一个属性 G 是有限捕获的意味着:对于任意 Φ,如果 Φ 的每个有限子集都具有属性 G,那么 Φ 本身具有属性 G;一个属性 G 是子集保持的意味着:对于任意 Φ ⊇Ψ,如果 G(Φ) 则 G(Ψ);并且 ∂ 是一个从命题集合到命题集合的函数,使得 ∂(Φ) = {ϕ | Φ ⊢ϕ}。基于 Coq 的高阶特性,我们能够定义像有限捕获这样的概念,并在上述引理中使用它们。因此,我们不需要在 Coq 中为不同的 Lindenbaum 构造重复证明。
4.3 参数化的良定义性
在 Henkin 风格的证明中,我们需要证明典范模型确实是一个合法的模型。例如,在分离逻辑的完备性证明中,我们应该检查典范模型中的连接关系是否是可交换的,即对于任意 “好” 的集合 Φ、Ψ 和 Θ,有 joinc(Φ, Ψ, Θ) 当且仅当 joinc(Ψ, Φ, Θ)。这里,joinc 是典范模型中的连接关系,通常定义为:joinc(Φ, Ψ, Θ) 当且仅当 Φ ∗Ψ ⊆Θ。在 LOGIC 中,我们证明了以下关于 joinc 可交换性的一般陈述:
Lemma canonical_comm :
forall
{L : Language} {GammaD : Derivable L} {
: SepconLanguage L}
{
: BasicSequentCalculus L GammaD}
{
: SepconSequentCalculus L GammaD},
if every “good” set is derivable-closed, then joinc is commutative .
4.4 参数化的真值引理
真值引理通常通过对命题的语法树进行归纳来证明。为了实现证明重用,我们像在可靠性证明中一样分别形式化不同的归纳步骤。例如,合取的归纳步骤是证明:
如果对于任意 Θ,Mc, Θ ⊨ϕ 当且仅当 ϕ ∈Θ,并且对于任意 Θ,Mc, Θ ⊨ψ 当且仅当 ψ ∈Θ,那么对于任意 Θ,Mc, Θ ⊨ϕ ∧ψ 当且仅当 ϕ ∧ψ ∈Θ。
当然,上述结论仅在关于 “好” 的集合和典范模型结构的某些特定假设下才成立。我们再次基于宽松类别的 “好” 的集合来证明这些引理。
5. 逻辑生成器
5.1 逻辑生成器的使用步骤
为了基于 LOGIC 的生成器构建一个逻辑系统(包括其连接词、判断和证明规则),需要采取以下三个步骤:
1. 设置配置文件 :用户设置一个配置文件,指示他们的逻辑的原始连接词、判断和主要证明规则,以及其他原始连接词和判断是如何派生的。例如,要形式化 Mendelson 的命题逻辑,配置应如下编写:
Definition how_connectives :=
[
primitive_connective impp;
primitive_connective negp;
FROM impp negp TO orp
].
Definition how_judgements :=
[
primitive_judgement provable;
FROM provable TO derivable1
].
Definition primitive_rule_classes :=
[
provability OF impp;
provability OF classical_logic by contra
].
该配置指定了所需逻辑的以下信息:
- 逻辑语言中有三个连接词:蕴含 “→”、否定 “¬” 和析取 “∨”,其中前两个是原始的,第三个是通过 ϕ ∨ψ ≜¬ϕ →ψ 派生的。
- 逻辑证明系统中有两个判断:可证明 “ ⊢·” 和可推导1 “· ⊢·”,其中前者是原始的,后者是通过 ϕ ⊢ψ ≜⊢ϕ →ψ 派生的。
- 逻辑的原始证明规则包括以下内容,其中前三个是蕴含 “→” 的基本证明规则,第四个是矛盾规则:
- ModusPones:对于任意 ϕ 和 ψ,如果 ⊢(ϕ →ψ) 且 ⊢ϕ,那么 ⊢ψ。
- Axiom1:对于任意 ϕ 和 ψ,有 ⊢(ϕ →(ψ →ϕ))。
- Axiom2:对于任意 ϕ、ψ 和 χ,有 ⊢((ϕ →ψ →χ) →(ϕ →ψ) →(ϕ →χ))。
- ByContradiction:对于任意 ϕ 和 ψ,有 ⊢(¬ϕ →ψ) →(¬ϕ →¬ψ) →ϕ。
2. 生成接口文件 :逻辑生成器以配置为输入,输出一个接口文件,其中包括 Coq 模块类型,展示用户需要提供的原始连接词、判断和规则,以及用于派生派生连接词、派生判断和派生证明规则的 Coq 函子。原始类型、连接词和判断包含在模块类型 LanguageSig 中,它只指示类型,由用户实现:
Module Type LanguageSig .
Parameter Inline expr : Type .
Parameter provable : (expr -> Prop) .
Parameter impp : (expr -> expr -> expr) .
Parameter negp : (expr -> expr) .
End LanguageSig .
(* Automatically generated *)
类似地,主要规则包含在另一个模块类型 PrimitiveRuleSig 中,也需要用户证明:
Module Type PrimitiveRuleSig (Names : LanguageSig) .
Include DerivedNames (Names) .
Axiom by_contradiction :
for any ϕ ψ, ⊢(¬ϕ →ψ) →(¬ϕ →¬ψ) →ϕ .
Axiom modus_ponens :
for any ϕ ψ, if ⊢(ϕ →ψ) and ⊢ϕ, then ⊢ψ .
Axiom axiom1 :
for any ϕ ψ, ⊢(ϕ →(ψ →ϕ)) .
Axiom axiom2 :
for any ϕ ψ χ, ⊢((ϕ →ψ →χ) →(ϕ →ψ) →(ϕ →χ)) .
End PrimitiveRuleSig .
(* Automatically generated *)
所有可以使用主要规则推导出来的证明规则都包含在模块 LogicTheorems 中。以下是 LogicTheorems 中包含的一些规则示例:
- Derivable1Refl:对于任意 ϕ,有 ϕ ⊢ϕ;
- Derivable1Trans:对于任意 ϕ、ψ 和 χ,如果 ϕ ⊢ψ 且 ψ ⊢χ,那么 ϕ ⊢χ;
- Impp2Orp1:对于任意 ϕ 和 ψ,有 ⊢(ϕ →ψ) →(¬ϕ ∨ψ);
- PeirceLaw:对于任意 ϕ 和 ψ,有 ⊢((ϕ →ψ) →ϕ) →ϕ。
3. 提供具体实现 :在接口文件的指导下,用户需要提供原始连接词和判断的具体定义,以及主要规则的证明。这些在实现文件中完成。LOGIC 支持深度嵌入(通过语法树定义命题)和浅嵌入(将命题定义为其得到满足的世界集合,而不使用语法树)的实现。
5.2 不同嵌入方式的实现示例
浅嵌入实现
如果采用浅嵌入,原始连接词和判断的实现可以如下编写:
Module NaiveLang .
Definition expr := worlds -> Prop .
Definition impp (x y : expr) : expr := fun m =>
if x m, then y m .
Definition negp (x : expr) : expr := fun m =>
not x m .
Definition provable (x : expr) : Prop :=
for any m, x m .
End NaiveLang .
深度嵌入实现
如果用户选择应用深度嵌入,命题 (expr) 应定义为语法树,如下所示:
Inductive expr : Type :=
| impp : expr -> expr -> expr
| negp : expr -> expr
| varp : var -> expr .
Inductive provable : expr -> Prop :=
| modus_ponens :
for any ϕ ψ, if ⊢(ϕ →ψ) and ⊢ϕ, then ⊢ψ
| axiom1 :
for any ϕ ψ, ⊢(ϕ →(ψ →ϕ))
| axiom2 :
for any ϕ ψ χ, ⊢((ϕ →ψ →χ) →(ϕ →ψ) →(ϕ →χ)) .
| by_contradiction :
for any ϕ ψ, ⊢(¬ϕ →ψ) →(¬ϕ →¬ψ) →ϕ .
Module NaiveLang .
Definition expr := expr .
Definition impp := impp .
Definition negp := negp .
Definition provable := provable .
End NaiveLang .
无论使用哪种嵌入方式,都需要证明主要规则。
综上所述,LOGIC 提供了一个强大而灵活的框架,通过类型类、引理和逻辑生成器,支持用户构建和验证各种逻辑系统,同时实现了证明重用和参数化证明,提高了开发效率和逻辑系统的可维护性。
5.3 逻辑生成器的工作流程总结
逻辑生成器的工作流程可以用以下 mermaid 流程图表示:
graph LR
A[用户设置配置文件] --> B[逻辑生成器读取配置]
B --> C[生成接口文件]
C --> D[用户提供具体实现]
D --> E[完成逻辑系统构建]
具体步骤如下:
1. 用户设置配置文件,明确逻辑的原始连接词、判断、主要证明规则以及派生方式。
2. 逻辑生成器读取配置文件,根据配置信息进行处理。
3. 生成接口文件,包含 Coq 模块类型和函子,指示用户需要提供的原始元素和派生方式。
4. 用户根据接口文件的指导,提供原始连接词、判断的具体定义和主要规则的证明。
5. 完成逻辑系统的构建。
5.4 逻辑生成器的优势
逻辑生成器具有以下显著优势:
| 优势 | 说明 |
| ---- | ---- |
| 灵活性 | 用户可以根据需求灵活选择原始连接词、判断和证明规则,构建不同的逻辑系统。例如,对于不同的逻辑应用场景,可以选择不同的原始规则类。 |
| 可重用性 | 通过参数化的定义和证明,实现了证明的重用。例如,在不同的逻辑系统中,如果某些规则的证明过程相似,可以复用已有的证明。 |
| 自动化推导 | 逻辑生成器可以自动推导派生连接词、派生判断和派生证明规则,减少了用户的手动推导工作量。例如,根据用户提供的原始规则,自动推导出其他相关规则。 |
6. 总结与展望
6.1 主要内容总结
本文详细介绍了 LOGIC 这一 Coq 逻辑库的相关内容:
1. 逻辑基础类型类 :定义了 Provable、Derivable 等基础类型类,支持不同的逻辑符号选择和转换。
2. 证明规则 :以分离逻辑为例,介绍了内部使用和用户构建的规则类,以及规则之间的推导关系。
3. 语义和可靠性 :通过 Coq 类型类定义语义,利用归纳法证明逻辑的可靠性。
4. 完备性 :采用 Henkin 风格的完备性证明,包括 Lindenbaum 构造、典范模型构造等步骤,并实现了参数化的证明。
5. 逻辑生成器 :提供了一个灵活的框架,用户可以通过配置文件和接口文件构建逻辑系统,支持不同的嵌入方式。
6.2 应用场景展望
LOGIC 逻辑库在以下领域具有广阔的应用前景:
1. 形式化程序验证 :可以用于验证程序的正确性,通过构建合适的逻辑系统,对程序的行为进行精确描述和验证。
2. 人工智能 :在知识表示和推理中,LOGIC 可以提供强大的逻辑基础,帮助实现智能系统的推理和决策功能。
3. 数学证明辅助 :辅助数学家进行复杂的数学证明,提高证明的准确性和效率。
6.3 未来发展方向
未来,LOGIC 逻辑库可以在以下方面进行进一步的发展:
1. 支持更多逻辑类型 :除了现有的分离逻辑等,支持更多种类的逻辑,如模态逻辑、时态逻辑等。
2. 优化逻辑生成器 :进一步提高逻辑生成器的性能和用户体验,减少生成时间和配置复杂度。
3. 集成更多工具 :与其他形式化工具进行集成,形成更强大的开发环境。
总之,LOGIC 逻辑库为逻辑系统的构建和验证提供了一个强大而灵活的平台,随着不断的发展和完善,将在更多领域发挥重要作用。
超级会员免费看

514

被折叠的 条评论
为什么被折叠?



