Skip to content

Commit

Permalink
Add absorbtion law
Browse files Browse the repository at this point in the history
  • Loading branch information
rahulc29 committed Jan 5, 2024
1 parent c2de082 commit cd5e11d
Show file tree
Hide file tree
Showing 4 changed files with 191 additions and 4 deletions.
15 changes: 12 additions & 3 deletions src/Realizability/Tripos/Algebra/Base.agda
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ open import Realizability.Tripos.Prealgebra.Meets.Commutativity ca
open import Realizability.Tripos.Prealgebra.Meets.Identity ca
open import Realizability.Tripos.Prealgebra.Meets.Idempotency ca
open import Realizability.Tripos.Prealgebra.Meets.Associativity ca
open import Realizability.Tripos.Prealgebra.Absorbtion ca

open CombinatoryAlgebra ca
open Realizability.CombinatoryAlgebra.Combinators ca renaming (i to Id; ia≡a to Ida≡a)
Expand Down Expand Up @@ -155,7 +156,7 @@ module AlgebraicProperties {ℓ' ℓ''} (X : Type ℓ') (isSetX' : isSet X) (isN
squash/
(λ a b [ a ⊓ b ])
(λ { a b c (a≤b , b≤a) eq/ (a ⊓ c) (b ⊓ c) ((antiSym→x⊓z≤y⊓z X isSetX' a b c a≤b b≤a) , (antiSym→x⊓z≤y⊓z X isSetX' b a c b≤a a≤b)) })
(λ { a b c (b≤c , c≤b) eq/ (a ⊓ b) (a ⊓ c) ({!!} , {!!}) })
(λ { a b c (b≤c , c≤b) eq/ (a ⊓ b) (a ⊓ c) (antiSym→x⊓y≤x⊓z X isSetX' a b c b≤c c≤b , antiSym→x⊓y≤x⊓z X isSetX' a c b c≤b b≤c) })
a b

PredicateAlgebra∧SemigroupStr : SemigroupStr PredicateAlgebra
Expand All @@ -179,7 +180,7 @@ module AlgebraicProperties {ℓ' ℓ''} (X : Type ℓ') (isSetX' : isSet X) (isN
IsMonoid.·IdR (MonoidStr.isMonoid PredicateAlgebra∧MonoidStr) x =
elimProp (λ x squash/ (x ∧l 1predicate) x) (λ x eq/ (x ⊓ pre1') x ((x⊓1≤x X isSetX' isNonTrivial x) , (x≤x⊓1 X isSetX' isNonTrivial x))) x
IsMonoid.·IdL (MonoidStr.isMonoid PredicateAlgebra∧MonoidStr) x =
elimProp (λ x squash/ (1predicate ∧l x) x) (λ x eq/ (pre1' ⊓ x) x {!!}) x
elimProp (λ x squash/ (1predicate ∧l x) x) (λ x eq/ (pre1' ⊓ x) x (1⊓x≤x X isSetX' isNonTrivial x , x≤1⊓x X isSetX' isNonTrivial x)) x

PredicateAlgebra∧CommMonoidStr : CommMonoidStr PredicateAlgebra
CommMonoidStr.ε PredicateAlgebra∧CommMonoidStr = 1predicate
Expand All @@ -195,12 +196,20 @@ module AlgebraicProperties {ℓ' ℓ''} (X : Type ℓ') (isSetX' : isSet X) (isN
IsSemilattice.idem (SemilatticeStr.isSemilattice PredicateAlgebra∧SemilatticeStr) x =
elimProp (λ x squash/ (x ∧l x) x) (λ x eq/ (x ⊓ x) x ((x⊓x≤x X isSetX' isNonTrivial x) , (x≤x⊓x X isSetX' isNonTrivial x))) x

absorb∨ : x y x ∨l (x ∧l y) ≡ x
absorb∨ x y =
elimProp2 (λ x y squash/ (x ∨l (x ∧l y)) x) (λ x y eq/ (x ⊔ (x ⊓ y)) x (absorb⊔≤x X isSetX' isNonTrivial x y , x≤absorb⊔ X isSetX' isNonTrivial x y)) x y

absorb∧ : x y x ∧l (x ∨l y) ≡ x
absorb∧ x y =
elimProp2 (λ x y squash/ (x ∧l (x ∨l y)) x) (λ x y eq/ (x ⊓ (x ⊔ y)) x (absorb⊓≤x X isSetX' isNonTrivial x y , x≤absorb⊓ X isSetX' isNonTrivial x y)) x y

PredicateAlgebraLatticeStr : LatticeStr PredicateAlgebra
LatticeStr.0l PredicateAlgebraLatticeStr = 0predicate
LatticeStr.1l PredicateAlgebraLatticeStr = 1predicate
LatticeStr._∨l_ PredicateAlgebraLatticeStr = _∨l_
LatticeStr._∧l_ PredicateAlgebraLatticeStr = _∧l_
IsLattice.joinSemilattice (LatticeStr.isLattice PredicateAlgebraLatticeStr) = SemilatticeStr.isSemilattice PredicateAlgebra∨SemilatticeStr
IsLattice.meetSemilattice (LatticeStr.isLattice PredicateAlgebraLatticeStr) = SemilatticeStr.isSemilattice PredicateAlgebra∧SemilatticeStr
IsLattice.absorb (LatticeStr.isLattice PredicateAlgebraLatticeStr) x y = {!!}
IsLattice.absorb (LatticeStr.isLattice PredicateAlgebraLatticeStr) x y = absorb∨ x y , absorb∧ x y

130 changes: 130 additions & 0 deletions src/Realizability/Tripos/Prealgebra/Absorbtion.agda
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
open import Cubical.Foundations.Prelude
open import Cubical.Data.Unit
open import Cubical.Data.Fin
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 renaming (λ*-naturality to `λ*ComputationRule; λ*-chain to `λ*) hiding (λ*)

module Realizability.Tripos.Prealgebra.Absorbtion {ℓ} {A : Type ℓ} (ca : CombinatoryAlgebra A) where
open import Realizability.Tripos.Prealgebra.Predicate ca
open import Realizability.Tripos.Prealgebra.Meets.Commutativity ca
open CombinatoryAlgebra ca
open Realizability.CombinatoryAlgebra.Combinators ca renaming (i to Id; ia≡a to Ida≡a)

private λ*ComputationRule = `λ*ComputationRule as fefermanStructure
private λ* = `λ* as fefermanStructure

module _ {ℓ' ℓ''} (X : Type ℓ') (isSetX' : isSet X) (isNonTrivial : s ≡ k ⊥) where
private PredicateX = Predicate {ℓ'' = ℓ''} X
open Predicate
open PredicateProperties {ℓ'' = ℓ''} X

`if_then_else_ : {n} Term as n Term as n Term as n Term as n
`if c then t else e = ` Id ̇ c ̇ t ̇ e

absorb⊔ : PredicateX PredicateX PredicateX
absorb⊔ x y = x ⊔ (x ⊓ y)

absorb⊓ : PredicateX PredicateX PredicateX
absorb⊓ x y = x ⊓ (x ⊔ y)

absorb⊔≤x : x y absorb⊔ x y ≤ x
absorb⊔≤x x y =
do
let
proof : Term as 1
proof = `if ` pr₁ ̇ # fzero then ` pr₂ ̇ # fzero else (` pr₁ ̇ (` pr₂ ̇ # fzero))
return
((λ* proof) ,
λ x' a a⊩x⊔x⊓y
transport
(propTruncIdempotent (x .isPropValued x' (λ* proof ⨾ a)))
(a⊩x⊔x⊓y >>=
λ { (inl (pr₁a≡k , pr₂a⊩x))
let
proof≡pr₂a : λ* proof ⨾ a ≡ pr₂ ⨾ a
proof≡pr₂a =
λ* proof ⨾ a
≡⟨ λ*ComputationRule proof (a ∷ []) ⟩
if (pr₁ ⨾ a) then (pr₂ ⨾ a) else (pr₁ ⨾ (pr₂ ⨾ a))
≡⟨ cong (λ x if x then (pr₂ ⨾ a) else (pr₁ ⨾ (pr₂ ⨾ a))) pr₁a≡k ⟩
if true then (pr₂ ⨾ a) else (pr₁ ⨾ (pr₂ ⨾ a))
≡⟨ ifTrueThen _ _ ⟩
pr₂ ⨾ a
in ∣ subst (λ r r ⊩ ∣ x ∣ x') (sym proof≡pr₂a) pr₂a⊩x ∣₁
; (inr (pr₁a≡k' , pr₂a⊩x⊓y))
let
proof≡pr₁pr₂a : λ* proof ⨾ a ≡ pr₁ ⨾ (pr₂ ⨾ a)
proof≡pr₁pr₂a =
λ* proof ⨾ a
≡⟨ λ*ComputationRule proof (a ∷ []) ⟩
if (pr₁ ⨾ a) then (pr₂ ⨾ a) else (pr₁ ⨾ (pr₂ ⨾ a))
≡⟨ cong (λ x if x then (pr₂ ⨾ a) else (pr₁ ⨾ (pr₂ ⨾ a))) pr₁a≡k' ⟩
if false then (pr₂ ⨾ a) else (pr₁ ⨾ (pr₂ ⨾ a))
≡⟨ ifFalseElse _ _ ⟩
pr₁ ⨾ (pr₂ ⨾ a)
in ∣ subst (λ r r ⊩ ∣ x ∣ x') (sym proof≡pr₁pr₂a) (pr₂a⊩x⊓y .fst) ∣₁ }))

x≤absorb⊔ : x y x ≤ absorb⊔ x y
x≤absorb⊔ x y = ∣ pair ⨾ true , (λ x' a a⊩x ∣ inl ((pr₁pxy≡x _ _) , (subst (λ r r ⊩ ∣ x ∣ x') (sym (pr₂pxy≡y _ _)) a⊩x)) ∣₁) ∣₁

absorb⊓≤x : x y absorb⊓ x y ≤ x
absorb⊓≤x x y = ∣ pr₁ , (λ x' a a⊩x⊓x⊔y a⊩x⊓x⊔y .fst) ∣₁

x≤absorb⊓ : x y x ≤ absorb⊓ x y
x≤absorb⊓ x y =
let
proof : Term as 1
proof = ` pair ̇ # fzero ̇ (` pair ̇ ` true ̇ # fzero)
in
return
((λ* proof) ,
(λ x' a a⊩x
let
pr₁proof≡a : pr₁ ⨾ (λ* proof ⨾ a) ≡ a
pr₁proof≡a =
pr₁ ⨾ (λ* proof ⨾ a)
≡⟨ cong (λ x pr₁ ⨾ x) (λ*ComputationRule proof (a ∷ [])) ⟩
pr₁ ⨾ (pair ⨾ a ⨾ (pair ⨾ true ⨾ a))
≡⟨ pr₁pxy≡x _ _ ⟩
a

pr₂proof≡pair⨾true⨾a : pr₂ ⨾ (λ* proof ⨾ a) ≡ pair ⨾ true ⨾ a
pr₂proof≡pair⨾true⨾a =
pr₂ ⨾ (λ* proof ⨾ a)
≡⟨ cong (λ x pr₂ ⨾ x) (λ*ComputationRule proof (a ∷ [])) ⟩
pr₂ ⨾ (pair ⨾ a ⨾ (pair ⨾ true ⨾ a))
≡⟨ pr₂pxy≡y _ _ ⟩
pair ⨾ true ⨾ a

pr₁pr₂proof≡true : pr₁ ⨾ (pr₂ ⨾ (λ* proof ⨾ a)) ≡ true
pr₁pr₂proof≡true =
pr₁ ⨾ (pr₂ ⨾ (λ* proof ⨾ a))
≡⟨ cong (λ x pr₁ ⨾ x) pr₂proof≡pair⨾true⨾a ⟩
pr₁ ⨾ (pair ⨾ true ⨾ a)
≡⟨ pr₁pxy≡x _ _ ⟩
true

pr₂pr₂proof≡a : pr₂ ⨾ (pr₂ ⨾ (λ* proof ⨾ a)) ≡ a
pr₂pr₂proof≡a =
pr₂ ⨾ (pr₂ ⨾ (λ* proof ⨾ a))
≡⟨ cong (λ x pr₂ ⨾ x) pr₂proof≡pair⨾true⨾a ⟩
pr₂ ⨾ (pair ⨾ true ⨾ a)
≡⟨ pr₂pxy≡y _ _ ⟩
a

in
subst (λ r r ⊩ ∣ x ∣ x') (sym pr₁proof≡a) a⊩x ,
∣ inl (pr₁pr₂proof≡true , subst (λ r r ⊩ ∣ x ∣ x') (sym pr₂pr₂proof≡a) a⊩x) ∣₁))
18 changes: 18 additions & 0 deletions src/Realizability/Tripos/Prealgebra/Meets/Commutativity.agda
Original file line number Diff line number Diff line change
Expand Up @@ -57,3 +57,21 @@ module _ {ℓ' ℓ''} (X : Type ℓ') (isSetX' : isSet X) where
(sym (λ*ComputationRule proof (a ∷ [])))
((subst (λ r r ⊩ ∣ y ∣ x') (sym (pr₁pxy≡x _ _)) (f⊩x≤y x' (pr₁ ⨾ a) (a⊩x⊓z .fst))) ,
(subst (λ r r ⊩ ∣ z ∣ x') (sym (pr₂pxy≡y _ _)) (a⊩x⊓z .snd)))))


antiSym→x⊓y≤x⊓z : x y z y ≤ z z ≤ y x ⊓ y ≤ x ⊓ z
antiSym→x⊓y≤x⊓z x y z y≤z z≤y =
do
(f , f⊩y≤z) y≤z
(g , g⊩z≤y) z≤y
let
proof : Term as 1
proof = ` pair ̇ (` pr₁ ̇ # fzero) ̇ (` f ̇ (` pr₂ ̇ # fzero))
return
((λ* proof) ,
(λ { x' a (pr₁a⊩x , pr₂a⊩y)
subst
(λ r r ⊩ ∣ x ⊓ z ∣ x')
(sym (λ*ComputationRule proof (a ∷ [])))
((subst (λ r r ⊩ ∣ x ∣ x') (sym (pr₁pxy≡x _ _)) pr₁a⊩x) ,
(subst (λ r r ⊩ ∣ z ∣ x') (sym (pr₂pxy≡y _ _)) (f⊩y≤z x' (pr₂ ⨾ a) pr₂a⊩y))) }))
32 changes: 31 additions & 1 deletion src/Realizability/Tripos/Prealgebra/Meets/Identity.agda
Original file line number Diff line number Diff line change
Expand Up @@ -40,4 +40,34 @@ module _ {ℓ' ℓ''} (X : Type ℓ') (isSetX' : isSet X) (isNonTrivial : s ≡
let
proof : Term as 1
proof = ` pair ̇ # fzero ̇ ` true
return ((λ* proof) , (λ x' a a⊩x subst (λ r ∣ x ⊓ pre1 ∣ x' r) (sym (λ*ComputationRule proof (a ∷ []))) (subst (λ r r ⊩ ∣ x ∣ x') (sym (pr₁pxy≡x _ _)) a⊩x , tt*)))
return
((λ* proof) ,
(λ x' a a⊩x
subst
(λ r ∣ x ⊓ pre1 ∣ x' r)
(sym (λ*ComputationRule proof (a ∷ [])))
(subst
(λ r r ⊩ ∣ x ∣ x')
(sym (pr₁pxy≡x _ _))
a⊩x , tt*)))

1⊓x≤x : x pre1 ⊓ x ≤ x
1⊓x≤x x = ∣ pr₂ , (λ x' a a⊩1⊓x a⊩1⊓x .snd) ∣₁

x≤1⊓x : x x ≤ pre1 ⊓ x
x≤1⊓x x =
do
let
proof : Term as 1
proof = ` pair ̇ ` false ̇ # fzero
return
((λ* proof) ,
(λ x' a a⊩x
subst
(λ r r ⊩ ∣ pre1 ⊓ x ∣ x')
(sym (λ*ComputationRule proof (a ∷ [])))
(tt* ,
(subst
(λ r r ⊩ ∣ x ∣ x')
(sym (pr₂pxy≡y _ _))
a⊩x))))

0 comments on commit cd5e11d

Please sign in to comment.