theory Tree_Lib
imports "../Tree/Tree_Behavior_BNF" "../Tree/Tree_More_Corec_Upto2"
begin
type_synonym tree = J
abbreviation "val xs ≡ fst (dtor_J xs)"
abbreviation "sub xs ≡ snd (dtor_J xs)"
abbreviation "Node n ts ≡ ctor_J (n, ts)"
code_datatype ctor_J
declare J.dtor_ctor[code]
definition tmap where
"tmap f = corec_J (λxs. (f (val xs), map Inr (sub xs)))"
lemma head_tmap[simp]: "val (tmap f xs) = f (val xs)"
unfolding tmap_def corec_J_def J.dtor_corec BNF_Comp.id_bnf_comp_def map_pre_J_def by simp
lemma tail_tmap[simp]: "sub (tmap f xs) = map (tmap f) (sub xs)"
unfolding tmap_def corec_J_def J.dtor_corec BNF_Comp.id_bnf_comp_def map_pre_J_def by simp
lemma tmap_code[code]: "tmap f xs = Node (f (val xs)) (map (tmap f) (sub xs))"
by (metis J.ctor_dtor prod.collapse head_tmap tail_tmap)
section {* Abbreviations *}
abbreviation "NODE0 ≡ gg0 :: 'a ΣΣ0 F => 'a ΣΣ0"
abbreviation "LEAF0 ≡ leaf0"
abbreviation GUARD0 :: "'a F => 'a F ΣΣ0" where "GUARD0 ≡ LEAF0"
abbreviation END0 :: "J => (J + 'a) ΣΣ0" where "END0 xs ≡ LEAF0 (Inl xs)"
abbreviation CONT0 :: "'a => (J + 'a) ΣΣ0" where "CONT0 a ≡ LEAF0 (Inr a)"
abbreviation "NODE1 ≡ gg1 :: 'a ΣΣ1 F => 'a ΣΣ1"
abbreviation "LEAF1 ≡ leaf1"
abbreviation GUARD1 :: "'a F => 'a F ΣΣ1" where "GUARD1 ≡ LEAF1"
abbreviation END1 :: "J => (J + 'a) ΣΣ1" where "END1 xs ≡ LEAF1 (Inl xs)"
abbreviation CONT1 :: "'a => (J + 'a) ΣΣ1" where "CONT1 a ≡ LEAF1 (Inr a)"
abbreviation "NODE2 ≡ gg2 :: 'a ΣΣ2 F => 'a ΣΣ2"
abbreviation "LEAF2 ≡ leaf2"
abbreviation GUARD2 :: "'a F => 'a F ΣΣ2" where "GUARD2 ≡ LEAF2"
abbreviation END2 :: "J => (J + 'a) ΣΣ2" where "END2 xs ≡ LEAF2 (Inl xs)"
abbreviation CONT2 :: "'a => (J + 'a) ΣΣ2" where "CONT2 a ≡ LEAF2 (Inr a)"
end