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
この種の存在量指定子を普遍的なものに置き換えることは常に可能か、それともいつ可能になるのか疑問に思っていました. この変換の一般的なルール/テクニックは何ですか?
(スコーレミゼーションと呼ばれるものをぼんやりと覚えていますが、それを学習したときはよくわかりませんでした。)
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.