Coq中普遍量化的模态推理

时间:2014-05-06 13:18:23

标签: coq

我对Coq定理证明者比较陌生。因此,在完成教程时,我可能已经错过了一些基本的东西。

在我提出问题之前,让我假设一些假设并回顾 modus ponens

Coq < Parameter Antecedent : Prop .
Coq < Parameter Consequent : Prop .
Coq < Conjecture Minor : Antecedent .
Coq < Conjecture Major : Antecedent -> Consequent .

通过这些假设,可以应用模态推理:可以基于Consequent范围和Minor范围来构造推断的Major的证明。这样的证明只是Major与参数Minor的函数应用。

Coq < Theorem ConsequentProof : Consequent . Proof . exact (Major Minor) . Qed .

那非常整洁。

所以,现在我想知道:在Coq中可能采用普遍量化的命题进行推理吗?

在我的例子中,我让变量范围超过nat,但这是一个随意的选择。任何SetSet s的任意组合?)(任何Type?)都可以。

Coq < Parameter FunctionAntecedent : nat -> Prop .
Coq < Parameter FunctionConsequent : nat -> Prop .
Coq < Conjecture QuantifiedMinor : forall n
           : nat, FunctionAntecedent n .
Coq < Conjecture QuantifiedMajor : forall n
           : nat, FunctionAntecedent n -> FunctionConsequent n .

我现在可以证明forall n : nat, FunctionConsequent n吗? 我的尝试不起作用:

Coq < Theorem QuantifiedConsequentProof : forall n : nat, FunctionConsequent n .
QuantifiedConsequentProof < Proof .
QuantifiedConsequentProof < exact (forall n : nat,
                                        QuantifiedMajor n (QuantifiedMinor n)) .
QuantifiedConsequentProof < Abort .

这是错误输出:

> exact (forall n : nat, QuantifiedMajor n (QuantifiedMinor n)) .
>                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Error: In environment
n : nat
The term "QuantifiedMajor n (QuantifiedMinor n)" has type
"FunctionConsequent n" which should be Set, Prop or Type.

我的问题:

  1. QuantifiedConsequent可以证明吗?如何,用哪种战术?
  2. 或者我还需要其他假设吗?
  3. 另外:类型限制的基本原理是什么(SetPropType,未量化?如果Coq更宽松,是否会出现任何不一致的情况?
  4. 最后,作为任何启发性解释的全能问题:我错过了什么吗?

2 个答案:

答案 0 :(得分:2)

当然,诀窍是forall在这里使用是错误的,forall构建了一个抽象的东西,但相应的术语是一个函数。

 Theorem fancy : forall (p q : nat -> Prop),
    (forall n, p n) -> (forall n, p n -> p q) -> (forall n, q n).
   exact (fun P Q pproof impl =>
              fun n => impl _ (pproof n)).
 Qed.

这也可以通过良好的旧auto来解决。你可以得出一个罗素悖论式悖论,如果你不进行分类,如果我们允许Set : Set代替Set : Type那么我们就会遇到大问题。

你似乎唯一缺少的是forall只是->的广义版本,见证一些普遍量化的陈述将是一些lambda。你以前避免使用它的原因是Conjecture而不是一个术语内的所有内容。

答案 1 :(得分:1)

谢谢你,jozefg。我想通了。

我需要使用的策略是intro

Coq < Theorem QuantifiedConsequentProof : forall n : nat, FunctionConsequent n .
QuantifiedConsequentProof < Proof .
QuantifiedConsequentProof < intro .
QuantifiedConsequentProof < exact (QuantifiedMajor n (QuantifiedMinor n)) .
QuantifiedConsequentProof < Qed .

策略intro将普遍量化的变量从命题提升到工作假设。

使用

Coq < Print QuantifiedConsequentProof .

然后我可以看到这个构造的证明,我可以从中推断出另一种exact方法来定义它:

Coq < Theorem QuantifiedConsequentProof : forall n : nat, FunctionConsequent n .
QuantifiedConsequentProof < Proof .
QuantifiedConsequentProof < exact (fun n : nat =>
                                        QuantifiedMajor n (QuantifiedMinor n)) .
QuantifiedConsequentProof < Qed .

所以,基本上我的错误是证明应该是一个函数,而不是forall - 表达式。证明的类型forall - 命题,但证明本身就是一个函数。

实际上,我越是想到它,它就越有意义:这个证明作为一个函数,可以反过来应用于一个论证,从而产生一个新的证明。当应用于具有类型nat的表达式时,这将导致实例化定理的证明。