是否始终可以将存在量词转换为通用量词?

时间:2015-12-03 02:44:15

标签: 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)
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逐字取代forall 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.

1 个答案:

答案 0 :(得分:2)

是的,这总是可能的!你偶然发现了currying个依赖对。使用Curry-Howard Isomorphism,您可以将exists a:A, P a视为依赖对,其中包含a类型的值A和依赖于P的命题证明a 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的类型为sigT A B(而不是证明一个命题)。这种产品称为sigma类型{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.

for($row=0;$row<count($list);$row++){
    echo $list[$row]['requests_users']['request_id'];
    echo "<br>";
    echo $list[$row][0]['ct'];
    echo "<br><br>";
}

我认为这与石油化没有任何关系。