Я читаю/тестирую доказательство в 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.