|
| 1 | +```agda |
| 2 | +module Data.Map.Base where |
| 3 | +
|
| 4 | +open import 1Lab.Prelude |
| 5 | +open import Data.Nat.Solver |
| 6 | +open import Data.Sum |
| 7 | +open import Order.Base |
| 8 | +open import Order.Total |
| 9 | +``` |
| 10 | + |
| 11 | +```agda |
| 12 | +module SortedTrees (P : Poset lzero lzero) (idto : is-decidable-total-order P) where |
| 13 | +
|
| 14 | + open is-decidable-total-order idto |
| 15 | +
|
| 16 | + record II : Type where |
| 17 | + constructor 〚_,_〛 |
| 18 | + field |
| 19 | + l : Ob |
| 20 | + r : Ob |
| 21 | +
|
| 22 | + open II |
| 23 | +
|
| 24 | + record Elt (i : II) : Type where |
| 25 | + constructor elt |
| 26 | + field |
| 27 | + p : Ob |
| 28 | + lp : i .l ≤ p |
| 29 | + pr : p ≤ i .r |
| 30 | +
|
| 31 | + Valid : II -> Type |
| 32 | + Valid i = i .l ≤ i .r |
| 33 | +
|
| 34 | + variable i : II |
| 35 | +
|
| 36 | + interleaved mutual |
| 37 | + data Tree : II -> Type |
| 38 | + size : Tree i -> Nat |
| 39 | +
|
| 40 | + data _ where |
| 41 | + Leaf : Valid i -> Tree i |
| 42 | + Node : (p : Ob) -> (l : Tree 〚 i .l , p 〛) -> (r : Tree 〚 p , i .r 〛) -> (n : Nat) -> (n ≡ 1 + size l + size r) -> Tree i |
| 43 | +
|
| 44 | + size (Leaf _) = 0 |
| 45 | + size (Node _ _ _ n _) = n |
| 46 | +
|
| 47 | + interleaved mutual |
| 48 | + insert : Tree i -> Elt i -> Tree i |
| 49 | + insertSize : (t : Tree i) -> (e : Elt i) -> 1 + size t ≡ size (insert t e) |
| 50 | +
|
| 51 | + insert (Leaf _) (elt p lp pr) = Node p (Leaf lp) (Leaf pr) 1 refl |
| 52 | + insert (Node q l r n pf) (elt p lp pr) with compare p q |
| 53 | + ... | inl pq = |
| 54 | + let e' = elt p lp pq in |
| 55 | + let l' = insert l e' in |
| 56 | + let pf' = 1 + n ≡⟨ ap suc pf ⟩ 1 + (1 + size l + size r) |
| 57 | + ≡⟨ ap ((λ k -> 1 + k + size r)) (insertSize l e') ⟩ 1 + (size l' + size r) ∎ in |
| 58 | + Node q l' r (1 + n) pf' |
| 59 | + ... | inr qp = |
| 60 | + let e' = elt p qp pr in |
| 61 | + let r' = insert r e' in |
| 62 | + let pf' = 1 + n ≡⟨ ap suc pf ⟩ suc (suc (size l + size r)) |
| 63 | + ≡⟨ nat! ⟩ suc (size l + (suc (size r))) |
| 64 | + ≡⟨ ap ((λ k -> 1 + size l + k)) (insertSize r e') ⟩ suc (size l + size r') ∎ in |
| 65 | + Node q l r' (1 + n) pf' |
| 66 | +
|
| 67 | + insertSize (Leaf x) e = refl |
| 68 | + insertSize (Node q _ _ _ _) (elt p _ _) with compare p q |
| 69 | + ... | inl pq = refl |
| 70 | + ... | inr qp = refl |
| 71 | +``` |
0 commit comments