Coq生成的归纳原理并不像我想要的那样

时间:2016-02-10 12:40:43

标签: coq induction

为了理解而编辑

我试图在特殊类型的树上证明属性。这棵树如下。问题是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 |})

2 个答案:

答案 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)