\import Data.List
\import Paths
\import Paths.Meta
\data Tree : \Set
| leaf (n : Nat)
| node (t : List Tree) \with { leaf n :: nil => leaf (suc n) }
\func tsuc (a : Tree) => node (a :: nil)
\func add (a b : Tree): Tree \elim b
| leaf 0 => a
| leaf (suc n) => tsuc (add a (leaf n))
| node nil => node nil
| node (n :: nil) => tsuc (add a n)
| node (n :: n' :: ns) => node (add_list a (n :: n' :: ns))
\where {
\func add_list (a : Tree) (b : List Tree) : List Tree \elim b
| nil => nil
| b :: bs => add a b :: add_list a bs
}
\func add-assoc {a b c : Tree} : add a (add b c) = add (add a b) c \elim c
| leaf 0 => idp
| leaf (suc n) => pmap tsuc add-assoc
| node nil => idp
| node (n :: nil) => pmap tsuc add-assoc
| node (n :: n' :: ns) => rewrite (add-assoc, add-assoc, add_list-assoc) idp
\where {
\func add_list-assoc {a b : Tree} {cs : List Tree}
: add.add_list a (add.add_list b cs) = add.add_list (add a b) cs \elim cs
| nil => idp
| c :: cs => pmap2 (::) add-assoc add_list-assoc
}
Comments