ssreflect 反演,我需要两个方程而不是一个
ssreflect inversion, I need two equations instead of one
我有下一个定义(代码可以编译):
From mathcomp Require Import all_ssreflect.
Set Implicit Arguments.
Set Asymmetric Patterns.
Unset Strict Implicit.
Unset Printing Implicit Defensive.
Inductive val : Set := VConst of nat | VPair of val & val.
Inductive type : Set := TNat | TPair of type & type.
Inductive tjudgments_val : val -> type -> Prop :=
| TJV_nat n :
tjudgments_val (VConst n) TNat
| TJV_pair v1 t1 v2 t2 :
tjudgments_val v1 t1 ->
tjudgments_val v2 t2 ->
tjudgments_val (VPair v1 v2) (TPair t1 t2).
我想证明以下引理:
Lemma tjexp_pair v1 t1 v2 t2 (H : tjudgments_val (VPair v1 v2) (TPair t1 t2)) :
tjudgments_val v1 t1 /\ tjudgments_val v2 t2.
Proof.
case E: _ _ / H => // [v1' t1' v2' t2' jv1 jv2].
(* case E: _ / H => // [v1' t1' v2' t2' jv1 jv2]. *)
-
case E: _ _ / H => // [v1' t1' v2' t2' jv1 jv2].
留给我 E : VPair v1 v2 = VPair v1' v2'
。
-
case E: _ / H => // [v1' t1' v2' t2TPair t1 t2 = TPair t1' t2'' jv1 jv2].
留给我 E : TPair t1 t2 = TPair t1' t2'
。
但在我看来我需要同时使用它们。怎么做?
在这种情况下,您可以使用非常方便的 inversion
策略,它是 case
策略的增强版,它会自动完成您手动尝试执行的索引工作。到这里inversion H
就差不多可以证明了。
有一个 way 使用 inversion
的力量与 ssreflect 策略。
Derive Inversion tjudgments_val_inv with (forall v t, tjudgments_val v t).
您可以将它与 elim/tjudgments_val_inv: H
一起使用。
这之后的证明就很简单了。
我有下一个定义(代码可以编译):
From mathcomp Require Import all_ssreflect.
Set Implicit Arguments.
Set Asymmetric Patterns.
Unset Strict Implicit.
Unset Printing Implicit Defensive.
Inductive val : Set := VConst of nat | VPair of val & val.
Inductive type : Set := TNat | TPair of type & type.
Inductive tjudgments_val : val -> type -> Prop :=
| TJV_nat n :
tjudgments_val (VConst n) TNat
| TJV_pair v1 t1 v2 t2 :
tjudgments_val v1 t1 ->
tjudgments_val v2 t2 ->
tjudgments_val (VPair v1 v2) (TPair t1 t2).
我想证明以下引理:
Lemma tjexp_pair v1 t1 v2 t2 (H : tjudgments_val (VPair v1 v2) (TPair t1 t2)) :
tjudgments_val v1 t1 /\ tjudgments_val v2 t2.
Proof.
case E: _ _ / H => // [v1' t1' v2' t2' jv1 jv2].
(* case E: _ / H => // [v1' t1' v2' t2' jv1 jv2]. *)
-
case E: _ _ / H => // [v1' t1' v2' t2' jv1 jv2].
留给我E : VPair v1 v2 = VPair v1' v2'
。 -
case E: _ / H => // [v1' t1' v2' t2TPair t1 t2 = TPair t1' t2'' jv1 jv2].
留给我E : TPair t1 t2 = TPair t1' t2'
。
但在我看来我需要同时使用它们。怎么做?
在这种情况下,您可以使用非常方便的 inversion
策略,它是 case
策略的增强版,它会自动完成您手动尝试执行的索引工作。到这里inversion H
就差不多可以证明了。
有一个 way 使用 inversion
的力量与 ssreflect 策略。
Derive Inversion tjudgments_val_inv with (forall v t, tjudgments_val v t).
您可以将它与 elim/tjudgments_val_inv: H
一起使用。
这之后的证明就很简单了。