m1-internship/PropUtil.agda

295 lines
16 KiB
Agda
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{-# OPTIONS --prop --rewriting #-}
module PropUtil where
open import Agda.Primitive
variable ' : Level
data ⊥ₛ : Set where
record ⊤ₛ : Set where
constructor ttₛ
-- ⊥ is a data with no constructor
-- is a record with one always-available constructor
data : Prop where
record : Prop where
constructor tt
data __ : Prop Prop Prop where
inj₁ : {P Q : Prop} P P Q
inj₂ : {P Q : Prop} Q P Q
record _∧_ (P Q : Prop) : Prop where
constructor ⟨_,_⟩
field
p : P
q : Q
infixr 10 _∧_
infixr 11 __
-- ∧ elimination
proj₁ : {P Q : Prop} P Q P
proj₁ pq = _∧_.p pq
proj₂ : {P Q : Prop} P Q Q
proj₂ pq = _∧_.q pq
-- elimination
dis : {P Q S : Prop} (P Q) (P S) (Q S) S
dis (inj₁ p) ps qs = ps p
dis (inj₂ q) ps qs = qs q
-- ¬ is a shorthand for « → ⊥ »
¬ : Prop Prop
¬ P = P
-- ⊥ elimination
case⊥ : {P : Prop} P
case⊥ ()
-- ⇔ shorthand
_⇔_ : Prop Prop Prop
P Q = (P Q) (Q P)
-- Syntactic sugar for writing applications
infixr 200 _$_
_$_ : {T U : Prop} (T U) T U
h $ t = h t
postulate _≈_ : {}{A : Set }(a : A) A Set
infix 3 _≡_
data _≡_ {}{A : Set }(a : A) : A Prop where
refl : a a
{-# BUILTIN REWRITE _≡_ #-}
≡sym : { : Level} {A : Set } {a a' : A} a a' a' a
≡sym refl = refl
≡tran : { : Level} {A : Set } {a a' a'' : A} a a' a' a'' a a''
≡tran² : { : Level} {A : Set } {a₀ a₁ a₂ a₃ : A} a₀ a₁ a₁ a₂ a₂ a₃ a₀ a₃
≡tran³ : { : Level} {A : Set } {a₀ a₁ a₂ a₃ a₄ : A} a₀ a₁ a₁ a₂ a₂ a₃ a₃ a₄ a₀ a₄
≡tran⁴ : { : Level} {A : Set } {a₀ a₁ a₂ a₃ a₄ a₅ : A} a₀ a₁ a₁ a₂ a₂ a₃ a₃ a₄ a₄ a₅ a₀ a₅
≡tran⁵ : { : Level} {A : Set } {a₀ a₁ a₂ a₃ a₄ a₅ a₆ : A} a₀ a₁ a₁ a₂ a₂ a₃ a₃ a₄ a₄ a₅ a₅ a₆ a₀ a₆
≡tran⁶ : { : Level} {A : Set } {a₀ a₁ a₂ a₃ a₄ a₅ a₆ a₇ : A} a₀ a₁ a₁ a₂ a₂ a₃ a₃ a₄ a₄ a₅ a₅ a₆ a₆ a₇ a₀ a₇
≡tran⁷ : { : Level} {A : Set } {a₀ a₁ a₂ a₃ a₄ a₅ a₆ a₇ a₈ : A} a₀ a₁ a₁ a₂ a₂ a₃ a₃ a₄ a₄ a₅ a₅ a₆ a₆ a₇ a₇ a₈ a₀ a₈
≡tran refl refl = refl
≡tran² refl refl refl = refl
≡tran³ refl refl refl refl = refl
≡tran⁴ refl refl refl refl refl = refl
≡tran⁵ refl refl refl refl refl refl = refl
≡tran⁶ refl refl refl refl refl refl refl = refl
≡tran⁷ refl refl refl refl refl refl refl refl = refl
cong : { ' : Level}{A : Set }{B : Set '} (f : A B) {a a' : A} a a' f a f a'
cong f refl = refl
cong₂ : { ' '' : Level}{A : Set }{B : Set '}{C : Set ''} (f : A B C) {a a' : A} {b b' : B} a a' b b' f a b f a' b'
cong₂ f refl refl = refl
cong₃ : { ' '' ''' : Level}{A : Set }{B : Set '}{C : Set ''}{D : Set '''} (f : A B C D) {a a' : A} {b b' : B}{c c' : C} a a' b b' c c' f a b c f a' b' c'
cong₃ f refl refl refl = refl
-- We can make a proof-irrelevant substitution
substP : {}{A : Set }{'}(P : A Prop '){a a' : A} a a' P a P a'
substP P refl h = h
substPP : {}{A B : Set }{Q : A Prop }{'}(P : {k : A} Q k Prop '){a a' : A}{x : Q a}
(eq : a a') P x P (substP Q eq x)
substPP P refl h = h
substP² : { ' '' : Level}{A : Set }{B : Set '}(P : A B Prop ''){a a' : A}{b b' : B} a a' b b' P a b P a' b'
substP² P refl refl p = p
postulate coe : {}{A B : Set } A B A B
postulate coerefl : {}{A : Set }{eq : A A}{a : A} coe eq a a
postulate ≡fun : { ' : Level} {A : Set } {B : Set '} {f g : A B} ((x : A) (f x g x)) f g
postulate ≡fun' : { ' : Level} {A : Set } {B : A Set '} {f g : (a : A) B a} ((x : A) (f x g x)) f g
coeaba : { : Level}{A B : Set }{eq1 : A B}{eq2 : B A}{a : A} coe eq2 (coe eq1 a) a
coeaba {eq1 = refl} = ≡tran coerefl coerefl
coefgcong : { : Level}{A B C D : Set }{aa : A A}{dd : D D}{cb : C B}{f : B A}{g : D C}{x : D} f (coe cb (g (coe dd x))) coe aa (f (coe cb (g x)))
coefgcong {cb = refl} {f} {g} = ≡tran (cong f (cong (coe _) (cong g coerefl))) (≡sym coerefl)
coecong : { : Level}{A B : Set }{eq : B B}{eq' : A A}(f : A B){x : A} (f (coe eq' x)) (coe eq (f x))
coecong f = ≡tran (cong f coerefl) (≡sym coerefl)
coecoe-coe : { : Level}{A B C : Set }{eq1 : B A}{eq2 : C B}{x : C} coe eq1 (coe eq2 x) coe (≡tran eq2 eq1) x
coecoe-coe {eq1 = refl} {refl} = coerefl
coe-f : { : Level}{A B C D : Set } (A B) A C B D C D
coe-f f ac bd x = coe bd (f (coe (≡sym ac) x))
coewtf : { : Level}{A B C D E F G H : Set }{ab : A B}{cd : C D}{ef : E F}{gh : G H}{f : F B}{g : H E}{x : G}
{fd : F D} f (coe ef (g (coe gh x))) coe ab ((coe-f f fd (≡sym ab)) (coe cd ((coe-f g (≡sym gh) (≡tran² ef fd (≡sym cd))) x)))
coewtf {ab = refl} {refl} {refl} {refl} {f} {g} {fd = refl} = ≡tran (cong f (cong (coe _) (≡sym coeaba))) (≡sym coeaba)
coeshift : { : Level}{A B : Set }{x : A} {y : B} {eq : A B} coe eq x y x coe (≡sym eq) y
coeshift {eq=refl} refl = ≡sym coeaba
subst : {}{A : Set }{'}(P : A Set '){a a' : A} a a' P a P a'
subst P eq p = coe (cong P eq) p
subst² : { ' '' : Level}{A : Set }{B : Set '}(P : A B Set ''){a a' : A}{b b' : B} a a' b b' P a b P a' b'
subst² P eq eq' p = coe (cong₂ P eq eq') p
subst¹P : { ' '' : Level}{A : Set }{B : Prop '}(P : A B Set ''){a a' : A}{b : B} a a' P a b P a' b
subst¹P P {b = b} eq p = coe (cong (λ x P x b) eq) p
--{-# REWRITE transprefl #-}
coereflrefl : { : Level}{A : Set }{eq eq' : A A}{a : A} coe eq (coe eq' a) a
coereflrefl = ≡tran coerefl coerefl
substrefl : {}{A : Set }{'}{P : A Set '}{a : A}{e : a a}{p : P a} subst P e p p
substrefl = coerefl
--{-# REWRITE substrefl #-}
substreflrefl : { ' : Level}{A : Set }{P : A Set '}{a : A}{e : a a}{p : P a} subst P e (subst P e p) p
substreflrefl {P = P} {a} {e} {p} = ≡tran (substrefl {P = P} {a = a} {e = e} {p = subst P e p}) (substrefl {P = P} {a = a} {e = e} {p = p})
cong₂' : { ' '' : Level}{A : Set }{B : A Set '}{C : Set ''} (f : (a : A) B a C) {a a' : A} {b : B a} {b' : B a'} (eq : a a') subst B eq b b' f a b f a' b'
cong₂' f {a} refl refl = cong (f a) (≡sym coerefl)
congsubst : { ' : Level}{A : Set }{P : A Set '}{a a' : A}{e : a a}{p : P a}{p' : P a} p p' subst P e p subst P e p'
congsubst {P = P} {e = refl} h = cong (subst P refl) h
substfpoly : { ' : Level}{A : Set }{P R : A Set '}{α β : A}
{eq : α β} {f : {ξ : A} R ξ P ξ} {x : R α}
coe (cong P eq) (f {α} x) f (coe (cong R eq) x)
substfpoly {eq = refl} {f} = ≡tran coerefl (cong f (≡sym coerefl))
substppoly : { ' '' ''' : Level}{A : Set }{P : A Set '}{R : A Set ''}{Q : A Set '''}{α β : A}
{eq : α β}{f : {ξ : A} R ξ Q ξ P ξ} {x : R α} {y : Q α}
coe (cong P eq) (f {α} x y) f {β} (coe (cong R eq) x) (coe (cong Q eq) y)
substppoly {eq = refl} {f}{x}{y} = ≡tran coerefl (cong₂ f (≡sym coerefl) (≡sym coerefl))
substfpoly' : { ' '' : Level}{A B : Set }{P R : A Set '}{Q : B Prop ''}{α β : A}{γ δ : B}
{eq : α β}{eq' : γ δ} {f : {ξ : A}{ι : B} R ξ Q ι P ξ} {x : R α} {y : Q γ}
coe (cong P eq) (f {α} {γ} x y) f {β} {δ} (coe (cong R eq) x) (substP Q eq' y)
substfpoly' {eq = refl} {refl} {f}{x}{y} = ≡tran² coerefl (cong (λ x f x y) (≡sym coerefl)) refl
substfpoly⁴ : { ' '' : Level}{A : Set }{P R : A Set '}{Q : A Prop ''}{α β : A}
{eq : α β} {f : {ξ : A} R ξ Q ξ P ξ} {x : R α} {y : Q α}
coe (cong P eq) (f {α} x y) f {β} (coe (cong R eq) x) (substP Q eq y)
substfpoly⁴ {eq = refl} {f}{x}{y} = ≡tran² coerefl (cong (λ x f x y) (≡sym coerefl)) refl
substfpoly³ : { ' '' ''' : Level}{A B C : Set }{R : A Set '}{Q : B Prop ''}{P : C Set '''}{α β : A}{γ δ : B}{ε φ : C}
{eq : α β}{eq' : γ δ}{eq'' : ε φ} {f : {ξ : A}{ι : B}{τ : C} R ξ Q ι P τ} {x : R α} {y : Q γ}
coe (cong P eq'') (f {α} {γ} {ε} x y) f {β} {δ} {φ} (coe (cong R eq) x) (substP Q eq' y)
substfpoly³ {eq = refl} {refl} {refl} {f}{x}{y} = ≡tran² coerefl (cong (λ x f x y) (≡sym coerefl)) refl
substfpoly'' : { ' '' : Level}{A C : Set }{P : A C Set '}{R : A Set '}{Q : A C Prop ''}{α β : A}{ε φ : C}
{eq : α β}{eq'' : ε φ} {f : {ξ : A}{κ : C} R ξ Q ξ κ P ξ κ} {x : R α} {y : Q α ε}
coe (cong₂ P eq eq'') (f {α} {ε} x y) f {β} {φ} (coe (cong R eq) x) (substP (λ X Q X φ) eq (substP (Q α) eq'' y))
substfpoly'' {eq = refl} {refl} {f}{x}{y} = ≡tran² coerefl (cong (λ x f x y) (≡sym coerefl)) refl
substfgpoly : { ' : Level}{A B : Set } {P Q : A Set '} {R : B Set '} {F : B A} {α β : A} {ε φ : B}
{eq₁ : α β} {eq₂ : F ε α} {eq₃ : F φ β} {eq₄ : ε φ}
{g : {a : A} Q a P a} {f : {b : B} R b Q (F b)} {x : R ε}
g {β} (subst Q eq₃ (f {φ} (subst R eq₄ x))) subst P eq₁ (g {α} (subst Q eq₂ (f {ε} x)))
substfgpoly {P = P} {Q} {R} {eq₁ = refl} {refl} {refl} {refl} {g} {f} = ≡tran³ (cong g (substrefl {P = Q} {e = refl})) (cong g (cong f (substrefl {P = R} {e = refl}))) (cong g (≡sym (substrefl {P = Q} {e = refl}))) (≡sym (substrefl {P = P} {e = refl}))
{-# BUILTIN EQUALITY _≡_ #-}
coep² : {ℓ₁ ℓ₂ ℓ₃ ℓ₄ : Level} {A : Set ℓ₁} {R : A Set ℓ₂}{T : A Set ℓ₃}{S : A Set ℓ₄}{α β : A}
{p : {ξ : A} R ξ T ξ S ξ}{x : R α}{y : T α}{eq : α β}
subst S (≡sym eq) (p {β} (subst R eq x) (subst T eq y)) p {α} x y
coep² {S = S}{p = p}{x}{y}{refl} = ≡tran (substrefl {P = S} {e = refl}) (cong₂ p (substrefl {a = x} {e = refl}) (substrefl {a = y} {e = refl}))
coep²'' : { ' : Level} {A : Set } {R S : A Set '}{T : A Prop '}{α β : A}
{p : {ξ : A} R ξ T ξ S ξ}{x : R α}{y : T α}{eq : α β}
subst S (≡sym eq) (p {β} (subst R eq x) (substP T eq y)) p {α} x y
coep²'' {S = S}{p = p}{x}{y}{refl} = ≡tran (substrefl {P = S} {e = refl}) (cong (λ X p X y) (substrefl {a = x} {e = refl}))
coep²' : { ' : Level} {A : Set } {R T S : A Set '}{α β : A}
{p : {ξ : A} R ξ T ξ S ξ}{x : R β}{y : T α}{eq : α β}
subst S (≡sym eq) (p {β} x (subst T eq y)) p {α} (subst R (≡sym eq) x) y
coep²' {S = S}{p = p}{x}{y}{refl} = ≡tran (substrefl {P = S} {e = refl}) (cong₂ p (≡sym (substrefl {a = x} {e = refl})) (substrefl {a = y} {e = refl}))
coep∘ : { ' : Level}{A : Set } {R : A A Set '} {α β γ δ ε φ : A}
{p : {x y z : A} R x y R z x R z y}{x : R β γ}{y : R α β}
{eq1 : α δ} {eq2 : β ε} {eq3 : γ φ}
coe (cong₂ R (≡sym eq1) (≡sym eq3)) (p (coe (cong₂ R eq2 eq3) x) (coe (cong₂ R eq1 eq2) y)) p x y
coep∘ {p = p}{eq1 = refl}{refl}{refl} = ≡tran coerefl (cong₂ p coerefl coerefl)
coep∘-helper = λ { ' '' : Level}{B : Set }{A : B Set ''} {R : (b : B) A b A b Set '}
{b₁ b₂ : B} {α γ : A b₁} {δ φ : A b₂}
{eq0 : b₁ b₂}{eqa : subst A eq0 α δ}{eqb : subst A eq0 γ φ}
(≡tran² (cong (R b₂ δ) (≡sym eqb)) (cong (λ X R b₂ X (subst A eq0 γ)) (≡sym eqa)) (≡tran (≡sym (substrefl {P = λ X Set '}{a = R b₂ (subst A eq0 α) (subst A eq0 γ)}{e = refl})) (coep² {p = λ {t} x y R t x y}{eq = eq0})))
coep∘-helper-coe : { ' '' : Level}{B : Set }{A : B Set ''} {R : (b : B) A b A b Set '}
{b₁ b₂ : B} {α γ : A b₁} {δ φ : A b₂}
{eq0 : b₁ b₂}{eqa : subst A eq0 α δ}{eqb : subst A eq0 γ φ} {a : R b₂ δ φ}{a' : R b₁ α γ} coe (coep∘-helper {eq0 = eq0} {eqa = eqa} {eqb = eqb}) a a
coep∘-helper-coe {eq0 = refl}{refl}{refl} = coerefl
{-coep∘' : { ' '' : Level}{B : Set }{A : B → Set ''} {R : (b : B) → A b → A b → Set '}
{b₁ b₂ : B} {α β γ : A b₁} {δ ε φ : A b₂}
{p : {b : B}{x y z : A b} → R b x y → R b z x → R b z y}{x : R b₁ β γ}{y : R b₁ α β}
{eq0 : b₁ ≡ b₂}{eq1 : subst A eq0 α ≡ δ} {eq2 : subst A eq0 β ≡ ε} {eq3 : subst A eq0 γ ≡ φ}
{eq4 : R b₂ δ φ ≡ R b₁ α γ}{eq5 : R b₂ ε φ ≡ R b₁ β γ}{eq6 : R b₂ δ ε ≡ R b₁ α β}
→ coe eq4
(p {b₂} {ε} {φ} {δ} (coe (≡sym (eq5)) x) (coe (≡sym (
eq6
)) y)) ≡ p {b₁} {β} {γ} {α} x y
--coep∘' {p = p} {x} {y} {eq0 = refl} {refl} {refl} {refl} {eq4} = {!!}
-}
data Nat : Set where
zero : Nat
succ : Nat Nat
{-# BUILTIN NATURAL Nat #-}
record _×_ (A : Set ) (B : Set ') : Set ( ') where
constructor _,×_
field
a : A
b : B
record _×'_ (A : Set ) (B : Prop ') : Set ( ') where
constructor _,×'_
field
a : A
b : B
record _×''_ (A : Set ) (B : A Prop ') : Set ( ') where
constructor _,×''_
field
a : A
b : B a
record _×ᵈ_ (A : Set ) (B : A Set ') : Set ( ') where
constructor _,×ᵈ_
field
a : A
b : B a
proj× : { ' : Level}{A : Set }{B : Set '} (A × B) A
proj× p = _×_.a p
proj× : { ' : Level}{A : Set }{B : Set '} (A × B) B
proj× p = _×_.b p
proj×'₁ : { ' : Level}{A : Set }{B : Prop '} (A ×' B) A
proj×'₁ p = _×'_.a p
proj×'₂ : { ' : Level}{A : Set }{B : Prop '} (A ×' B) B
proj×'₂ p = _×'_.b p
proj×''₁ : { ' : Level}{A : Set }{B : A Prop '} (A ×'' B) A
proj×''₁ p = _×''_.a p
proj×''₂ : { ' : Level}{A : Set }{B : A Prop '} (p : A ×'' B) B (proj×''₁ p)
proj×''₂ p = _×''_.b p
proj×ᵈ₁ : { ' : Level}{A : Set }{B : A Set '} (A ×ᵈ B) A
proj×ᵈ₁ p = _×ᵈ_.a p
proj×ᵈ₂ : { ' : Level}{A : Set }{B : A Set '} (p : A ×ᵈ B) (B (proj×ᵈ₁ p))
proj×ᵈ₂ p = _×ᵈ_.b p
×≡ : {A : Set }{B : Set '}{a a' : A}{b b' : B} a a' b b' a ,× b a' ,× b'
×≡ refl refl = refl
×ᵈ≡ : {A : Set }{B : A Set '}{a a' : A}{b : B a}{b' : B a'} (eq : a a') subst B eq b b' a ,×ᵈ b a' ,×ᵈ b'
×ᵈ≡ {B = B} {a = a}{b = b} refl refl = cong₂' _,×ᵈ_ refl refl