(************************************************************************) (* v * The Coq Proof Assistant / The Coq Development Team *) (* | in Lego adapted to Coq by B. Barras Credit: Proofs up to [K_dec] follows an outline by Michael Hedberg *) (** We need some dependent elimination schemes *) Set Implicit Arguments. (** Bijection between [eq] and [eqT] *) Definition eq2eqT (A:Set) (x y:A) (eqxy:x = y) : x = y := match eqxy in (_ = y) return x = y with | refl_equal => refl_equal x end. Definition eqT2eq (A:Set) (x y:A) (eqTxy:x = y) : x = y := match eqTxy in (_ = y) return x = y with | refl_equal => refl_equal x end. Lemma eq_eqT_bij : forall (A:Set) (x y:A) (p:x = y), p = eqT2eq (eq2eqT p). intros. case p; reflexivity. Qed. Lemma eqT_eq_bij : forall (A:Set) (x y:A) (p:x = y), p = eq2eqT (eqT2eq p). intros. case p; reflexivity. Qed. Section DecidableEqDep. Variable A : Type. Let comp (x y y':A) (eq1:x = y) (eq2:x = y') : y = y' := eq_ind _ (fun a => a = y') eq2 _ eq1. Remark trans_sym_eqT : forall (x y:A) (u:x = y), comp u u = refl_equal y. intros. case u; trivial. Qed. Variable eq_dec : forall x y:A, x = y \/ x <> y. Variable x : A. Let nu (y:A) (u:x = y) : x = y := match eq_dec x y with | or_introl eqxy => eqxy | or_intror neqxy => False_ind _ (neqxy u) end. Let nu_constant : forall (y:A) (u v:x = y), nu u = nu v. intros. unfold nu in |- *. case (eq_dec x y); intros. reflexivity. case n; trivial. Qed. Let nu_inv (y:A) (v:x = y) : x = y := comp (nu (refl_equal x)) v. Remark nu_left_inv : forall (y:A) (u:x = y), nu_inv (nu u) = u. intros. case u; unfold nu_inv in |- *. apply trans_sym_eqT. Qed. Theorem eq_proofs_unicity : forall (y:A) (p1 p2:x = y), p1 = p2. intros. elim nu_left_inv with (u := p1). elim nu_left_inv with (u := p2). elim nu_constant with y p1 p2. reflexivity. Qed. Theorem K_dec : forall P:x = x -> Prop, P (refl_equal x) -> forall p:x = x, P p. intros. elim eq_proofs_unicity with x (refl_equal x) p. trivial. Qed. (** The corollary *) Let proj (P:A -> Prop) (exP:ex P) (def:P x) : P x := match exP with | ex_intro x' prf => match eq_dec x' x with | or_introl eqprf => eq_ind x' P prf x eqprf | _ => def end end. Theorem inj_right_pair : forall (P:A -> Prop) (y y':P x), ex_intro P x y = ex_intro P x y' -> y = y'. intros. cut (proj (ex_intro P x y) y = proj (ex_intro P x y') y). simpl in |- *. case (eq_dec x x). intro e. elim e using K_dec; trivial. intros. case n; trivial. case H. reflexivity. Qed. End DecidableEqDep. (** We deduce the [K] axiom for (decidable) Set *) Theorem K_dec_set : forall A:Set, (forall x y:A, {x = y} + {x <> y}) -> forall (x:A) (P:x = x -> Prop), P (refl_equal x) -> forall p:x = x, P p. intros. rewrite eq_eqT_bij. elim (eq2eqT p) using K_dec. intros. case (H x0 y); intros. elim e; left; reflexivity. right; red in |- *; intro neq; apply n; elim neq; reflexivity. trivial. Qed.