我对命题P
(或repeats l
)有一个归纳定义,列表包含重复元素,以及它的否定的功能定义Q
(或no_repeats l
)。
我想显示P <-> ~ Q
和~ P <-> Q
。我已经能够显示四个含义中的三个,但~ Q -> P
似乎有所不同,因为我无法从~Q
中提取数据。
Require Import List.
Variable A : Type.
Inductive repeats : list A -> Prop := (* repeats *)
repeats_hd l x : In x l -> repeats (x::l)
| repeats_tl l x : repeats l -> repeats (x::l).
Fixpoint no_repeats (l: list A): Prop :=
match l with nil => True | a::l' => ~ In a l' /\ no_repeats l' end.
Lemma not_no_repeats_repeats: forall l, (~ no_repeats l) -> repeats l.
induction l; simpl. tauto. intros.
在l
上进行归纳后,第二种情况是
IHl : ~ no_repeats l -> repeats l
H : ~ (~ In a l /\ no_repeats l)
============================
repeats (a :: l)
是否可以从中推断In a l \/ ~ no_repeats l
(这已足够)?
答案 0 :(得分:4)
你的陈述暗示A
上的平等支持双重否定消除:
Require Import List.
Import ListNotations.
Variable A : Type.
Inductive repeats : list A -> Prop := (* repeats *)
repeats_hd l x : In x l -> repeats (x::l)
| repeats_tl l x : repeats l -> repeats (x::l).
Fixpoint no_repeats (l: list A): Prop :=
match l with nil => True | a::l' => ~ In a l' /\ no_repeats l' end.
Hypothesis not_no_repeats_repeats: forall l, (~ no_repeats l) -> repeats l.
Lemma eq_nn_elim (a b : A) : ~ a <> b -> a = b.
Proof.
intros H.
assert (H' : ~ no_repeats [a; b]).
{ simpl. intuition. }
apply not_no_repeats_repeats in H'.
inversion H'; subst.
{ subst. simpl in *. intuition; tauto. }
inversion H1; simpl in *; subst; intuition.
inversion H2.
Qed.
并非每种类型都支持eq_nn_elim
,这意味着您只能通过在not_no_repeats_repeats
上添加其他假设来证明A
。应该假设A
具有可判定的平等性;那就是:
Hypothesis eq_dec a b : a = b \/ a <> b.