Coq 这样从存在量词到普遍量词的转换总是可能的吗?
我正在阅读/测试Coq中的证明Coq 这样从存在量词到普遍量词的转换总是可能的吗?,coq,coq-tactic,Coq,Coq Tactic,我正在阅读/测试Coq中的证明 Theorem ceval_step__ceval: forall c st st', (exists i, ceval_step st c i = Some st') -> c / st || st'. 特定的函数/定义并不重要,因为它们没有被使用。经过几步之后,定理被转化为一种形式,其中内部存在量词被转化为一个通用量词: 1 subgoals ______________________________________(1/1) foral
Theorem ceval_step__ceval: forall c st st',
(exists i, ceval_step st c i = Some st') -> c / st || st'.
特定的函数/定义并不重要,因为它们没有被使用。经过几步之后,定理被转化为一种形式,其中内部存在量词被转化为一个通用量词:
1 subgoals
______________________________________(1/1)
forall (c : com) (st st' : state) (i : nat),
ceval_step st c i = Some st' -> c / st || st'
这基本上是,
Theorem ceval_step__ceval'': forall c st st', forall i
ceval_step st c i = Some st' -> c / st || st'.
虽然这并不是用一字不差地取代exists i
,但我还是有点惊讶。我想知道这种用普遍性代替存在量词的方法是否总是可行的,或者什么时候可能?这种转换的一般规则/技术是什么
(我模模糊糊地记得一个叫skolemization的东西,但在学习时不太明白。)
Coq(8.4)中转换定理的步骤如下:
Proof.
intros c st st' H.
inversion H as [i E].
clear H.
generalize dependent i.
generalize dependent st'.
generalize dependent st.
generalize dependent c.
是的,这总是可能的!你偶然发现了一对相互依存的情侣。使用,您可以将存在a:a,pa
视为一个依赖对,由类型a
的值a
和依赖于a
的命题证明P
组成。以下是exists
产品的从属咖喱/未咖喱的定义
Variable A : Type.
Variable P : A -> Prop.
Variable Q : Prop.
Definition dependentCurryProp (h : (exists a:A, P a) -> Q) : forall a:A, P a -> Q :=
fun a p => h (ex_intro _ a p).
Definition dependentUncurryProp (h : forall a:A, P a -> Q) : (exists a:A, P a) -> Q :=
fun e => match e with ex_intro _ a p => h a p end.
您可以使用策略语言编写相同的函数
Lemma dependentCurryProd (h : (exists a:A, P a) -> Q) : forall a:A, P a -> Q.
intros a p.
apply h.
exists a.
apply p.
Qed.
Lemma dependentUncurryProd (h : forall a:A, P a -> Q) : (exists a:A, P a) -> Q.
intros e.
destruct e as [a p].
eapply h.
apply p.
Qed.
同样的技巧也适用于从属产品,其中第一个值a
为a
类型,第二个值b
为b a
(而不是命题的证明)。这种产品被称为sigma类型sigT a B
或{a:a&B a}
Variable C : Type.
Variable B : A -> Type.
Definition dependentCurry (f : {a:A & B a} -> C) : forall a:A, B a -> C :=
fun a b => f (existT _ a b).
Definition dependentUncurry (f : forall a:A, B a -> C) : {a:A & B a} -> C :=
fun p => match p with existT _ a b => f a b end.
我认为这与skolemization没有任何关系。如果您发布所有导入的工作代码等,并且尽可能简化问题,会更容易提供帮助。@KonstantinWeitz,谢谢您的回答。我想保持简短,不想简化有趣的部分,因为我不知道哪部分是相关的。