为了理解而编辑
我试图在特殊类型的树上证明属性。这棵树如下。问题是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 |})
答案 0 :(得分:0)
我想我理解你的问题,但我必须填写你问题的整体。如果你想出一个自成一体的例子会更容易,就像@ejgallego建议的那样。
以下是我如何模拟您的问题:
Axiom BES : Type.
Axiom propVar_relation : Type.
Inductive statement :=
| Stmt : propVar_relation -> Prop -> Prop -> statement.
Notation "G |- a ---> b" := (Stmt G a b) (at level 50).
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) (f g:Prop) (R G:propVar_relation),
(prv_tree E (G |- f ---> g)) -> R = R.
确实,我们遇到了与您在问题中描述的问题相同的问题。在记忆之后和进行归纳之前,解决方案是revert
。
intros.
remember (G |- f ---> g) as stmt. revert f g R G Heqstmt.
induction H; intros.
现在归纳假设仍然很奇怪,但它们应该有效。
答案 1 :(得分:0)
感谢您的帮助。最后,我自己找到了解决方案。诀窍在于定义辅助函数h:statement -> Prop
,正如归纳原则所预期的那样,并使用此函数代替(E,G,R |= f --> g)
。