HITs-Examples/Integers.v

632 lines
10 KiB
Coq
Raw Normal View History

2017-01-02 13:08:36 +01:00
Require Import HoTT.
Require Export HoTT.
Module Export Ints.
Private Inductive Z : Type0 :=
| nul : Z
| succ : Z -> Z
| pred : Z -> Z.
Axiom inv1 : forall n : Z, n = pred(succ n).
Axiom inv2 : forall n : Z, n = succ(pred n).
Fixpoint Z_rec
(P : Type)
(a : P)
(s : P -> P)
(p : P -> P)
(i1 : forall (m : P), m = p(s m))
(i2 : forall (m : P), m = s(p m))
(x : Z)
{struct x}
: P
:=
(match x return _ -> _ -> P with
| nul => fun _ => fun _ => a
| succ n => fun _ => fun _ => s ((Z_rec P a s p i1 i2) n)
| pred n => fun _ => fun _ => p ((Z_rec P a s p i1 i2) n)
end) i1 i2.
Axiom Z_rec_beta_inv1 : forall
(P : Type)
(a : P)
(s : P -> P)
(p : P -> P)
(i1 : forall (m : P), m = p(s m))
(i2 : forall (m : P), m = s(p m))
(n : Z)
, ap (Z_rec P a s p i1 i2) (inv1 n) = i1 (Z_rec P a s p i1 i2 n).
Axiom Z_rec_beta_inv2 : forall
(P : Type)
(a : P)
(s : P -> P)
(p : P -> P)
(i1 : forall (m : P), m = p(s m))
(i2 : forall (m : P), m = s(p m))
(n : Z)
, ap (Z_rec P a s p i1 i2) (inv2 n) = i2 (Z_rec P a s p i1 i2 n).
Fixpoint Z_ind
(P : Z -> Type)
(a : P nul)
(s : forall (n : Z), P n -> P (succ n))
(p : forall (n : Z), P n -> P (pred n))
(i1 : forall (n : Z) (m : P n), (inv1 n) # m = p (succ n) (s (n) m))
(i2 : forall (n : Z) (m : P n), (inv2 n) # m = s (pred n) (p (n) m))
(x : Z)
{struct x}
: P x
:=
(match x return _ -> _ -> P x with
| nul => fun _ => fun _ => a
| succ n => fun _ => fun _ => s n ((Z_ind P a s p i1 i2) n)
| pred n => fun _ => fun _ => p n ((Z_ind P a s p i1 i2) n)
end) i1 i2.
Axiom Z_ind_beta_inv1 : forall
(P : Z -> Type)
(a : P nul)
(s : forall (n : Z), P n -> P (succ n))
(p : forall (n : Z), P n -> P (pred n))
(i1 : forall (n : Z) (m : P n), (inv1 n) # m = p (succ n) (s (n) m))
(i2 : forall (n : Z) (m : P n), (inv2 n) # m = s (pred n) (p (n) m))
(n : Z)
, apD (Z_ind P a s p i1 i2) (inv1 n) = i1 n (Z_ind P a s p i1 i2 n).
Axiom Z_ind_beta_inv2 : forall
(P : Z -> Type)
(a : P nul)
(s : forall (n : Z), P n -> P (succ n))
(p : forall (n : Z), P n -> P (pred n))
(i1 : forall (n : Z) (m : P n), (inv1 n) # m = p (succ n) (s (n) m))
(i2 : forall (n : Z) (m : P n), (inv2 n) # m = s (pred n) (p (n) m))
(n : Z)
, apD (Z_ind P a s p i1 i2) (inv2 n) = i2 n (Z_ind P a s p i1 i2 n).
End Ints.
Definition negate : Z -> Z.
Proof.
intro x.
refine (Z_rec _ _ _ _ _ _ x).
Unshelve.
Focus 1.
apply nul.
Focus 3.
apply pred.
Focus 3.
apply succ.
Focus 2.
apply inv1.
apply inv2.
Defined.
Definition plus : Z -> Z -> Z.
Proof.
intro x.
refine (Z_rec _ _ _ _ _ _).
Unshelve.
Focus 1.
apply x.
Focus 3.
apply succ.
Focus 3.
apply pred.
Focus 1.
apply inv1.
apply inv2.
Defined.
Definition minus (x : Z) (y : Z) := plus x (negate y).
Definition Z_to_S : Z -> S1.
Proof.
refine (Z_rec _ _ _ _ _ _).
Unshelve.
Focus 1.
apply base.
Focus 3.
intro x.
apply x.
Focus 3.
intro x.
apply x.
Focus 1.
intro m.
compute.
reflexivity.
refine (S1_ind _ _ _).
Unshelve.
Focus 2.
apply loop.
2017-01-02 13:15:17 +01:00
rewrite @HoTT.Types.Paths.transport_paths_FlFr.
2017-01-02 13:08:36 +01:00
rewrite ap_idmap.
rewrite concat_Vp.
rewrite concat_1p.
reflexivity.
Defined.
Lemma eq1 : ap Z_to_S (inv1 (pred (succ (pred nul)))) = reflexivity base.
Proof.
rewrite Z_rec_beta_inv1.
reflexivity.
Qed.
Lemma eq2 : ap Z_to_S (ap pred (inv2 (succ (pred nul)))) = loop.
Proof.
rewrite <- ap_compose.
enough (forall (n m : Z) (p : n = m), ap Z_to_S p = ap (fun n : Z => Z_to_S(pred n)) p).
Focus 2.
compute.
reflexivity.
rewrite Z_rec_beta_inv2.
compute.
reflexivity.
Qed.
Module Export AltInts.
Private Inductive Z' : Type0 :=
| positive : nat -> Z'
| negative : nat -> Z'.
Axiom path : positive 0 = negative 0.
Fixpoint Z'_ind
(P : Z' -> Type)
(po : forall (x : nat), P (positive x))
(ne : forall (x : nat), P (negative x))
(i : path # (po 0) = ne 0)
(x : Z')
{struct x}
: P x
:=
(match x return _ -> P x with
| positive n => fun _ => po n
| negative n => fun _ => ne n
end) i.
Axiom Z'_ind_beta_inv1 : forall
(P : Z' -> Type)
(po : forall (x : nat), P (positive x))
(ne : forall (x : nat), P (negative x))
(i : path # (po 0) = ne 0)
, apD (Z'_ind P po ne i) path = i.
End AltInts.
Definition succ_Z' : Z' -> Z'.
Proof.
refine (Z'_ind _ _ _ _).
Unshelve.
Focus 2.
intro n.
apply (positive (S n)).
Focus 2.
intro n.
induction n.
apply (positive 1).
apply (negative n).
simpl.
rewrite transport_const.
reflexivity.
Defined.
Definition pred_Z' : Z' -> Z'.
Proof.
refine (Z'_ind _ _ _ _).
Unshelve.
Focus 2.
intro n.
induction n.
apply (negative 1).
apply (positive n).
Focus 2.
intro n.
apply (negative (S n)).
simpl.
rewrite transport_const.
reflexivity.
Defined.
Fixpoint Nat_to_Pos (n : nat) : Pos :=
match n with
| 0 => Int.one
| S k => succ_pos (Nat_to_Pos k)
end.
Definition Z'_to_Int : Z' -> Int.
Proof.
refine (Z'_ind _ _ _ _).
Unshelve.
Focus 2.
intro x.
induction x.
apply (Int.zero).
apply (succ_int IHx).
Focus 2.
intro x.
induction x.
apply (Int.zero).
apply (pred_int IHx).
simpl.
rewrite transport_const.
reflexivity.
Defined.
Definition Pos_to_Nat : Pos -> nat.
Proof.
intro x.
induction x.
apply 1.
apply (S IHx).
Defined.
Definition Int_to_Z' (x : Int) : Z'.
Proof.
induction x.
apply (negative (Pos_to_Nat p)).
apply (positive 0).
apply (positive (Pos_to_Nat p)).
Defined.
Lemma Z'_to_int_pos_homomorphism :
forall n : nat, Z'_to_Int (positive (S n)) = succ_int (Z'_to_Int (positive n)).
Proof.
intro n.
reflexivity.
Qed.
Lemma Z'_to_int_neg_homomorphism :
forall n : nat, Z'_to_Int (negative (S n)) = pred_int (Z'_to_Int (negative n)).
Proof.
intro n.
reflexivity.
Qed.
Theorem isoEq1 : forall x : Int, Z'_to_Int(Int_to_Z' x) = x.
Proof.
intro x.
induction x.
induction p.
reflexivity.
rewrite Z'_to_int_neg_homomorphism.
rewrite IHp.
reflexivity.
reflexivity.
induction p.
reflexivity.
rewrite Z'_to_int_pos_homomorphism.
rewrite IHp.
reflexivity.
Defined.
Lemma Int_to_Z'_succ_homomorphism :
forall x : Int, Int_to_Z' (succ_int x) = succ_Z' (Int_to_Z' x).
Proof.
simpl.
intro x.
simpl.
induction x.
induction p.
compute.
apply path.
reflexivity.
reflexivity.
induction p.
reflexivity.
reflexivity.
Qed.
Lemma Int_to_Z'_pred_homomorphism :
forall x : Int, Int_to_Z' (pred_int x) = pred_Z' (Int_to_Z' x).
Proof.
intro x.
induction x.
induction p.
reflexivity.
reflexivity.
reflexivity.
induction p.
reflexivity.
reflexivity.
Qed.
Theorem isoEq2 : forall x : Z', Int_to_Z'(Z'_to_Int x) = x.
Proof.
refine (Z'_ind _ _ _ _).
Unshelve.
Focus 2.
intro x.
induction x.
reflexivity.
rewrite Z'_to_int_pos_homomorphism.
rewrite Int_to_Z'_succ_homomorphism.
rewrite IHx.
reflexivity.
Focus 2.
intro x.
induction x.
apply path.
rewrite Z'_to_int_neg_homomorphism.
rewrite Int_to_Z'_pred_homomorphism.
rewrite IHx.
reflexivity.
simpl.
2017-01-02 13:15:17 +01:00
rewrite @HoTT.Types.Paths.transport_paths_FlFr.
2017-01-02 13:08:36 +01:00
rewrite concat_p1.
rewrite ap_idmap.
enough (ap (fun x : Z' => Z'_to_Int x) path = reflexivity Int.zero).
rewrite ap_compose.
rewrite X.
apply concat_1p.
apply axiomK_hset.
apply hset_int.
Defined.
Theorem adj :
forall x : Z', isoEq1 (Z'_to_Int x) = ap Z'_to_Int (isoEq2 x).
Proof.
intro x.
apply hset_int.
Defined.
Definition isomorphism : IsEquiv Z'_to_Int.
Proof.
apply (BuildIsEquiv Z' Int Z'_to_Int Int_to_Z' isoEq1 isoEq2 adj).
Qed.
Axiom everythingSet : forall T : Type, IsHSet T.
Definition Z_to_Z' : Z -> Z'.
Proof.
refine (Z_rec _ _ _ _ _ _).
Unshelve.
Focus 1.
apply (positive 0).
Focus 3.
apply succ_Z'.
Focus 3.
apply pred_Z'.
Focus 1.
refine (Z'_ind _ _ _ _).
Unshelve.
Focus 2.
intros.
reflexivity.
Focus 2.
intros.
induction x.
Focus 1.
compute.
apply path^.
reflexivity.
apply everythingSet.
refine (Z'_ind _ _ _ _).
Unshelve.
Focus 2.
intros.
induction x.
Focus 1.
compute.
apply path.
reflexivity.
Focus 2.
intros.
reflexivity.
apply everythingSet.
Defined.
Definition Z'_to_Z : Z' -> Z.
Proof.
refine (Z'_ind _ _ _ _).
Unshelve.
Focus 2.
induction 1.
apply nul.
apply (succ IHx).
Focus 2.
induction 1.
Focus 1.
apply nul.
apply (pred IHx).
simpl.
rewrite transport_const.
reflexivity.
Defined.
Theorem isoZEq1 : forall n : Z', Z_to_Z'(Z'_to_Z n) = n.
Proof.
refine (Z'_ind _ _ _ _).
Unshelve.
Focus 3.
intros.
induction x.
compute.
apply path.
transitivity (Z_to_Z' (pred (Z'_to_Z (negative x)))).
enough (Z'_to_Z (negative x.+1) = pred (Z'_to_Z (negative x))).
rewrite X.
reflexivity.
reflexivity.
transitivity (pred_Z' (Z_to_Z' (Z'_to_Z (negative x)))).
Focus 1.
reflexivity.
rewrite IHx.
reflexivity.
Focus 2.
intros.
induction x.
Focus 1.
reflexivity.
transitivity (Z_to_Z' (succ (Z'_to_Z (positive x)))).
reflexivity.
transitivity (succ_Z' (Z_to_Z' (Z'_to_Z (positive x)))).
reflexivity.
rewrite IHx.
reflexivity.
apply everythingSet.
Defined.
Theorem isoZEq2 : forall n : Z, Z'_to_Z(Z_to_Z' n) = n.
Proof.
refine (Z_ind _ _ _ _ _ _).
Unshelve.
Focus 1.
reflexivity.
Focus 1.
intros.
apply everythingSet.
Focus 1.
intros.
apply everythingSet.
Focus 1.
intro n.
intro X.
transitivity (Z'_to_Z (succ_Z' (Z_to_Z' n))).
reflexivity.
transitivity (succ (Z'_to_Z (Z_to_Z' n))).
Focus 2.
rewrite X.
reflexivity.
enough (forall m : Z', Z'_to_Z (succ_Z' m) = succ (Z'_to_Z m)).
rewrite X0.
reflexivity.
refine (Z'_ind _ _ _ _).
Unshelve.
Focus 2.
intros.
reflexivity.
Focus 2.
intros.
induction x.
Focus 1.
reflexivity.
compute.
rewrite <- inv2.
reflexivity.
apply everythingSet.
intros.
transitivity (Z'_to_Z (pred_Z' (Z_to_Z' n))).
reflexivity.
transitivity (pred (Z'_to_Z (Z_to_Z' n))).
Focus 2.
rewrite X.
reflexivity.
enough (forall m : Z', Z'_to_Z (pred_Z' m) = pred (Z'_to_Z m)).
rewrite X0.
reflexivity.
refine (Z'_ind _ _ _ _).
Unshelve.
Focus 1.
apply everythingSet.
Focus 1.
intro x.
induction x.
reflexivity.
compute.
rewrite <- inv1.
reflexivity.
intro x.
reflexivity.
Defined.
Theorem adj2 :
forall x : Z', isoZEq2 (Z'_to_Z x) = ap Z'_to_Z (isoZEq1 x).
Proof.
intro x.
apply everythingSet.
Defined.
Definition isomorphism2 : IsEquiv Z'_to_Z.
Proof.
apply (BuildIsEquiv Z' Z Z'_to_Z Z_to_Z' isoZEq2 isoZEq1 adj2).
2017-01-02 13:08:36 +01:00
Qed.