lean2/hott/init/axioms/funext_from_ua.hlean

132 lines
5.1 KiB
Text
Raw Normal View History

2014-12-12 04:14:53 +00:00
-- Copyright (c) 2014 Jakob von Raumer. All rights reserved.
-- Released under Apache 2.0 license as described in the file LICENSE.
-- Author: Jakob von Raumer
-- Ported from Coq HoTT
2014-12-12 18:17:50 +00:00
prelude
2014-12-16 20:10:12 +00:00
import ..equiv ..datatypes ..types.prod
2014-12-12 18:17:50 +00:00
import .funext_varieties .ua .funext
2014-12-12 04:14:53 +00:00
2014-12-12 18:17:50 +00:00
open eq function prod sigma truncation equiv is_equiv unit ua_type
2014-12-12 04:14:53 +00:00
context
universe variables l
parameter [UA : ua_type.{l+1}]
protected theorem ua_isequiv_postcompose {A B : Type.{l+1}} {C : Type}
{w : A → B} {H0 : is_equiv w} : is_equiv (@compose C A B w) :=
let w' := equiv.mk w H0 in
2014-12-12 18:17:50 +00:00
let eqinv : A = B := ((@is_equiv.inv _ _ _ (@ua_type.inst UA A B)) w') in
2014-12-12 04:14:53 +00:00
let eq' := equiv_path eqinv in
is_equiv.adjointify (@compose C A B w)
(@compose C B A (is_equiv.inv w))
(λ (x : C → B),
2014-12-12 18:17:50 +00:00
have eqretr : eq' = w',
2014-12-12 04:14:53 +00:00
from (@retr _ _ (@equiv_path A B) (@ua_type.inst UA A B) w'),
2014-12-12 18:17:50 +00:00
have invs_eq : (to_fun eq')⁻¹ = (to_fun w')⁻¹,
2014-12-12 04:14:53 +00:00
from inv_eq eq' w' eqretr,
2014-12-12 18:17:50 +00:00
have eqfin : (to_fun eq') ∘ ((to_fun eq')⁻¹ ∘ x) = x,
2014-12-12 04:14:53 +00:00
from (λ p,
2014-12-12 18:17:50 +00:00
(@eq.rec_on Type.{l+1} A
2014-12-12 04:14:53 +00:00
(λ B' p', Π (x' : C → B'), (to_fun (equiv_path p'))
2014-12-12 18:17:50 +00:00
∘ ((to_fun (equiv_path p'))⁻¹ ∘ x') = x')
2014-12-12 04:14:53 +00:00
B p (λ x', idp))
) eqinv x,
2014-12-12 18:17:50 +00:00
have eqfin' : (to_fun w') ∘ ((to_fun eq')⁻¹ ∘ x) = x,
2014-12-12 04:14:53 +00:00
from eqretr ▹ eqfin,
2014-12-12 18:17:50 +00:00
have eqfin'' : (to_fun w') ∘ ((to_fun w')⁻¹ ∘ x) = x,
2014-12-12 04:14:53 +00:00
from invs_eq ▹ eqfin',
eqfin''
)
(λ (x : C → A),
2014-12-12 18:17:50 +00:00
have eqretr : eq' = w',
2014-12-12 04:14:53 +00:00
from (@retr _ _ (@equiv_path A B) ua_type.inst w'),
2014-12-12 18:17:50 +00:00
have invs_eq : (to_fun eq')⁻¹ = (to_fun w')⁻¹,
2014-12-12 04:14:53 +00:00
from inv_eq eq' w' eqretr,
2014-12-12 18:17:50 +00:00
have eqfin : (to_fun eq')⁻¹ ∘ ((to_fun eq') ∘ x) = x,
from (λ p, eq.rec_on p idp) eqinv,
have eqfin' : (to_fun eq')⁻¹ ∘ ((to_fun w') ∘ x) = x,
2014-12-12 04:14:53 +00:00
from eqretr ▹ eqfin,
2014-12-12 18:17:50 +00:00
have eqfin'' : (to_fun w')⁻¹ ∘ ((to_fun w') ∘ x) = x,
2014-12-12 04:14:53 +00:00
from invs_eq ▹ eqfin',
eqfin''
)
-- We are ready to prove functional extensionality,
-- starting with the naive non-dependent version.
protected definition diagonal [reducible] (B : Type) : Type
2014-12-12 18:17:50 +00:00
:= Σ xy : B × B, pr₁ xy = pr₂ xy
2014-12-12 04:14:53 +00:00
protected definition isequiv_src_compose {A B : Type}
: @is_equiv (A → diagonal B)
(A → B)
(compose (pr₁ ∘ dpr1)) :=
@ua_isequiv_postcompose _ _ _ (pr₁ ∘ dpr1)
(is_equiv.adjointify (pr₁ ∘ dpr1)
(λ x, dpair (x , x) idp) (λx, idp)
(λ x, sigma.rec_on x
(λ xy, prod.rec_on xy
2014-12-12 18:17:50 +00:00
(λ b c p, eq.rec_on p idp))))
2014-12-12 04:14:53 +00:00
protected definition isequiv_tgt_compose {A B : Type}
: @is_equiv (A → diagonal B)
(A → B)
(compose (pr₂ ∘ dpr1)) :=
@ua_isequiv_postcompose _ _ _ (pr2 ∘ dpr1)
(is_equiv.adjointify (pr2 ∘ dpr1)
(λ x, dpair (x , x) idp) (λx, idp)
(λ x, sigma.rec_on x
(λ xy, prod.rec_on xy
2014-12-12 18:17:50 +00:00
(λ b c p, eq.rec_on p idp))))
2014-12-12 04:14:53 +00:00
theorem nondep_funext_from_ua {A : Type} {B : Type.{l+1}}
2014-12-12 18:17:50 +00:00
: Π {f g : A → B}, f g → f = g :=
2014-12-12 04:14:53 +00:00
(λ (f g : A → B) (p : f g),
let d := λ (x : A), dpair (f x , f x) idp in
let e := λ (x : A), dpair (f x , g x) (p x) in
let precomp1 := compose (pr₁ ∘ dpr1) in
have equiv1 [visible] : is_equiv precomp1,
from @isequiv_src_compose A B,
have equiv2 [visible] : Π x y, is_equiv (ap precomp1),
from is_equiv.ap_closed precomp1,
have H' : Π (x y : A → diagonal B),
2014-12-12 18:17:50 +00:00
pr₁ ∘ dpr1 ∘ x = pr₁ ∘ dpr1 ∘ y → x = y,
2014-12-12 04:14:53 +00:00
from (λ x y, is_equiv.inv (ap precomp1)),
2014-12-12 18:17:50 +00:00
have eq2 : pr₁ ∘ dpr1 ∘ d = pr₁ ∘ dpr1 ∘ e,
2014-12-12 04:14:53 +00:00
from idp,
2014-12-12 18:17:50 +00:00
have eq0 : d = e,
2014-12-12 04:14:53 +00:00
from H' d e eq2,
2014-12-12 18:17:50 +00:00
have eq1 : (pr₂ ∘ dpr1) ∘ d = (pr₂ ∘ dpr1) ∘ e,
2014-12-12 04:14:53 +00:00
from ap _ eq0,
eq1
)
end
-- Now we use this to prove weak funext, which as we know
-- implies (with dependent eta) also the strong dependent funext.
universe variables l k
theorem weak_funext_from_ua [ua3 : ua_type.{k+1}] [ua4 : ua_type.{k+2}] : weak_funext.{l+1 k+1} :=
(λ (A : Type) (P : A → Type) allcontr,
let U := (λ (x : A), unit) in
have pequiv : Π (x : A), P x ≃ U x,
from (λ x, @equiv_contr_unit(P x) (allcontr x)),
2014-12-12 18:17:50 +00:00
have psim : Π (x : A), P x = U x,
2014-12-12 04:14:53 +00:00
from (λ x, @is_equiv.inv _ _
equiv_path ua_type.inst (pequiv x)),
2014-12-12 18:17:50 +00:00
have p : P = U,
2014-12-12 04:14:53 +00:00
from @nondep_funext_from_ua _ A Type P U psim,
have tU' : is_contr (A → unit),
from is_contr.mk (λ x, ⋆)
(λ f, @nondep_funext_from_ua _ A unit (λ x, ⋆) f
(λ x, unit.rec_on (f x) idp)),
have tU : is_contr (Π x, U x),
from tU',
have tlast : is_contr (Πx, P x),
2014-12-12 18:17:50 +00:00
from eq.transport _ (p⁻¹) tU,
2014-12-12 04:14:53 +00:00
tlast
)
-- In the following we will proof function extensionality using the univalence axiom
definition funext_from_ua [instance] [ua ua2 : ua_type] : funext :=
funext_from_weak_funext (@weak_funext_from_ua ua ua2)