为便于理解而编辑
我试图证明一种特殊类型树的属性。这棵树如下所示。问题是 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*).
这些构造函数之一是
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 |})