如何在Coq中销毁列表(nil或not nil)

如何在Coq中销毁列表(nil或not nil),coq,coq-tactic,coqide,Coq,Coq Tactic,Coqide,我想在以下两种情况下销毁列表类型的对象: H: lst = nil. H: lst <> nil H:lst=nil。 H:lst零 自定义案例分析的一种可能模式是提供自定义案例分析引理,该模式如下: From Coq Require Import List. Import ListNotations. Set Implicit Arguments. Unset Strict Implicit. Unset Printing Implicit Defensive. Induct

我想在以下两种情况下销毁列表类型的对象:

H: lst = nil.
H: lst <> nil
H:lst=nil。
H:lst零

自定义案例分析的一种可能模式是提供自定义案例分析引理,该模式如下:

From Coq Require Import List.
Import ListNotations.

Set Implicit Arguments.
Unset Strict Implicit.
Unset Printing Implicit Defensive.

Inductive list_spec A : list A -> Type :=
  | Nil_case : forall x, x = [] -> list_spec x
  | Cons_case : forall x, x <> [] -> list_spec x.

Lemma listP A (l : list A) : list_spec l.
Proof. now case l; constructor. Qed.

Lemma foo A (l : list A) : False.
Proof.
case (listP l); intros x Hx.
来自Coq要求导入列表。
导入列表符号。
设置隐式参数。
取消设置严格的隐式。
取消打印。
归纳列表\规范A:列表A->类型:=
|无案例:对于所有x,x=[]->list\u spec x
|反对理由:对于所有x,x[]->列出规格x。
引理listpa(l:list A):list_spec l。
证明。现在是案例l;构造器。Qed。
引理fooa(l:list A):False。
证明。
病例(listP l);简介x Hx。
然后你会在你的上下文中得到正确的假设。使用
destruct
而不是
case
将清除剩余的伪
l


请注意,
ssreflect
case
策略包括对这种案例分析引理的特殊支持,您通常会执行
case:l/listP。

如果您使用
destruct lst as[|fst_elnt lst]eqn:H
您可以实现两个目标,在第一个目标中,您确实拥有所需的假设

H : lst = nil
在第二个目标中,你有一个形式的假设

H : lst = fst_elnt :: lst_tl
这不是您对
H
的期望,它实际上更强。要使用预期语句获取
H
,可以键入以下内容:

rename H into H'.  (* to free the name H *)
assert (H : lst <> nil).
   rewrite H'; discriminate.
将H重命名为H'。(*以释放名称H*)
断言(H:lst nil)。
重写H′;区别对待
discrime
是一种基本策略,它表示一个数据类型的两个不同构造函数不能返回相等的值