open import Cubical.Foundations.Prelude
open import Cubical.Data.Unit
open import Cubical.Data.FinData
open import Cubical.Data.Vec
open import Cubical.Data.Sum
open import Cubical.Data.Empty renaming (rec* to ⊥*rec)
open import Cubical.Data.Sigma
open import Cubical.HITs.PropositionalTruncation
open import Cubical.HITs.PropositionalTruncation.Monad
open import Cubical.Relation.Binary.Order.Preorder
open import Realizability.CombinatoryAlgebra
open import Realizability.ApplicativeStructure
module Realizability.Tripos.Prealgebra.Joins.Identity {ℓ ℓ' ℓ''} {A : Type ℓ} (ca : CombinatoryAlgebra A) where
open import Realizability.Tripos.Prealgebra.Predicate {ℓ' = ℓ'} {ℓ'' = ℓ''} ca
open import Realizability.Tripos.Prealgebra.Joins.Commutativity ca
open CombinatoryAlgebra ca
open Realizability.CombinatoryAlgebra.Combinators ca renaming (i to Id; ia≡a to Ida≡a)
module _ (X : Type ℓ') (isSetX' : isSet X) (isNonTrivial : s ≡ k → ⊥) where
private PredicateX = Predicate X
open Predicate
open PredicateProperties X
open PreorderReasoning preorder≤
pre0 : PredicateX
Predicate.isSetX pre0 = isSetX'
∣ pre0 ∣ = λ x a → ⊥*
Predicate.isPropValued pre0 = λ x a → isProp⊥*
x⊔0≤x : ∀ x → x ⊔ pre0 ≤ x
x⊔0≤x x =
do
return
(pr₂ ,
(λ x' a a⊩x⊔0 →
transport
(propTruncIdempotent (x .isPropValued x' (pr₂ ⨾ a)))
(do
a⊩x⊔0 ← a⊩x⊔0
let
goal : ((pr₁ ⨾ a ≡ k) × (pr₂ ⨾ a) ⊩ ∣ x ∣ x') ⊎ ((pr₁ ⨾ a ≡ k') × ⊥*) → (pr₂ ⨾ a) ⊩ ∣ x ∣ x'
goal = λ { (inl (pr₁a≡k , pr₂a⊩x)) → pr₂a⊩x ; (inr (_ , bottom)) → ⊥*rec bottom }
return (goal a⊩x⊔0))))
x≤0⊔x : ∀ x → x ≤ (pre0 ⊔ x)
x≤0⊔x x =
let
proof : Term as 1
proof = ` pair ̇ ` false ̇ # zero
in
return
((λ* proof) ,
(λ x' a a⊩x →
let
pr₁proofEq : pr₁ ⨾ (λ* proof ⨾ a) ≡ false
pr₁proofEq =
pr₁ ⨾ (λ* proof ⨾ a)
≡⟨ cong (λ x → pr₁ ⨾ x) (λ*ComputationRule proof a) ⟩
pr₁ ⨾ (pair ⨾ false ⨾ a)
≡⟨ pr₁pxy≡x _ _ ⟩
false
∎
pr₂proofEq : pr₂ ⨾ (λ* proof ⨾ a) ≡ a
pr₂proofEq =
pr₂ ⨾ (λ* proof ⨾ a)
≡⟨ cong (λ x → pr₂ ⨾ x) (λ*ComputationRule proof a) ⟩
pr₂ ⨾ (pair ⨾ false ⨾ a)
≡⟨ pr₂pxy≡y _ _ ⟩
a
∎
in
∣ inr (pr₁proofEq , subst (λ r → r ⊩ ∣ x ∣ x') (sym pr₂proofEq) a⊩x) ∣₁))
x≤x⊔0 : ∀ x → x ≤ x ⊔ pre0
x≤x⊔0 x =
let
proof : Term as 1
proof = ` pair ̇ ` true ̇ # zero
in return
((λ* proof) ,
(λ x' a a⊩x →
let
pr₁proofEq : pr₁ ⨾ (λ* proof ⨾ a) ≡ true
pr₁proofEq =
pr₁ ⨾ (λ* proof ⨾ a)
≡⟨ cong (λ x → pr₁ ⨾ x) (λ*ComputationRule proof a) ⟩
pr₁ ⨾ (pair ⨾ true ⨾ a)
≡⟨ pr₁pxy≡x _ _ ⟩
true
∎
pr₂proofEq : pr₂ ⨾ (λ* proof ⨾ a) ≡ a
pr₂proofEq =
pr₂ ⨾ (λ* proof ⨾ a)
≡⟨ cong (λ x → pr₂ ⨾ x) (λ*ComputationRule proof a) ⟩
pr₂ ⨾ (pair ⨾ true ⨾ a)
≡⟨ pr₂pxy≡y _ _ ⟩
a
∎
in
∣ inl (pr₁proofEq , subst (λ r → r ⊩ ∣ x ∣ x') (sym pr₂proofEq) a⊩x) ∣₁))