我正在阅读/测试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.
答案 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>";
}
我认为这与石油化没有任何关系。