You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ssreflect inversion操作如何同时获取值与类型两个相等式?

背景定义

你拥有如下可编译的Coq代码定义:

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'

解决方法

你可以在case tactic中显式为两个参数分别指定等式绑定变量,写法如下:

case E1: _ E2: _ / H => // [v1' t1' v2' t2' jv1 jv2].

执行后会同时得到两个等式:

  • E1 : VPair v1 v2 = VPair v1' v2'
  • E2 : TPair t1 t2 = TPair t1' t2'

后续用injection处理这两个等式导出等量关系,替换后即可完成证明,完整参考代码如下:

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 E1: _ E2: _ / H => // [v1' t1' v2' t2' jv1 jv2].
by injection E1 E2 => -> -> -> ->; split.
Qed.

内容的提问来源于stack exchange,提问作者Andrey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 22:57:03