{-# OPTIONS --safe #-}
module Cubical.HITs.ListedFiniteSet.Properties where
open import Cubical.Foundations.Prelude
open import Cubical.Data.Prod using (_×_; _,_)
open import Cubical.HITs.ListedFiniteSet.Base
private
variable
ℓ : Level
A B : Type ℓ
assoc-++ : ∀ (xs : LFSet A) ys zs → xs ++ (ys ++ zs) ≡ (xs ++ ys) ++ zs
assoc-++ [] ys zs = refl
assoc-++ (x ∷ xs) ys zs = cong (x ∷_) (assoc-++ xs ys zs)
assoc-++ (dup x xs i) ys zs j = dup x (assoc-++ xs ys zs j) i
assoc-++ (comm x y xs i) ys zs j = comm x y (assoc-++ xs ys zs j) i
assoc-++ (trunc xs xs' p q i k) ys zs j =
trunc
(assoc-++ xs ys zs j) (assoc-++ xs' ys zs j)
(cong (λ xs → assoc-++ xs ys zs j) p) (cong (λ xs → assoc-++ xs ys zs j) q)
i k
comm-++-[] : ∀ (xs : LFSet A) → xs ++ [] ≡ [] ++ xs
comm-++-[] xs =
PropElim.f
refl
(λ x {xs} ind →
(x ∷ xs) ++ [] ≡⟨ refl ⟩
x ∷ (xs ++ []) ≡⟨ cong (x ∷_) ind ⟩
x ∷ xs ≡⟨ refl ⟩
[] ++ (x ∷ xs) ∎
)
(λ _ → trunc _ _)
xs
comm-++-∷
: ∀ (z : A) xs ys
→ xs ++ (z ∷ ys) ≡ (z ∷ xs) ++ ys
comm-++-∷ z xs ys =
PropElim.f
refl
(λ x {xs} ind →
x ∷ (xs ++ (z ∷ ys)) ≡⟨ cong (x ∷_) ind ⟩
x ∷ z ∷ (xs ++ ys) ≡⟨ comm x z (xs ++ ys) ⟩
z ∷ x ∷ (xs ++ ys) ∎
)
(λ _ → trunc _ _)
xs
comm-++ : (xs ys : LFSet A) → xs ++ ys ≡ ys ++ xs
comm-++ xs ys =
PropElim.f
(comm-++-[] xs)
(λ y {ys} ind →
xs ++ (y ∷ ys) ≡⟨ comm-++-∷ y xs ys ⟩
y ∷ (xs ++ ys) ≡⟨ cong (y ∷_) ind ⟩
y ∷ (ys ++ xs) ≡⟨ refl ⟩
(y ∷ ys) ++ xs ∎
)
(λ _ → trunc _ _)
ys
idem-++ : (xs : LFSet A) → xs ++ xs ≡ xs
idem-++ =
PropElim.f
refl
(λ x {xs} ind →
(x ∷ xs) ++ (x ∷ xs) ≡⟨ refl ⟩
x ∷ (xs ++ (x ∷ xs)) ≡⟨ refl ⟩
x ∷ (xs ++ ((x ∷ []) ++ xs)) ≡⟨ cong (x ∷_) (assoc-++ xs (x ∷ []) xs) ⟩
x ∷ ((xs ++ (x ∷ [])) ++ xs)
≡⟨ cong (λ h → x ∷ (h ++ xs)) (comm-++ xs (x ∷ [])) ⟩
x ∷ x ∷ (xs ++ xs) ≡⟨ cong (λ ys → x ∷ x ∷ ys) ind ⟩
x ∷ x ∷ xs ≡⟨ dup x xs ⟩
x ∷ xs ∎
)
(λ xs → trunc (xs ++ xs) xs)
cart-product : LFSet A → LFSet B → LFSet (A × B)
cart-product [] ys = []
cart-product (x ∷ xs) ys = map (x ,_) ys ++ cart-product xs ys
cart-product (dup x xs i) ys =
( map (x ,_) ys ++ (map (x ,_) ys ++ cart-product xs ys)
≡⟨ assoc-++ (map (x ,_) ys) (map (x ,_) ys) (cart-product xs ys) ⟩
(map (x ,_) ys ++ map (x ,_) ys) ++ cart-product xs ys
≡⟨ cong (_++ cart-product xs ys) (idem-++ (map (x ,_) ys)) ⟩
map (x ,_) ys ++ cart-product xs ys
∎
) i
cart-product (comm x y xs i) ys =
( map (x ,_) ys ++ (map (y ,_) ys ++ cart-product xs ys)
≡⟨ assoc-++ (map (x ,_) ys) (map (y ,_) ys) (cart-product xs ys) ⟩
(map (x ,_) ys ++ map (y ,_) ys) ++ cart-product xs ys
≡⟨ cong (_++ cart-product xs ys) (comm-++ (map (x ,_) ys) (map (y ,_) ys)) ⟩
(map (y ,_) ys ++ map (x ,_) ys) ++ cart-product xs ys
≡⟨ sym (assoc-++ (map (y ,_) ys) (map (x ,_) ys) (cart-product xs ys)) ⟩
map (y ,_) ys ++ (map (x ,_) ys ++ cart-product xs ys)
∎
) i
cart-product (trunc xs xs′ p q i j) ys =
trunc
(cart-product xs ys) (cart-product xs′ ys)
(λ k → cart-product (p k) ys) (λ k → cart-product (q k) ys)
i j