41 val conjunctionD2 = thm "conjunctionD2" |
41 val conjunctionD2 = thm "conjunctionD2" |
42 |
42 |
43 |
43 |
44 fun mk_psimp thy globals R f_iff graph_is_function clause valthm = |
44 fun mk_psimp thy globals R f_iff graph_is_function clause valthm = |
45 let |
45 let |
46 val Globals {domT, z, ...} = globals |
46 val Globals {domT, z, ...} = globals |
47 |
47 |
48 val ClauseInfo {qglr = (oqs, _, _, _), cdata = ClauseContext {qs, cqs, gs, lhs, rhs, ags, ...}, ...} = clause |
48 val ClauseInfo {qglr = (oqs, _, _, _), cdata = ClauseContext {qs, cqs, gs, lhs, rhs, ags, ...}, ...} = clause |
49 val lhs_acc = cterm_of thy (Trueprop (mk_acc domT R $ lhs)) (* "acc R lhs" *) |
49 val lhs_acc = cterm_of thy (Trueprop (mk_acc domT R $ lhs)) (* "acc R lhs" *) |
50 val z_smaller = cterm_of thy (Trueprop (R $ z $ lhs)) (* "R z lhs" *) |
50 val z_smaller = cterm_of thy (Trueprop (R $ z $ lhs)) (* "R z lhs" *) |
51 in |
51 in |
52 ((assume z_smaller) RS ((assume lhs_acc) RS acc_downward)) |
52 ((assume z_smaller) RS ((assume lhs_acc) RS acc_downward)) |
53 |> (fn it => it COMP graph_is_function) |
53 |> (fn it => it COMP graph_is_function) |
54 |> implies_intr z_smaller |
54 |> implies_intr z_smaller |
55 |> forall_intr (cterm_of thy z) |
55 |> forall_intr (cterm_of thy z) |
62 |
62 |
63 |
63 |
64 |
64 |
65 fun mk_partial_induct_rule thy globals R complete_thm clauses = |
65 fun mk_partial_induct_rule thy globals R complete_thm clauses = |
66 let |
66 let |
67 val Globals {domT, x, z, a, P, D, ...} = globals |
67 val Globals {domT, x, z, a, P, D, ...} = globals |
68 val acc_R = mk_acc domT R |
68 val acc_R = mk_acc domT R |
69 |
69 |
70 val x_D = assume (cterm_of thy (Trueprop (D $ x))) |
70 val x_D = assume (cterm_of thy (Trueprop (D $ x))) |
71 val a_D = cterm_of thy (Trueprop (D $ a)) |
71 val a_D = cterm_of thy (Trueprop (D $ a)) |
72 |
72 |
73 val D_subset = cterm_of thy (mk_forall x (implies $ Trueprop (D $ x) $ Trueprop (acc_R $ x))) |
73 val D_subset = cterm_of thy (mk_forall x (implies $ Trueprop (D $ x) $ Trueprop (acc_R $ x))) |
74 |
74 |
75 val D_dcl = (* "!!x z. [| x: D; (z,x):R |] ==> z:D" *) |
75 val D_dcl = (* "!!x z. [| x: D; (z,x):R |] ==> z:D" *) |
76 mk_forall x |
76 mk_forall x |
77 (mk_forall z (Logic.mk_implies (Trueprop (D $ x), |
77 (mk_forall z (Logic.mk_implies (Trueprop (D $ x), |
78 Logic.mk_implies (Trueprop (R $ z $ x), |
78 Logic.mk_implies (Trueprop (R $ z $ x), |
79 Trueprop (D $ z))))) |
79 Trueprop (D $ z))))) |
80 |> cterm_of thy |
80 |> cterm_of thy |
81 |
81 |
82 |
82 |
83 (* Inductive Hypothesis: !!z. (z,x):R ==> P z *) |
83 (* Inductive Hypothesis: !!z. (z,x):R ==> P z *) |
84 val ihyp = all domT $ Abs ("z", domT, |
84 val ihyp = all domT $ Abs ("z", domT, |
85 implies $ Trueprop (R $ Bound 0 $ x) |
85 implies $ Trueprop (R $ Bound 0 $ x) |
86 $ Trueprop (P $ Bound 0)) |
86 $ Trueprop (P $ Bound 0)) |
87 |> cterm_of thy |
87 |> cterm_of thy |
88 |
88 |
89 val aihyp = assume ihyp |
89 val aihyp = assume ihyp |
90 |
90 |
91 fun prove_case clause = |
91 fun prove_case clause = |
92 let |
92 let |
93 val ClauseInfo {cdata = ClauseContext {qs, cqs, ags, gs, lhs, rhs, case_hyp, ...}, RCs, |
93 val ClauseInfo {cdata = ClauseContext {qs, cqs, ags, gs, lhs, rhs, case_hyp, ...}, RCs, |
94 qglr = (oqs, _, _, _), ...} = clause |
94 qglr = (oqs, _, _, _), ...} = clause |
294 |
297 |
295 fun mk_partial_rules thy data provedgoal = |
298 fun mk_partial_rules thy data provedgoal = |
296 let |
299 let |
297 val Prep {globals, G, f, R, clauses, values, R_cases, ex1_iff, ...} = data |
300 val Prep {globals, G, f, R, clauses, values, R_cases, ex1_iff, ...} = data |
298 |
301 |
299 val _ = Output.debug "Closing Derivation" |
302 val provedgoal = PROFILE "Closing Derivation" Drule.close_derivation provedgoal |
300 |
|
301 val provedgoal = Drule.close_derivation provedgoal |
|
302 |
303 |
303 val _ = Output.debug "Getting function theorem" |
304 val graph_is_function = PROFILE "Getting function theorem" (fn x => (x COMP conjunctionD1) |> forall_elim_vars 0) provedgoal |
304 |
|
305 val graph_is_function = (provedgoal COMP conjunctionD1) |
|
306 |> forall_elim_vars 0 |
|
307 |
305 |
308 val _ = Output.debug "Getting cases" |
306 val complete_thm = PROFILE "Getting cases" (curry op COMP provedgoal) conjunctionD2 |
309 |
307 |
310 val complete_thm = provedgoal COMP conjunctionD2 |
308 val f_iff = PROFILE "Making f_iff" (curry op RS graph_is_function) ex1_iff |
311 |
|
312 val _ = Output.debug "Making f_iff" |
|
313 |
|
314 val f_iff = (graph_is_function RS ex1_iff) |
|
315 |
309 |
316 val _ = Output.debug "Proving simplification rules" |
310 val psimps = PROFILE "Proving simplification rules" (map2 (mk_psimp thy globals R f_iff graph_is_function)) clauses values |
317 val psimps = map2 (mk_psimp thy globals R f_iff graph_is_function) clauses values |
311 |
318 |
312 val (subset_pinduct, simple_pinduct) = PROFILE "Proving partial induction rule" |
319 val _ = Output.debug "Proving partial induction rule" |
313 (mk_partial_induct_rule thy globals R complete_thm) clauses |
320 val (subset_pinduct, simple_pinduct) = mk_partial_induct_rule thy globals R complete_thm clauses |
|
321 |
314 |
322 val _ = Output.debug "Proving nested termination rule" |
315 val total_intro = PROFILE "Proving nested termination rule" (mk_nest_term_rule thy globals R R_cases) clauses |
323 val total_intro = mk_nest_term_rule thy globals R R_cases clauses |
|
324 |
316 |
325 val _ = Output.debug "Proving domain introduction rules" |
317 val dom_intros = PROFILE "Proving domain introduction rules" (map (maybe_mk_domain_intro thy globals R R_cases)) clauses |
326 val dom_intros = map (mk_domain_intro thy globals R R_cases) clauses |
|
327 in |
318 in |
328 FundefResult {f=f, G=G, R=R, completeness=complete_thm, |
319 FundefResult {f=f, G=G, R=R, completeness=complete_thm, |
329 psimps=psimps, subset_pinduct=subset_pinduct, simple_pinduct=simple_pinduct, total_intro=total_intro, |
320 psimps=psimps, subset_pinduct=subset_pinduct, simple_pinduct=simple_pinduct, total_intro=total_intro, |
330 dom_intros=dom_intros} |
321 dom_intros=dom_intros} |
331 end |
322 end |