G3: Wyższe Typy Induktywne [TODO]
From Typonomikon Require Import BC2i.
Tutaj jakieś nie-homotopiczne przykłady, np. pary nieuporządkowane, zbiory,
albo coś w ten deseń.
Wstęp (TODO)
Trochę narzędzi wziętych z Homotopicznej Teorii Typów. Są one już zdefiniowane
w bibliotece standardowej pod innymi nazwami, ale dla jasności będziemy używać
HoTTowych nazw.
Transport to po prostu przepisywanie.
Definition transport {A : Type} (P : A -> Type) {x y : A} (p : x = y) : P x -> P y :=
match p with
| eq_refl _ => fun u : P x => u
end.
Funkcje zachowują równość.
Definition ap
{A B : Type} (f : A -> B) {x y : A} (p : x = y) : f x = f y :=
match p with
| eq_refl => eq_refl
end.
Zależne funkcje też zachowują równość.
Definition apd
{A : Type} {P : A -> Type} (f : forall x : A, P x) {x y : A} (p : x = y)
: transport P p (f x) = (f y) :=
match p with
| eq_refl => eq_refl
end.
Pary nieuporządkowane (TODO)
Module UPair.
Private Inductive UPair (A : Type) : Type :=
| upair : A -> A -> UPair A.
Arguments upair {A} _ _.
Axiom comm :
forall {A : Type} (x y : A), upair x y = upair y x.
Section rec.
Context
(A : Type)
(P : Type)
(upair' : A -> A -> P)
(comm' : forall (x y : A), upair' x y = upair' y x).
Definition UPair_rec
(comm' : forall (x y : A), upair' x y = upair' y x)
(u : UPair A) : P :=
match u with
| upair x y => upair' x y
end.
Axiom UPair_rec_comm :
forall (x y : A),
ap (UPair_rec comm') (comm x y) = comm' x y.
End rec.
Section ind.
Context
(A : Type)
(P : UPair A -> Prop)
(upair' : forall (x y : A), P (upair x y)).
Definition UPair_ind (u : UPair A) : P u :=
match u with
| upair x y => upair' x y
end.
End ind.
Section rect.
Context
(A : Type)
(P : UPair A -> Type)
(upair' : forall (x y : A), P (upair x y))
(Comm' :=
forall (x y : A),
transport _ (comm x y) (upair' x y) = upair' y x)
(comm' : Comm').
Definition UPair_rect (comm' : Comm') (u : UPair A) : P u :=
match u with
| upair x y => upair' x y
end.
Axiom UPair_rect_comm :
forall (x y : A),
apd (UPair_rect comm') (comm x y) = comm' x y.
End rect.
End UPair.
Import UPair.
Definition swap {A : Type} (u : UPair A) : UPair A.
Proof.
refine (UPair_rec A (UPair A)
(fun x y => upair y x)
_
u).
now intros; apply comm.
Defined.
Lemma no_fst :
~ (forall {A : Type}, exists (fst : UPair A -> A), forall x y : A, fst (upair x y) = x).
Proof.
intros H.
cut (true = false); [now congruence |].
destruct (H bool) as [fst fst_spec].
rewrite <- (fst_spec true false).
rewrite comm.
rewrite fst_spec.
easy.
Qed.
Typy ilorazowe (TODO)
Domknięcie kozwrotne (TODO)
Module CoReflexiveClosure.
Private Inductive CoReflexiveClosureCarrier {A : Type} (R : rel A) : Type :=
| embed : A -> CoReflexiveClosureCarrier R.
Arguments embed {A R} _.
Axiom WRCC_equal :
forall {A : Type} {x y : A} {R : rel A},
R x y -> @embed _ R x = @embed _ R y.
Inductive CoReflexiveClosure {A : Type} (R : rel A)
: rel (CoReflexiveClosureCarrier R) :=
| step : forall x y : A, R x y -> CoReflexiveClosure R (embed x) (embed y).
End CoReflexiveClosure.