theory Terms = Main + Swap: (* terms *) datatype trm = Abst string trm | Susp "(string \ string)list" string | Unit | Atom string | Paar trm trm | Func string trm (* swapping operation on terms *) consts swap :: "(string \ string)list \ trm \ trm" primrec "swap pi (Unit) = Unit" "swap pi (Atom a) = Atom (swapas pi a)" "swap pi (Susp pi' X) = Susp (pi@pi') X" "swap pi (Abst a t) = Abst (swapas pi a) (swap pi t)" "swap pi (Paar t1 t2) = Paar (swap pi t1) (swap pi t2)" "swap pi (Func F t) = Func F (swap pi t)" lemma [simp]: "swap [] t = t" apply(induct_tac t) apply(auto) done lemma swap_append[rule_format]: "\pi1 pi2. swap (pi1@pi2) t = swap pi1 (swap pi2 t)" apply(induct_tac t, auto) apply(induct_tac pi1,auto) apply(induct_tac pi1,auto) done lemma swap_empty: "swap pi t=Susp [] X\ pi=[]" apply(induct_tac t) apply(auto) done (* depyh of terms *) consts depth :: "trm \ nat" primrec "depth (Unit) = 0" "depth (Atom a) = 0" "depth (Susp pi X) = 0" "depth (Abst a t) = 1 + depth t" "depth (Func F t) = 1 + depth t" "depth (Paar t t') = 1 + (max (depth t) (depth t'))" lemma Suc_max_left: "Suc(max x y) = z \ x < z" and Suc_max_right: "Suc(max x y) = z \ y < z" apply(auto) apply(simp_all only: max_Suc_Suc[THEN sym] less_max_iff_disj) apply(simp_all) done lemma [simp]: "depth (swap pi t) = depth t" apply(induct_tac t,auto) done (* occurs predicate and variables in terms *) consts occurs :: "string \ trm \ bool" primrec "occurs X (Unit) = False" "occurs X (Atom a) = False" "occurs X (Susp pi Y) = (if X=Y then True else False)" "occurs X (Abst a t) = occurs X t" "occurs X (Paar t1 t2) = (if (occurs X t1) then True else (occurs X t2))" "occurs X (Func F t) = occurs X t" consts vars_trm :: "trm \ string set" primrec "vars_trm (Unit) = {}" "vars_trm (Atom a) = {}" "vars_trm (Susp pi X) = {X}" "vars_trm (Paar t1 t2) = (vars_trm t1)\(vars_trm t2)" "vars_trm (Abst a t) = vars_trm t" "vars_trm (Func F t) = vars_trm t" (* subterms and proper subterms *) consts sub_trms :: "trm \ trm set" primrec "sub_trms (Unit) = {Unit}" "sub_trms (Atom a) = {Atom a}" "sub_trms (Susp pi Y) = {Susp pi Y}" "sub_trms (Abst a t) = {Abst a t}\sub_trms t" "sub_trms (Paar t1 t2) = {Paar t1 t2}\sub_trms t1 \sub_trms t2" "sub_trms (Func F t) = {Func F t}\sub_trms t" consts psub_trms :: "trm \ trm set" primrec "psub_trms (Unit) = {}" "psub_trms (Atom a) = {}" "psub_trms (Susp pi X) = {}" "psub_trms (Paar t1 t2) = sub_trms t1 \ sub_trms t2" "psub_trms (Abst a t) = sub_trms t" "psub_trms (Func F t) = sub_trms t" lemma psub_sub_trms[rule_format]: "\t1 . t1 \ psub_trms t2 \ t1 \ sub_trms t2" apply(induct t2) apply(auto) done lemma t_sub_trms_t: "t\ sub_trms t" apply(induct t) apply(auto) done lemma abst_psub_trms[rule_format]: "\ t1. Abst a t1 \ sub_trms t2 \ t1 \ psub_trms t2" apply(induct_tac t2) apply(auto) apply(simp only: t_sub_trms_t) apply(best dest!: psub_sub_trms)+ done lemma func_psub_trms[rule_format]: "\ t1. Func F t1 \ sub_trms t2 \ t1 \ psub_trms t2" apply(induct_tac t2) apply(auto) apply(best dest!: psub_sub_trms)+ apply(simp add: t_sub_trms_t) apply(best dest!: psub_sub_trms) done lemma paar_psub_trms[rule_format]: "\ t1. Paar t1 t2 \ sub_trms t3\(t1 \ psub_trms t3 \ t2 \ psub_trms t3)" apply(induct_tac t3) apply(auto) apply(best dest!: psub_sub_trms)+ apply(simp add: t_sub_trms_t)+ apply(best dest!: psub_sub_trms)+ done end