https://bitbucket.org/akaposi/prop
Raw File
Tip revision: 342f0758427932316130a5a5facbeb6844c55c17 authored by Ambrus Kaposi on 02 June 2022, 14:03:40 UTC
add supplementary link and remove negative spaces
Tip revision: 342f075
lib.agda
{-# OPTIONS --without-K #-}

module lib where

open import Agda.Primitive

idfun : ∀{ℓ}{A : Set ℓ} → A → A
idfun x = x

------------------------------------------------------------------------------
-- equality
------------------------------------------------------------------------------

data _≡_ {ℓ}{A : Set ℓ} (x : A) : A → Set ℓ where
  refl : x ≡ x

infix 4 _≡_

_◾_ : ∀{ℓ}{A : Set ℓ}{x y z : A} → x ≡ y → y ≡ z → x ≡ z
refl ◾ e = e

infixl 4 _◾_

_⁻¹ : ∀{ℓ}{A : Set ℓ}{x y : A} → x ≡ y → y ≡ x
refl ⁻¹ = refl

infix 5 _⁻¹

_≡⟨_⟩_ : ∀{ℓ}{A : Set ℓ}(x : A){y z : A} → x ≡ y → y ≡ z → x ≡ z
x ≡⟨ x≡y ⟩ y≡z = x≡y ◾ y≡z

infixr 2 _≡⟨_⟩_

_∎ : ∀{ℓ}{A : Set ℓ}(x : A) → x ≡ x
x ∎ = refl

infix  3 _∎

coe : ∀{ℓ}{A B : Set ℓ} → A ≡ B → A → B
coe refl a = a

_≡[_]≡_ : ∀{ℓ}{A B : Set ℓ} → A → A ≡ B → B → Set ℓ
x ≡[ α ]≡ y = ((coe α x) ≡ y)

infix 4 _≡[_]≡_

ap : ∀{ℓ ℓ'}{A : Set ℓ}{B : Set ℓ'}(f : A → B){a₀ a₁ : A}(a₂ : a₀ ≡ a₁)
    → f a₀ ≡ f a₁
ap f refl = refl

transport : ∀{ℓ ℓ'}{A : Set ℓ}(P : A → Set ℓ'){x y : A}(p : x ≡ y) → P x → P y
transport P p a = coe (ap P p) a

trap : ∀{ℓ ℓ' ℓ''}{A : Set ℓ}{P : A → Set ℓ'}{B : Set ℓ''}{x y : B}{f : B → A}(e : x ≡ y){u : P (f x)} →
  transport P (ap f e) u ≡ transport (λ z → P (f z)) e u
trap refl = refl

trconst : ∀{ℓ ℓ'}{A : Set ℓ}{B : Set ℓ'}{x y : A}(e : x ≡ y){u : B} → transport (λ _ → B) e u ≡ u
trconst refl = refl

apd : ∀{ℓ ℓ'}{A : Set ℓ}{B : A → Set ℓ'}(f : (x : A) → B x){a₀ a₁ : A}(a₂ : a₀ ≡ a₁)
    → f a₀ ≡[ ap B a₂ ]≡ f a₁
apd f refl = refl

apd' : ∀{ℓ ℓ'}{A : Set ℓ}{B : A → Set ℓ'}(f : (x : A) → B x){a₀ a₁ : A}(a₂ : a₀ ≡ a₁)
    → f a₀ ≡ transport B (a₂ ⁻¹) (f a₁)
apd' f refl = refl

apd'' : ∀{ℓ ℓ'}{A : Set ℓ}{B : A → Set ℓ'}(f : (x : A) → B x){a₀ a₁ : A}(a₂ : a₁ ≡ a₀)
    → f a₀ ≡ transport B a₂ (f a₁)
apd'' f refl = refl

apid : ∀{ℓ}{A : Set ℓ}{x y : A}(p : x ≡ y) → ap (λ x → x) p ≡ p
apid refl = refl

apap : ∀{ℓ ℓ' ℓ''}{A : Set ℓ}{B : Set ℓ'}{C : Set ℓ''}{f : A → B}{g : B → C}
       {a₀ a₁ : A}(a₂ : a₀ ≡ a₁) → ap (λ x → g (f x)) a₂ ≡ ap g (ap f a₂)
apap refl = refl

trtr : ∀{ℓ ℓ' ℓ''}{A : Set ℓ}{B : Set ℓ'}(P : B → Set ℓ'')(f : A → B)
       {a a' : A}(p : a ≡ a'){b : B}(q : b ≡ f a){u : P b}
     → transport (λ z → P (f z)) p (transport P q u)
     ≡ transport P (q ◾ ap f p) u
trtr P f refl refl = refl

trtr' : ∀{ℓ ℓ'}{A : Set ℓ}(P : A → Set ℓ'){x y : A}(p : y ≡ x){u : P x} →
  transport P p (transport P (p ⁻¹) u) ≡ u
trtr' P refl = refl

trself :
  ∀{ℓ ℓ'}{A : Set ℓ}(P : A → Set ℓ')(f : (x : A) → P x){a a' : A}(p : a ≡ a') →
  transport P (p ⁻¹) (f a') ≡ f a
trself P f refl = refl

tr$ : ∀{ℓ ℓ' ℓ''}{A : Set ℓ}(P : A → Set ℓ'){C : Set ℓ''}{a a' : A}(f : P a → C)(e : a ≡ a'){u : P a'} →
  f (transport P (e ⁻¹) u) ≡ transport (λ z → P z → C) e f u
tr$ P f refl = refl

J : ∀{ℓ ℓ'}{A : Set ℓ} {x : A} (P : {y : A} → x ≡ y → Set ℓ') → P refl → {y : A} → (w : x ≡ y) → P w
J P pr refl = pr

trrefl : ∀{ℓ ℓ'}{A : Set ℓ}(P : A → Set ℓ'){x : A}(w : P x) → transport P refl w ≡ w
trrefl P w = refl

tr2 : ∀{ℓ ℓ' ℓ''}{A : Set ℓ}{B : A → Set ℓ'}(P : (a : A) → B a → Set ℓ'')
  {a₀ a₁ : A}(a₀₁ : a₀ ≡ a₁){b₀ : B a₀}{b₁ : B a₁}(b₀₁ : transport B a₀₁ b₀ ≡ b₁) →
  P a₀ b₀ → P a₁ b₁
tr2 {A = A}{B} P {a₀}{a₁} a₀₁ {b₀} b₀₁ w = transport (P a₁) b₀₁ (J (λ {a₁} a₀₁ → P a₁ (transport B a₀₁ b₀)) (transport (P a₀) (trrefl B b₀ ⁻¹) w) a₀₁)

tr2' : ∀{ℓ ℓ' ℓ''}{A : Set ℓ}{B : Set ℓ'}(P : A → B → Set ℓ'')
  {a₀ a₁ : A}(a₀₁ : a₀ ≡ a₁){b₀ b₁ : B}(b₀₁ : b₀ ≡ b₁) → P a₀ b₀ → P a₁ b₁
tr2' {A = A}{B} P {a₀}{a₁} a₀₁ {b₀} b₀₁ w = transport (P a₁) b₀₁ (J (λ {a₁} a₀₁ → P a₁ b₀) w a₀₁)

≡inv : ∀{ℓ}{A : Set ℓ} {x y : A} (p : x ≡ y) → (p ◾ p ⁻¹) ≡ refl
≡inv refl = refl

≡inv' : ∀{ℓ}{A : Set ℓ} {x y : A} (p : x ≡ y) → (p ⁻¹ ◾ p) ≡ refl
≡inv' refl = refl

coeap2 : ∀{ℓ ℓ'}{A : Set ℓ}{B : A → Set ℓ'}{a₀ a₁ : A}(a₂ : a₀ ≡ a₁){t : B a₁}
       → coe (ap B a₂) (coe (ap B (a₂ ⁻¹)) t) ≡ t
coeap2 refl = refl

coeap2' : ∀{ℓ ℓ'}{A : Set ℓ}{B : A → Set ℓ'}{a₀ a₁ : A}(a₂ : a₀ ≡ a₁){t : B a₀}
       → coe (ap B (a₂ ⁻¹)) (coe (ap B a₂) t) ≡ t
coeap2' refl = refl

ap2 : ∀{ℓ ℓ' ℓ''}{A : Set ℓ}{B : Set ℓ'}{C : Set ℓ''}(f : A → B → C)
    → {a₀ a₁ : A}(a₂ : a₀ ≡ a₁){b₀ b₁ : B}(b₂ : b₀ ≡ b₁)
    → f a₀ b₀ ≡ f a₁ b₁
ap2 f refl refl = refl

ap2d : ∀{ℓ ℓ' ℓ''}{A : Set ℓ}{B : A → Set ℓ'}{C : Set ℓ''}(f : (x : A) → B x → C)
    → {a₀ a₁ : A}(a₂ : a₀ ≡ a₁){b₀ : B a₀}{b₁ : B a₁}(b₂ : b₀ ≡[ ap B a₂ ]≡ b₁)
    → f a₀ b₀ ≡ f a₁ b₁
ap2d f refl refl = refl

[_]_◾_ : ∀{ℓ ℓ'}{A : Set ℓ}{B : A → Set ℓ'}{a a' : A}{b : B a}
         (f : (x : A) → B x)(p : b ≡ f a)(q : a ≡ a')
       → b ≡[ ap B q ]≡ f a'
[ f ] refl ◾ refl = refl

$$Set=
  : ∀{ℓ ℓ' ℓ''}{A : Set ℓ}{B : A → Set ℓ'}(C : (x : A) → B x → Set ℓ'')
  → {a₀ a₁ : A}(a₂ : a₀ ≡ a₁){b₀ : B a₀}{b₁ : B a₁}(b₂ : b₀ ≡[ ap B a₂ ]≡ b₁)
  → C a₀ b₀ ≡ C a₁ b₁
$$Set= C refl refl = refl

$$= : ∀{ℓ ℓ' ℓ''}{A : Set ℓ}{B : A → Set ℓ'}{C : (x : A) → B x → Set ℓ''}
      (f : (a : A)(b : B a) → C a b)
    → {a₀ a₁ : A}(a₂ : a₀ ≡ a₁){b₀ : B a₀}{b₁ : B a₁}(b₂ : b₀ ≡[ ap B a₂ ]≡ b₁)
    → f a₀ b₀ ≡[ $$Set= C a₂ b₂ ]≡ f a₁ b₁
$$= f refl refl = refl

$$Set=i
  : ∀{ℓ ℓ' ℓ''}{A : Set ℓ}{B : A → Set ℓ'}(C : {x : A} → B x → Set ℓ'')
  → {a₀ a₁ : A}(a₂ : a₀ ≡ a₁){b₀ : B a₀}{b₁ : B a₁}(b₂ : b₀ ≡[ ap B a₂ ]≡ b₁)
  → C b₀ ≡ C b₁
$$Set=i C refl refl = refl

$$=i : ∀{ℓ ℓ' ℓ''}{A : Set ℓ}{B : A → Set ℓ'}{C : {x : A} → B x → Set ℓ''}
       (f : {a : A}(b : B a) → C b)
     → {a₀ a₁ : A}(a₂ : a₀ ≡ a₁){b₀ : B a₀}{b₁ : B a₁}(b₂ : b₀ ≡[ ap B a₂ ]≡ b₁)
     → f b₀ ≡[ $$Set=i C a₂ b₂ ]≡ f b₁
$$=i f refl refl = refl

ap3 : ∀{ℓ ℓ' ℓ'' ℓ'''}{A : Set ℓ}{B : Set ℓ'}{C : Set ℓ''}{D : Set ℓ'''}
      (f : A → B → C → D)
    → {a₀ a₁ : A}(a₂ : a₀ ≡ a₁)
      {b₀ b₁ : B}(b₂ : b₀ ≡ b₁)
      {c₀ c₁ : C}(c₂ : c₀ ≡ c₁)
    → f a₀ b₀ c₀ ≡ f a₁ b₁ c₁
ap3 f refl refl refl = refl

ap3d : ∀{ℓ ℓ' ℓ'' ℓ'''}{A : Set ℓ}{B : A → Set ℓ'}{C : (a : A) → B a → Set ℓ''}{D : Set ℓ'''}
       (f : (x : A)(y : B x) → C x y → D)
     → {a₀ a₁ : A}(a₂ : a₀ ≡ a₁){b₀ : B a₀}{b₁ : B a₁}(b₂ : b₀ ≡[ ap B a₂ ]≡ b₁)
       {c₀ : C a₀ b₀}{c₁ : C a₁ b₁}(c₂ : c₀ ≡[ ap2d C a₂ b₂ ]≡ c₁)
     → f a₀ b₀ c₀ ≡ f a₁ b₁ c₁
ap3d f refl refl refl = refl

ap4 : ∀{ℓ ℓ' ℓ'' ℓ''' ℓ''''}{A : Set ℓ}{B : Set ℓ'}{C : Set ℓ''}{D : Set ℓ'''}{E : Set ℓ''''}
      (f : A → B → C → D → E)
    → {a₀ a₁ : A}(a₂ : a₀ ≡ a₁)
      {b₀ b₁ : B}(b₂ : b₀ ≡ b₁)
      {c₀ c₁ : C}(c₂ : c₀ ≡ c₁)
      {d₀ d₁ : D}(d₂ : d₀ ≡ d₁)
    → f a₀ b₀ c₀ d₀ ≡ f a₁ b₁ c₁ d₁
ap4 f refl refl refl refl = refl

ap4' : ∀{ℓ ℓ' ℓ'' ℓ''' ℓ''''}
       {A : Set ℓ}{B : Set ℓ'}{C : Set ℓ''}{D : B → Set ℓ'''}{E : Set ℓ''''}
      (f : A → (b : B) → C → D b → E)
    → {a₀ a₁ : A}(a₂ : a₀ ≡ a₁)
      {b₀ b₁ : B}(b₂ : b₀ ≡ b₁)
      {c₀ c₁ : C}(c₂ : c₀ ≡ c₁)
      {d₀ : D b₀}{d₁ : D b₁}(d₂ : d₀ ≡[ ap D b₂ ]≡ d₁)
    → f a₀ b₀ c₀ d₀ ≡ f a₁ b₁ c₁ d₁
ap4' f refl refl refl refl = refl

coe2r : ∀{ℓ ℓ'}{A : Set ℓ}{B : A → Set ℓ'}{a₀ a₁ : A}
        (a₂ : a₀ ≡ a₁){b₀ : B a₀}{b₁ : B a₁}
      → b₀ ≡[ ap B a₂ ]≡ b₁ → b₀ ≡ coe (ap B (a₂ ⁻¹)) b₁
coe2r refl p = p

coe2l : ∀{ℓ ℓ'}{A : Set ℓ}{B : A → Set ℓ'}{a₀ a₁ : A}
        (a₂ : a₀ ≡ a₁){b₀ : B a₀}{b₁ : B a₁}
      → b₀ ≡ coe (ap B (a₂ ⁻¹)) b₁ → b₀ ≡[ ap B a₂ ]≡ b₁
coe2l refl p = p

coecoeap
  : ∀{ℓ ℓ'}{A : Set ℓ}{B : A → Set ℓ'}{a b c : A}(p : a ≡ b)(q : b ≡ c)
    {t : B a}
  → coe (ap B q) (coe (ap B p) t) ≡ coe (ap B (p ◾ q)) t
coecoeap refl refl = refl

coecoe : ∀{ℓ}{A B C : Set ℓ}(P : A ≡ B)(Q : B ≡ C){a : A}
       → coe Q (coe P a) ≡ coe (P ◾ Q) a
coecoe refl refl = refl

≡= : ∀{ℓ}{A₀ A₁ : Set ℓ}(A₂ : A₀ ≡ A₁)
     {a₀ : A₀}{a₁ : A₁}(a₂ : a₀ ≡[ A₂ ]≡ a₁)
     {b₀ : A₀}{b₁ : A₁}(b₂ : b₀ ≡[ A₂ ]≡ b₁)
   → (a₀ ≡ b₀) ≡ (a₁ ≡ b₁)
≡= refl refl refl = refl

◾lid : ∀{ℓ}{A : Set ℓ}{x y : A}(p : x ≡ y) → (refl ◾ p) ≡ p
◾lid refl = refl

◾rid : ∀{ℓ}{A : Set ℓ}{x y : A}(p : x ≡ y) → (p ◾ refl) ≡ p
◾rid refl = refl

◾ass : ∀{ℓ}{A : Set ℓ}{a b c d : A}(p : a ≡ b)(q : b ≡ c)(r : c ≡ d)
     → (p ◾ (q ◾ r)) ≡ ((p ◾ q) ◾ r)
◾ass refl refl refl = refl

ap◾ : ∀{ℓ ℓ'}{A : Set ℓ}{B : Set ℓ'}(f : A → B){a b c : A}(p : a ≡ b)(q : b ≡ c)
    → ap f (p ◾ q) ≡ (ap f p ◾ ap f q)
ap◾ f refl refl = refl

◾ap◾ap
  : ∀{ℓ ℓ' ℓ''}{A : Set ℓ}{B : Set ℓ'}{C : Set ℓ''}
    (f : A → B)(g : B → C){a a' : A}(r : a ≡ a'){b : B}(q : b ≡ f a){c : C}(p : c ≡ g b)
  → (p ◾ ap g q ◾ ap (λ z → g (f z)) r)
  ≡ (p ◾ ap g (q ◾ ap f r))
◾ap◾ap f g refl refl refl = refl

coe-apply :
 ∀ {α β γ}{A : Set α}{B : Set β}(C : A → B → Set γ)
   {b b' : B}(p : b ≡ b')(f : ∀ a → C a b)(a : A)
 → coe (ap (λ x → ∀ a → C a x) p) f a ≡ coe (ap (C a) p) (f a)
coe-apply C refl f a = refl

coe=
  : ∀{ℓ}{A B : Set ℓ}
    {p₀ p₁ : A ≡ B}(p₂ : p₀ ≡ p₁)
    {t : A}
  → coe p₀ t ≡ coe p₁ t
coe= refl = refl

apconst : ∀{ℓ ℓ'}{A : Set ℓ}{B : Set ℓ'}{a b : A}(p : a ≡ b){t : B} → ap (λ _ → t) p ≡ refl
apconst refl = refl

ap3const
  : ∀{ℓ ℓ' ℓ'' ℓ'''}{A : Set ℓ}{B : Set ℓ'}{C : Set ℓ''}{D : Set ℓ'''}
    → {a₀ a₁ : A}(a₂ : a₀ ≡ a₁)
      {b₀ b₁ : B}(b₂ : b₀ ≡ b₁)
      {c₀ c₁ : C}(c₂ : c₀ ≡ c₁)
      {d : D}
    → ap3 (λ _ _ _ → d) a₂ b₂ c₂ ≡ refl
ap3const refl refl refl = refl

coeap : ∀{ℓ ℓ' ℓ''}{A : Set ℓ}{B : A → Set ℓ'}{C : A → Set ℓ''}{a a' : A}(p : a ≡ a')
        (f : {a : A} → B a → C a){b : B a}
      → coe (ap C p) (f b) ≡ f (coe (ap B p) b)
coeap refl _ = refl

coeap2d : ∀{ℓ ℓ' ℓ''}{A : Set ℓ}{B : A → Set ℓ'}{C : {a : A} → B a → Set ℓ''}
        {a a' : A}(p : a ≡ a')
        (f : {a : A}(b : B a) → C b){b : B a}
      → coe ($$Set=i C p refl) (f b) ≡ f (coe (ap B p) b)
coeap2d refl _ = refl

apap3 : ∀{ℓ ℓ' ℓ'' ℓ'''}{A : Set ℓ}{B : Set ℓ'}{C : Set ℓ''}{D : Set ℓ'''}
        (f : A → B → C → D)
        {a₀ a₁ : A}(a₂ : a₀ ≡ a₁)
        {b₀ b₁ : B}(b₂ : b₀ ≡ b₁)
        {c₀ c₁ : C}(c₂ : c₀ ≡ c₁)
        {ℓ''''}{E : Set ℓ''''}
        (g : D → E)
      → ap g (ap3 f a₂ b₂ c₂) ≡ ap3 (λ x y z → g (f x y z)) a₂ b₂ c₂
apap3 f refl refl refl g = refl

------------------------------------------------------------------------------
-- sigma
------------------------------------------------------------------------------

record Σ {ℓ ℓ'} (A : Set ℓ) (B : A → Set ℓ') : Set (ℓ ⊔ ℓ') where
  constructor _,Σ_
  field
    proj₁ : A
    proj₂ : B proj₁

infixl 5 _,Σ_

open Σ public

aptot : ∀{ℓ}{A : Set ℓ}{B : A → Set}(f : (x : A) → B x){a₀ a₁ : A}(a₂ : a₀ ≡ a₁)
    → _≡_ {A = Σ Set λ X → X} (B a₀ ,Σ f a₀) (B a₁ ,Σ f a₁)
aptot f refl = refl

,Σ= : ∀{ℓ ℓ'}{A : Set ℓ}{B : A → Set ℓ'}{a a' : A}{b : B a}{b' : B a'}
     (p : a ≡ a') → b ≡[ ap B p ]≡ b' → _≡_ {A = Σ A B} (a ,Σ b) (a' ,Σ b')
,Σ= refl refl = refl

,Σ=0 : ∀{ℓ ℓ'}{A : Set ℓ}{B : A → Set ℓ'}{a a' : A}{b : B a}{b' : B a'}
    → _≡_ {A = Σ A B} (a ,Σ b) (a' ,Σ b') → a ≡ a'
,Σ=0 = ap proj₁

,Σ=1 : ∀{ℓ ℓ'}{A : Set ℓ}{B : A → Set ℓ'}{a a' : A}{b : B a}{b' : B a'}
      (p : (a ,Σ b) ≡ (a' ,Σ b')) → b ≡[ ap B (,Σ=0 p) ]≡ b'
,Σ=1 {B = B}{b = b}{b'} p = coe (ap (λ z → coe z b ≡ b') (apap {f = proj₁}{B} p)) (apd proj₂ p)

,Σ=η : ∀{ℓ ℓ'}{A : Set ℓ}{B : A → Set ℓ'}{w w' : Σ A B}
      (p : w ≡ w') → ,Σ= (,Σ=0 p) (,Σ=1 p) ≡ p
,Σ=η refl = refl

,Σ=β0 : ∀{ℓ ℓ'}{A : Set ℓ}{B : A → Set ℓ'}{a a' : A}{b : B a}{b' : B a'}
       (p : a ≡ a')(q : b ≡[ ap B p ]≡ b') → ,Σ=0 (,Σ= p q) ≡ p
,Σ=β0 refl refl = refl

,Σ=β1 : ∀{ℓ ℓ'}{A : Set ℓ}{B : A → Set ℓ'}{a a' : A}{b : B a}{b' : B a'}
       (p : a ≡ a')(q : b ≡[ ap B p ]≡ b')
     → ,Σ=1 (,Σ= p q) ≡[ ap (λ r → b ≡[ ap B r ]≡ b') (,Σ=β0 p q) ]≡ q
,Σ=β1 refl refl = refl

Σ= : ∀{ℓ ℓ'}
     {A₀ A₁ : Set ℓ}(A₂ : A₀ ≡ A₁)
     {B₀ : A₀ → Set ℓ'}{B₁ : A₁ → Set ℓ'}(B₂ : B₀ ≡[ ap (λ z → z → Set ℓ') A₂ ]≡ B₁)
   → Σ A₀ B₀ ≡ Σ A₁ B₁
Σ= refl refl = refl

,Σ=2 : {A : Set}{B : A → Set}{a : A}{b : B a}
       {α : a ≡ a}{β : b ≡[ ap B α ]≡ b}
     → (w : α ≡ refl) → β ≡[ ap (λ γ → b ≡[ ap B γ ]≡ b) w ]≡ refl
     → ,Σ= α β ≡ refl
,Σ=2 refl refl = refl

,Σ==
  : ∀{ℓ ℓ'}{A : Set ℓ}{B : A → Set ℓ'}
    {a₀ a₁ : A}{b₀ : B a₀}{b₁ : B a₁}
    {p₀ p₁ : a₀ ≡ a₁}(p₂ : p₀ ≡ p₁)
    {q₀ : b₀ ≡[ ap B p₀ ]≡ b₁}{q₁ : b₀ ≡[ ap B p₁ ]≡ b₁}(q₂ : q₀ ≡[ ≡= refl {a₀ = coe (ap B p₀) b₀}{coe (ap B p₁) b₀} (ap (λ z → coe (ap B z) b₀) p₂) refl ]≡ q₁)
  → _≡_ (,Σ= p₀ q₀) (,Σ= p₁ q₁)
,Σ== refl refl = refl

ΣisSet
  : ∀{ℓ ℓ'}{A : Set ℓ}{B : A → Set ℓ'}
    (isSetA : {a a' : A}(p q : a ≡ a') → p ≡ q)
    (isSetB : {a : A}{b b' : B a}(p q : b ≡ b') → p ≡ q)
  → {w w' : Σ A B}(p q : w ≡ w') → p ≡ q
ΣisSet {A = A}{B} isSetA isSetB {a ,Σ b}{a' ,Σ b'} p q = ,Σ=η p ⁻¹ ◾ ,Σ== {p₀ = ,Σ=0 p}{,Σ=0 q} (isSetA _ _) {,Σ=1 p}{,Σ=1 q} (isSetB _ _) ◾ ,Σ=η q

-- pointed types

,Σp= : {A₀ A₁ : Set}(A₂ : A₀ ≡ A₁){a₀ : A₀}{a₁ : A₁}(a₂ : a₀ ≡[ A₂ ]≡ a₁)
    → _≡_ {A = Σ Set λ X → X} (A₀ ,Σ a₀) (A₁ ,Σ a₁)
,Σp= A₂ {b₀}{b₁} b₂ = ,Σ= A₂ (coe (ap (λ z → b₀ ≡[ z ]≡ b₁) (apid A₂ ⁻¹)) b₂)

,Σp=1 : {A₀ A₁ : Set}{a₀ : A₀}{a₁ : A₁}
     → (p : (A₀ ,Σ a₀) ≡ (A₁ ,Σ a₁)) → a₀ ≡[ ,Σ=0 p ]≡ a₁
,Σp=1 refl = refl

-- nondependent

_×_ : ∀{ℓ ℓ'} → Set ℓ → Set ℓ' → Set (ℓ ⊔ ℓ')
A × B = Σ A λ _ → B

infixl 4 _×_

,×= : ∀{ℓ}{A B : Set ℓ}{a a' : A}{b b' : B}
    → a ≡ a' → b ≡ b' → _≡_ {A = A × B} (a ,Σ b) (a' ,Σ b')
,×= refl refl = refl

------------------------------------------------------------------------------
-- top
------------------------------------------------------------------------------

record ⊤ : Set where
  constructor tt

set⊤ : {x y : ⊤}(p q : x ≡ y) → p ≡ q
set⊤ refl refl = refl

------------------------------------------------------------------------------
-- bottom
------------------------------------------------------------------------------

data ⊥ : Set where

⊥-elim : ∀{ℓ}{A : Set ℓ} → ⊥ → A
⊥-elim ()

¬ : Set → Set
¬ A = A → ⊥

------------------------------------------------------------------------------
-- disjoint union
------------------------------------------------------------------------------

data _⊎_ (A B : Set) : Set where
  inl : A → A ⊎ B
  inr : B → A ⊎ B
infixr 1 _⊎_

ind⊎ : {A B : Set}(P : A ⊎ B → Set) → ((a : A) → P (inl a)) → ((b : B) → P (inr b))
     → (w : A ⊎ B) → P w
ind⊎ P ca cb (inl a) = ca a
ind⊎ P ca cb (inr b) = cb b

------------------------------------------------------------------------------
-- function space
------------------------------------------------------------------------------

infixr -1 _$_

_$_ : ∀{i}{A : Set i}{j}{B : A → Set j} →
  ((x : A) → B x) → ((x : A) → B x)
f $ x = f x

→=''
  : ∀{ℓ ℓ'}
    {A₀ A₁ : Set ℓ}(A₂ : A₀ ≡ A₁)
    {B₀ B₁ : Set ℓ'}(B₂ : B₀ ≡ B₁)
  → (A₀ → B₀) ≡ (A₁ → B₁)
→='' refl refl = refl

→='
  : ∀{ℓ ℓ'}
    {A₀ A₁ : Set ℓ}(A₂ : A₀ ≡ A₁)
    {B₀ : A₀ → Set ℓ'}{B₁ : A₁ → Set ℓ'}(B₂ : B₀ ≡[ →='' A₂ refl ]≡ B₁)
  → ((x₀ : A₀) → B₀ x₀) ≡ ((x₁ : A₁) → B₁ x₁)
→=' refl refl = refl

→i='
  : ∀{ℓ ℓ'}
    {A₀ A₁ : Set ℓ}(A₂ : A₀ ≡ A₁)
    {B₀ : A₀ → Set ℓ'}{B₁ : A₁ → Set ℓ'}(B₂ : B₀ ≡[ →='' A₂ refl ]≡ B₁)
  → ({x₀ : A₀} → B₀ x₀) ≡ ({x₁ : A₁} → B₁ x₁)
→i=' refl refl = refl

→='''
  : ∀{ℓ ℓ'}
    {A₀ A₁ : Set ℓ}(A₂ : A₀ ≡ A₁)
    {B₀ : A₀ → A₀ → Set ℓ'}{B₁ : A₁ → A₁ → Set ℓ'}(B₂ : B₀ ≡[ →='' A₂ (→='' A₂ refl) ]≡ B₁)
  → ((x₀ : A₀) → B₀ x₀ x₀) ≡ ((x₁ : A₁) → B₁ x₁ x₁)
→=''' refl refl = refl

$T=
  : ∀{ℓ ℓ'}
    {A₀ A₁ : Set ℓ}(A₂ : A₀ ≡ A₁)
    {B₀ : A₀ → Set ℓ'}{B₁ : A₁ → Set ℓ'}(B₂ : {x₀ : A₀}{x₁ : A₁}(x₂ : x₀ ≡[ A₂ ]≡ x₁) → B₀ x₀ ≡ B₁ x₁)
    {a₀ : A₀}{a₁ : A₁}(a₂ : a₀ ≡[ A₂ ]≡ a₁)
  → B₀ a₀ ≡ B₁ a₁
$T= refl B₂ refl = B₂ refl

------------------------------------------------------------------------------
-- lifting a type
------------------------------------------------------------------------------

record Lift {ℓ ℓ'}(A : Set ℓ) : Set (ℓ ⊔ ℓ') where
  constructor lift
  field
    unlift : A

open Lift public

------------------------------------------------------------------------------
-- natural numbers
------------------------------------------------------------------------------

data ℕ : Set where
  zero : ℕ
  suc  : ℕ → ℕ

{-# BUILTIN NATURAL ℕ #-}

ind : (P : ℕ → Set)(z : P zero)(s : {n : ℕ} → P n → P (suc n))(n : ℕ) → P n
ind P z s zero = z
ind P z s (suc n) = s (ind P z s n)

toLevel : ℕ → Level
toLevel zero = lzero
toLevel (suc n) = lsuc (toLevel n)

------------------------------------------------------------------------------
-- finite sets
------------------------------------------------------------------------------

data Fin : ℕ → Set where
  zero : {n : ℕ} → Fin (suc n)
  suc  : {n : ℕ} → Fin n → Fin (suc n)

toLevelF : {n : ℕ} → Fin n → Level
toLevelF zero = lzero
toLevelF (suc n) = lsuc (toLevelF n)

------------------------------------------------------------------------------
-- booleans
------------------------------------------------------------------------------

data 𝟚 : Set where
  tt ff : 𝟚

if_then_else_ : ∀{ℓ}{C : 𝟚 → Set ℓ}(b : 𝟚)(c : C tt)(d : C ff) → C b
if tt then c else d = c
if ff then c else d = d

------------------------------------------------------------------------------
-- propositions
------------------------------------------------------------------------------

F : ∀{i} → Set i → Set i
F A = A → A → A

fst : ∀{i}{A : Set i} → F A
fst = λ x x' → x

snd : ∀{i}{A : Set i} → F A
snd = λ x x' → x'

-- TODO: rename to isPfProp
isprop : ∀{i} → Set i → Set i
isprop A = _≡_ {A = F A} fst snd

fst1 : ∀{i}{A : Set i}{j}{B : A → Set j} → (x : A) → F (B x)
fst1 x y y' = y

snd1 : ∀{i}{A : Set i}{j}{B : A → Set j} → (x : A) → F (B x)
snd1 x y y' = y'

-- TODO: rename to isPfPropd
isprop1 : ∀{i}{A : Set i}{j}(B : A → Set j) → Set (i ⊔ j)
isprop1 {_}{A} B = _≡_ {A = (x : A) → F (B x)} fst1 snd1

isprop1→isprop : ∀{i}{A : Set i}{j}{B : Set j}(a : A) → isprop1 (λ (a : A) → B) → isprop B
isprop1→isprop a₀ pB = ap (λ z → z a₀) pB

isprop× : ∀{i}{A : Set i}{j}{B : Set j} → isprop A → isprop B → isprop (A × B)
isprop× {A = A}{B = B} pA pB =
  ap (λ z → λ (w w' : A × B) → (z (proj₁ w) (proj₁ w') ,Σ proj₂ w))  pA ◾
  ap (λ z → λ (w w' : A × B) → (proj₁ w' ,Σ z (proj₂ w) (proj₂ w'))) pB

ispropΣ : ∀{i}{A : Set i}{j}{B : A → Set j} → isprop A → isprop1 B → isprop (Σ A B)
ispropΣ {_}{A}{_}{B} pA pB =
  J {A = F A} {fst} (λ {h} e → _≡_ {A = F (Σ A B)} fst (λ w w' → h (proj₁ w) (proj₁ w') ,Σ transport B (ap (λ z → z (proj₁ w) (proj₁ w')) e) (proj₂ w))) refl pA ◾
  ap (λ z → λ w w' → proj₁ w' ,Σ z (proj₁ w') (transport B (ap (λ z → z (proj₁ w) (proj₁ w')) pA) (proj₂ w)) (proj₂ w')) pB

f : ∀{i}{D : Set i}{j}{A : D → Set j}{k}(B : Σ D A → Set k)
  (d : D)(ab ab' : Σ (A d) λ a → B (d ,Σ a))(h : (d : D) → F (A d))(e : _≡_ {A = (d : D) → F (A d)} (λ d a a' → a) h) → B (d ,Σ h d (proj₁ ab) (proj₁ ab'))
f B d ab ab' h e = transport (λ a → B (d ,Σ a)) (ap (λ z → z d (proj₁ ab) (proj₁ ab')) e) (proj₂ ab)

ispropΣ1 : ∀{i}{D : Set i}{j}{A : D → Set j}{k}{B : Σ D A → Set k} →
  isprop1 A →
  isprop1 B →
  isprop1 (λ d → Σ (A d) λ a → B (d ,Σ a))
ispropΣ1 {B = B} pA pB =
  J (λ {h} e → fst1 ≡ (λ d ab ab' → h d (proj₁ ab) (proj₁ ab') ,Σ f B d ab ab' h e)) refl pA ◾
  ap (λ z → λ d ab ab' → proj₁ ab' ,Σ z (d ,Σ proj₁ ab') (f B d ab ab' _ pA) (proj₂ ab')) pB

ispropΣ' : ∀{i}{A : Set i}{j}{B : A → Set j} → isprop A → isprop1 B → isprop (Σ A B)
ispropΣ' {_}{A}{_}{B} pA pB = ap (λ z → z tt) (ispropΣ1 {_}{⊤}{_}{λ _ → A}{_}{λ ta → B (proj₂ ta)} (ap (λ z _ → z) pA) (ap (λ z ta → z (proj₂ ta)) pB))

isprop→ : ∀{i}{A : Set i}{j}{B : Set j} → isprop B → isprop (A → B)
isprop→ pB = ap (λ z → λ f f' → λ x → z (f x) (f' x)) pB

ispropΠ : ∀{i}{A : Set i}{j}{B : A → Set j} → isprop1 B → isprop ((x : A) → B x)
ispropΠ pB = ap (λ z → λ f f' x → z x (f x) (f' x)) pB

ispropΠi : ∀{i}{A : Set i}{j}{B : A → Set j} → isprop1 B → isprop ({x : A} → B x)
ispropΠi pB = ap (λ z → λ f f' {x} → z x (f {x}) (f' {x})) pB

ispropΠ1' : ∀{i}{A : Set i}{j}{B : A → Set j}{k}{C : (x : A) → B x → Set k} →
  isprop1 (λ w → C (proj₁ w) (proj₂ w)) → isprop1 (λ x → (y : B x) → C x y)
ispropΠ1' {_}{A}{_}{B}{_}{C} pC = ap (λ z x f f' y → z (x ,Σ y) (f y) (f' y)) pC

ispropΠ1 : ∀{i}{D : Set i}{j}{A : D → Set j}{k}{B : Σ D A → Set k} →
  isprop1 B → isprop1 (λ d → (a : A d) → B (d ,Σ a))
ispropΠ1 {_}{D}{_}{A}{_}{B} pB = ap (λ z d f f' a → z (d ,Σ a) (f a) (f' a)) pB

ispropΠ' : ∀{i}{A : Set i}{j}{B : A → Set j} → isprop1 B → isprop ((x : A) → B x)
ispropΠ' {_}{A}{_}{B} pB = ap (λ z → z tt) (ispropΠ1 {_}{⊤}{_}{λ _ → A}{_}{λ ta → B (proj₂ ta)} (ap (λ z ta → z (proj₂ ta)) pB))

ispropΠi1 : ∀{i}{A : Set i}{j}{B : A → Set j}{k}{C : (x : A) → B x → Set k} →
  isprop1 (λ w → C (proj₁ w) (proj₂ w)) → isprop1 (λ x → {y : B x} → C x y)
ispropΠi1 {_}{A}{_}{B}{_}{C} pC = ap (λ z x f f' {y} → z (x ,Σ y) (f {y}) (f' {y})) pC

ispropLift1 : ∀{i}{A : Set i}{j}{B : A → Set j} → isprop1 B →
  ∀{k} → isprop1 (λ a → Lift {_}{k} (B a))
ispropLift1 pB = ap (λ z x y y' → lift (z x (unlift y) (unlift y'))) pB

isProp : ∀{i} → Set i → Set i
isProp A = (x y : A) → x ≡ y

toProp : ∀{i}{A : Set i} → isprop A → isProp A
toProp pA x y = ap (λ z → z x y) pA

toProp1 : ∀{i}{A : Set i}{j}{B : A → Set j} → isprop1 B → {x : A} → isProp (B x)
toProp1 pB {x} y y' = ap (λ z → z x y y') pB

isset : ∀{i}(A : Set i) → Set i
isset A = _≡_ {A = {x x' : A} → F (x ≡ x')} fst snd

isSet : ∀{i}(A : Set i) → Set i
isSet A = {x x' : A}(e e' : x ≡ x') → e ≡ e'

toSet : ∀{i}{A : Set i} → isprop A → isSet A
toSet {i}{A} pA {x}{x'} e e' = k e ◾ k e' ⁻¹
  where
    k : {y : A}(p : x ≡ y) → p ≡ (toProp pA x' x ⁻¹ ◾ toProp pA x' y)
    k refl = ≡inv' (toProp pA x' x) ⁻¹

p⊤ : isprop ⊤
p⊤ = refl

isPropΣ : ∀{A : Set}{B : A → Set} → isProp A → ((x : A) → isProp (B x)) → isProp (Σ A B)
isPropΣ f g (a ,Σ b) (a' ,Σ b') with f a a'
... | refl with g a b b'
... | refl = refl

{-
-- TODO: 

hh : ∀{i}{A : Set i} → isprop A → (f : A → A → A) → (λ x x' → x) ≡ f
hh {i}{A} pA f = {!!} -- I don't think we can prove this (e.g. ×Bool countermodel)

s→Pp : ∀{i}{A : Set i} → isset A → isProp (isprop A)
s→Pp {_}{A} s p p' = J (λ {f} p' → transport ((λ x x' → x) ≡_) {!!} p ≡ p') {!!} p'

isPropisprop : ∀{i}(A : Set i) → isProp (isprop A)
isPropisprop A p p' = {!toSet p!}

ispropisprop : ∀{i}{A : Set i} → isprop (isprop A)
ispropisprop {i}{A} = {!!}

f : _≡_ {A = (A : Set) → (_≡_ {A = A → A → A}(λ y y' → y)(λ y y' → y')) → A → A → A}
        (λ A pA y y' → y)
        (λ A pA y y' → y')
f = {!ap
  (λ (z : (A : Set) → isprop A → A → A → A)(A : Set)(pA : isprop A)(y : A)(y' : A) → y)
  (refl {A = (A : Set) → isprop A → A → A → A}{λ A pA y y' → y})!}
-}
back to top