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]. *)

但在我看来我需要同时使用它们。怎么做?

在这种情况下,您可以使用非常方便的 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 一起使用。

这之后的证明就很简单了。