我对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
,但这是一个随意的选择。任何Set
(Set
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.
我的问题:
QuantifiedConsequent
可以证明吗?如何,用哪种战术?Set
,Prop
或Type
,未量化?如果Coq更宽松,是否会出现任何不一致的情况?答案 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
的表达式时,这将导致实例化定理的证明。