わかりやすいように編集
特殊な種類の木の特性を証明しようとしています。このツリーは次のようなものです。問題は、Coq によって生成された誘導原理が、ツリーのプロパティを証明するには不十分であることです。より簡単な例として、次のタイプがすべての「ツリー」を表すとします。
Inductive prv_tree(E:BES) : statement -> Prop :=
| REFL (G:propVar_relation)(a:Prop) :
prv_tree E (G |- a ---> a)
| TRA (G:propVar_relation) (a b c:Prop) :
prv_tree E (G |- a ---> b) -> prv_tree E (G |- b ---> c) ->
prv_tree E (G |- a ---> c).
次に、すべてのツリーの健全性を証明するには (含意など)、次の補題を証明する必要があります。
Lemma soundness: forall E:BES, forall f g:Prop, forall R G:propVar_relation,
(prv_tree E (G |- f ---> g)) -> (E,G,R |= f --> g).
そのためには、ツリーの構造に帰納法を適用する必要があります。ただし、intros;induction H.
そうすると、最初のサブゴールは(E,G,R |= f --> g)
、必要な f と g の構造に関する情報が失われることです (必要です(E,G,R |= a --> a)
)。(また、帰納の場合、帰納仮説は と述べています(E,G,R |= f --> g)
が、これは私には奇妙に思えます)。
私が試みた別のアプローチは(G |- f ---> g)
、 f と g の構造を利用可能にしておくために を覚えておくことです。その後、証明は次のように進みます。intros;remember (G |- f --> g) as stmt in H.induction H.
次に、基本ケースに期待するような目標と環境を取得します。ただし、ケース TRA を証明するために、次の証明コンテキストを取得します。
H : prv_tree E (G0 |- a --> b)
H0 : prv_tree E (G0 |- b --> c)
IHprv_tree1 : G0 |- a --> b = G |- f --> g -> (E,G,R |= f --> g)
IHprv_tree2 : G0 |- b --> c = G |- f --> g -> (E,G,R |= f --> g)
私は誘導仮説が
IHprv_tree1 : prv_tree E (G0 |- a --> b) -> (E,G,R |= a --> b)
IHprv_tree2 : prv_tree E (G0 |- b --> c) -> (E,G,R |= b --> c)
古いテキスト
特殊な種類の木の特性を証明しようとしています。このツリーは、21 の異なるルールを使用して構築できます (ここではすべてを繰り返しません)。問題は、Coq によって生成された誘導原理が、ツリーのプロパティを証明するには不十分であることです。
ツリーは次のように構築されます
Inductive prv_tree (E:BES): (*BES ->*) statement -> Prop := .... (*constructors go here*).
これらのコンストラクタの 1 つが
CTX: forall a b c:propForm, forall x:propVar, forall G:propVar_relation, (prv_tree E (makeStatement G a b) -> (prv_tree E (makeStatement G (replace c x a) (replace c x b))))
私の目標は証明することです
Lemma soundness: forall E:BES, forall f g:propForm, forall G:propVar_relation, forall tree:prv_tree E (makeStatement G f g), rel_cc_on_propForm E (cc_max E) G f g.
makeStatement G f g
そうしないと、f と g の構造に関する情報が失われるので、これを行うために覚えています。次に、ツリーに誘導を適用します。すべてのケースを個別の補題として証明しました。これは、基本ケースにうまく使用できます。ただし、帰納的なケースでは、Coq によって提示された帰納仮説は使用できません。たとえば、前述の CTX コンストラクターの場合、次の帰納仮説が得られます。
IHP {| context := G; stm_l := a; stm_r := b |} = {| context := empty_relation; stm_l := replace c x a; stm_r := replace c x b |} -> E, cc_max E |- replace c x a <,_ empty_relation replace c x b
私は使用できません。代わりに、次のようなものが欲しい
IHP prv_tree E {| context := G; stm_l := a; stm_r := b |} -> E, cc_max E |- replace c x a <,_ empty_relation replace c x b
誰かがこれを修正する方法を私に説明できますか? これまでのところ、私は prv_tree で独自の誘導原理を定義しようとしましたが、これは同じ問題を引き起こすので、これは間違っていたのでしょうか?
私自身の誘導原理におけるCTXのステートメントは次のとおりです。
(forall a b c:propForm, forall x:propVar, forall G:propVar_relation, (prv_tree E {| context := G; stm_l := a; stm_r := b |} ) -> P {| context := G; stm_l := replace c x a; stm_r := replace c x b |})