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

我正在阅读/测试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)
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,谢谢您的回答。我想保持简短,不想简化有趣的部分,因为我不知道哪部分是相关的。