Qiit.cross
data
L : U
lnil : El L
lcons : ℕ → El L → El L
data [a : 𝕌]
Bag : U
bnil : El Bag
bins : a → El Bag → El Bag
bswp : (x : a) (y : a) (m : El Bag) → bins x (bins y m) ≡ bins y (bins x m) ∈ El Bag
bapp : {a : 𝕌} → Bag a → Bag a → Bag a using (bswp, Qiit.cross.Bag.unfold, Qiit.cross.bins.eq)
bapp = λa m n. BagElim a (λw. Bag a) n (λx r ih. bins a x ih) (λx y r ih. ⋆) m
toBag : L → Bag ℕ
using (Qiit.cross.Bag.eq, Qiit.cross.Bag.unfold, Qiit.cross.L.eq, Qiit.cross.L.unfold)
toBag = λt. LElim (λw. Bag ℕ) (bnil ℕ) (λx r ih. bins ℕ x ih) t
toBagSwap : (x y : ℕ) (t : L) → toBag (lcons x (lcons y t)) ≡ toBag (lcons y (lcons x t))
using (bswp,
Qiit.cross.Bag.unfold,
Qiit.cross.L.eq,
Qiit.cross.L.unfold,
Qiit.cross.LElim.eq,
Qiit.cross.bins.eq,
Qiit.cross.lcons.eq,
Qiit.cross.toBag.eq)
toBagSwap = λx y t. ⋆
data
P : U
leaf : Bag ℕ → El P
node : El P → El P → El P
flatten : P → Bag ℕ using (Qiit.cross.Bag.unfold, Qiit.cross.P.unfold)
flatten = λp. PElim (λw. Bag ℕ) (λb. b) (λl ihl r ihr. bapp ihl ihr) p
two : Bag ℕ using (Qiit.cross.Bag.eq, Qiit.cross.Bag.unfold)
two = bins ℕ Z (bins ℕ (S Z) (bnil ℕ))
flatTest : flatten (node (leaf (toBag (lcons Z lnil))) (leaf (bins ℕ (S Z) (bnil ℕ)))) ≡ two
using (Qiit.cross.Bag.eq,
Qiit.cross.BagElim.eq,
Qiit.cross.L.eq,
Qiit.cross.LElim.eq,
Qiit.cross.P.eq,
Qiit.cross.PElim.eq,
Qiit.cross.bapp.eq,
Qiit.cross.bins.eq,
Qiit.cross.bnil.eq,
Qiit.cross.flatten.eq,
Qiit.cross.lcons.eq,
Qiit.cross.leaf.eq,
Qiit.cross.lnil.eq,
Qiit.cross.node.eq,
Qiit.cross.toBag.eq,
Qiit.cross.two.eq)
flatTest = ⋆