功能定性和归纳定义之间的平等

时间:2017-12-07 16:52:51

标签: coq

我对命题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(这已足够)?

1 个答案:

答案 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.