diff -r 89ed51d72e4a -r aea02b5a58d2 thys/Rec_Def.thy --- a/thys/Rec_Def.thy Thu May 02 12:49:15 2013 +0100 +++ b/thys/Rec_Def.thy Thu May 02 12:49:33 2013 +0100 @@ -9,10 +9,14 @@ | Pr nat recf recf | Mn nat recf +definition pred_of_nl :: "nat list \ nat list" + where + "pred_of_nl xs = butlast xs @ [last xs - 1]" + function rec_exec :: "recf \ nat list \ nat" where "rec_exec z xs = 0" | - "rec_exec s xs = Suc (xs ! 0)" | + "rec_exec s xs = (Suc (xs ! 0))" | "rec_exec (id m n) xs = (xs ! n)" | "rec_exec (Cn n f gs) xs = rec_exec f (map (\ a. rec_exec a xs) gs)" | @@ -27,33 +31,20 @@ apply(auto simp add: less_Suc_eq_le intro: trans_le_add2 list_size_estimation') done -inductive - terminates :: "recf \ nat list \ bool" -where - termi_z: "terminates z [n]" -| termi_s: "terminates s [n]" -| termi_id: "\n < m; length xs = m\ \ terminates (id m n) xs" -| termi_cn: "\terminates f (map (\g. rec_exec g xs) gs); - \g \ set gs. terminates g xs; length xs = n\ \ terminates (Cn n f gs) xs" -| termi_pr: "\\ y < x. terminates g (xs @ y # [rec_exec (Pr n f g) (xs @ [y])]); - terminates f xs; +inductive terminate :: "recf \ nat list \ bool" + where + termi_z: "terminate z [n]" +| termi_s: "terminate s [n]" +| termi_id: "\n < m; length xs = m\ \ terminate (id m n) xs" +| termi_cn: "\terminate f (map (\g. rec_exec g xs) gs); + \g \ set gs. terminate g xs; length xs = n\ \ terminate (Cn n f gs) xs" +| termi_pr: "\\ y < x. terminate g (xs @ y # [rec_exec (Pr n f g) (xs @ [y])]); + terminate f xs; length xs = n\ - \ terminates (Pr n f g) (xs @ [x])" -| termi_mn: "\length xs = n; terminates f (xs @ [r]); + \ terminate (Pr n f g) (xs @ [x])" +| termi_mn: "\length xs = n; terminate f (xs @ [r]); rec_exec f (xs @ [r]) = 0; - \ i < r. terminates f (xs @ [i]) \ rec_exec f (xs @ [i]) > 0\ \ terminates (Mn n f) xs" + \ i < r. terminate f (xs @ [i]) \ rec_exec f (xs @ [i]) > 0\ \ terminate (Mn n f) xs" -inductive_cases terminates_pr_reverse: "terminates (Pr n f g) xs" - -inductive_cases terminates_z_reverse[elim!]: "terminates z xs" - -inductive_cases terminates_s_reverse[elim!]: "terminates s xs" - -inductive_cases terminates_id_reverse[elim!]: "terminates (id m n) xs" - -inductive_cases terminates_cn_reverse[elim!]: "terminates (Cn n f gs) xs" - -inductive_cases terminates_mn_reverse[elim!]:"terminates (Mn n f) xs" - end \ No newline at end of file