Theory HoTT_Univalence
theory HoTT_Univalence
imports HoTT_Equivalence
begin
section ‹The canonical map from identity to equivalence›
definition idtoequiv ::
"level ⇒ expr ⇒ expr ⇒ expr ⇒ expr"
where
"idtoequiv i A B p ≡
identity_ind (universe i) A
(λB _. equivalence A B)
(identity_equivalence A) B p"
lemma idtoequiv_type:
assumes A: "A ∷⇩h universe i"
and B: "B ∷⇩h universe i"
and p: "p ∷⇩h identity_type (universe i) A B"
shows "idtoequiv i A B p ∷⇩h equivalence A B"
unfolding idtoequiv_def
proof (rule identity_elim)
show "universe i ∷⇩h universe (level_succ i)"
by (rule universe_form)
next
show "A ∷⇩h universe i" by (rule A)
next
fix X q
assume X: "X ∷⇩h universe i"
assume "q ∷⇩h identity_type (universe i) A X"
show "equivalence A X ∷⇩h universe i"
by (rule equivalence_form[OF A X])
next
show "identity_equivalence A ∷⇩h equivalence A A"
by (rule identity_equivalence_type[OF A])
next
show "B ∷⇩h universe i" by (rule B)
next
show "p ∷⇩h identity_type (universe i) A B" by (rule p)
qed
lemma idtoequiv_refl [simp]:
"idtoequiv i A A (reflexivity (universe i) A) ≡
identity_equivalence A"
unfolding idtoequiv_def by simp
definition idtoequiv_map ::
"level ⇒ expr ⇒ expr ⇒ expr"
where
"idtoequiv_map i A B ≡
lambda (identity_type (universe i) A B)
(λp. idtoequiv i A B p)"
lemma idtoequiv_map_type:
assumes A: "A ∷⇩h universe i"
and B: "B ∷⇩h universe i"
shows "idtoequiv_map i A B ∷⇩h
arrow (identity_type (universe i) A B) (equivalence A B)"
proof -
have paths: "identity_type (universe i) A B
∷⇩h universe (level_succ i)"
by (rule identity_form[OF universe_form A B])
show "idtoequiv_map i A B ∷⇩h
arrow (identity_type (universe i) A B) (equivalence A B)"
unfolding idtoequiv_map_def
proof (rule arrow_intro[OF paths])
fix p
assume p: "p ∷⇩h identity_type (universe i) A B"
show "idtoequiv i A B p ∷⇩h equivalence A B"
by (rule idtoequiv_type[OF A B p])
qed
qed
section ‹Univalence›
consts
univalence_witness :: "level ⇒ expr ⇒ expr ⇒ expr"
axiomatization where
univalence:
"A ∷⇩h universe i ⟹ B ∷⇩h universe i ⟹
univalence_witness i A B ∷⇩h
biinvertible
(identity_type (universe i) A B)
(equivalence A B)
(idtoequiv_map i A B)"
definition univalence_equivalence ::
"level ⇒ expr ⇒ expr ⇒ expr"
where
"univalence_equivalence i A B ≡
pair (idtoequiv_map i A B) (univalence_witness i A B)"
theorem univalence_equivalence_type:
assumes A: "A ∷⇩h universe i"
and B: "B ∷⇩h universe i"
shows "univalence_equivalence i A B ∷⇩h
equivalence (identity_type (universe i) A B) (equivalence A B)"
unfolding univalence_equivalence_def
proof (rule equivalence_intro)
show "idtoequiv_map i A B ∷⇩h
arrow (identity_type (universe i) A B) (equivalence A B)"
by (rule idtoequiv_map_type[OF A B])
next
show "univalence_witness i A B ∷⇩h
biinvertible
(identity_type (universe i) A B)
(equivalence A B)
(idtoequiv_map i A B)"
by (rule univalence[OF A B])
qed
end