Coq产生的归纳原理与我所希望的不一样

Coq产生的归纳原理与我所希望的不一样,coq,induction,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) : p

为便于理解而编辑

我试图证明一种特殊类型树的性质。这棵树如下所示。问题是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).
我需要对树的结构进行归纳。然而,如果我做了
介绍;归纳H.
然后第一个子目标是
(例如,G,R |=f-->G)
即,关于f和G所需结构的信息丢失(我希望
(例如,G,R |=a-->a)
)。(同样,对于归纳的情况,归纳假设声明
(例如,G,R |=f-->G)
,这对我来说似乎很奇怪)

我尝试过的另一种方法是记住
(G |-f-->G)
,以保持f和G的结构可用。然后,证明以
介绍的形式进行;记住(G |-f-->G)作为H.H.中的stmt。
然后,我获得了目标和环境,就像我期望的基本情况一样。然而,为了证明案例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

我想我理解你的问题,但我必须完整地回答你的问题。如果您像@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.
事实上,我们遇到的问题与你在问题中描述的问题相同。解决方法是在记忆之后和进行归纳之前,还原

intros.
remember (G |- f ---> g) as stmt. revert f g R G Heqstmt.
induction H; intros.

现在归纳假设仍然很奇怪,但它们应该是有效的。

谢谢你的帮助。最后,我自己找到了解决办法。诀窍在于定义一个辅助函数
h:statement->Prop
,正如归纳原理所期望的那样,并使用此函数代替
(E,G,R |=f-->G)

Hi Myr。不幸的是,如果没有完整的、自包含的示例,在这里很难看到问题。我完全可以肯定,你的归纳假设不够笼统,请参见
概括
,但同样,在不了解更多细节的情况下很难说。在应用归纳之前,你可以尝试
还原
尽可能多的假设,看看你得到了什么。我更新了描述。还原和泛化对我没有帮助:(我想知道你是如何定义这样的符号
E,G,R |=a-->b
。我不能让Coq解析这样的表达式,不管我使用什么符号。符号是从以下Coq代码行获得的:
符号“E,R |-f感谢您的输入。这似乎不起作用,我找到了一个不同的解决方案。我得到的归纳假设包含所有(f g:Prop)(R G0:propVar_关系),g |-a--->b=G0 |-f--->g
,这很奇怪,但如果您用
(f:=a)
(g:=b)实例化
,你会得到一个有用的假设。
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.
intros.
remember (G |- f ---> g) as stmt. revert f g R G Heqstmt.
induction H; intros.