81 | Rename_params_rule of string list * int; |
81 | Rename_params_rule of string list * int; |
82 type deriv (* = rule mtree *) |
82 type deriv (* = rule mtree *) |
83 |
83 |
84 (*meta theorems*) |
84 (*meta theorems*) |
85 type thm |
85 type thm |
86 val rep_thm : thm -> {sign: Sign.sg, der: deriv, maxidx: int, |
86 val rep_thm : thm -> {sign: Sign.sg, der: bool * deriv, maxidx: int, |
87 shyps: sort list, hyps: term list, |
87 shyps: sort list, hyps: term list, |
88 prop: term} |
88 prop: term} |
89 val crep_thm : thm -> {sign: Sign.sg, der: deriv, maxidx: int, |
89 val crep_thm : thm -> {sign: Sign.sg, der: bool * deriv, maxidx: int, |
90 shyps: sort list, hyps: cterm list, |
90 shyps: sort list, hyps: cterm list, |
91 prop: cterm} |
91 prop: cterm} |
92 exception THM of string * int * thm list |
92 exception THM of string * int * thm list |
93 type 'a attribute (* = 'a * thm -> 'a * thm *) |
93 type 'a attribute (* = 'a * thm -> 'a * thm *) |
94 val eq_thm : thm * thm -> bool |
94 val eq_thm : thm * thm -> bool |
363 |
363 |
364 datatype deriv_kind = MinDeriv | ThmDeriv | FullDeriv; |
364 datatype deriv_kind = MinDeriv | ThmDeriv | FullDeriv; |
365 |
365 |
366 val keep_derivs = ref MinDeriv; |
366 val keep_derivs = ref MinDeriv; |
367 |
367 |
|
368 local |
368 |
369 |
369 (*Build a minimal derivation. Keep oracles; suppress atomic inferences; |
370 (*Build a minimal derivation. Keep oracles; suppress atomic inferences; |
370 retain Theorems or their underlying links; keep anything else*) |
371 retain Theorems or their underlying links; keep anything else*) |
371 fun squash_derivs [] = [] |
372 fun squash_derivs [] = [] |
372 | squash_derivs (der::ders) = |
373 | squash_derivs (der::ders) = |
379 then der :: squash_derivs ders |
380 then der :: squash_derivs ders |
380 else squash_derivs ders |
381 else squash_derivs ders |
381 | Join (_, []) => squash_derivs ders |
382 | Join (_, []) => squash_derivs ders |
382 | _ => der :: squash_derivs ders); |
383 | _ => der :: squash_derivs ders); |
383 |
384 |
384 |
|
385 (*Ensure sharing of the most likely derivation, the empty one!*) |
385 (*Ensure sharing of the most likely derivation, the empty one!*) |
386 val min_infer = Join (MinProof, []); |
386 val min_infer = Join (MinProof, []); |
387 |
387 |
388 (*Make a minimal inference*) |
388 (*Make a minimal inference*) |
389 fun make_min_infer [] = min_infer |
389 fun make_min_infer [] = min_infer |
390 | make_min_infer [der] = der |
390 | make_min_infer [der] = der |
391 | make_min_infer ders = Join (MinProof, ders); |
391 | make_min_infer ders = Join (MinProof, ders); |
392 |
392 |
393 fun infer_derivs (rl, []) = Join (rl, []) |
393 fun is_oracle (Oracle _) = true |
|
394 | is_oracle _ = false; |
|
395 |
|
396 in |
|
397 |
|
398 fun infer_derivs (rl, []: (bool * deriv) list) = (is_oracle rl, Join (rl, [])) |
394 | infer_derivs (rl, ders) = |
399 | infer_derivs (rl, ders) = |
395 if !keep_derivs=FullDeriv then Join (rl, ders) |
400 (is_oracle rl orelse exists #1 ders, |
396 else make_min_infer (squash_derivs ders); |
401 if !keep_derivs=FullDeriv then Join (rl, map #2 ders) |
|
402 else make_min_infer (squash_derivs (map #2 ders))); |
|
403 |
|
404 end; |
397 |
405 |
398 |
406 |
399 |
407 |
400 (*** Meta theorems ***) |
408 (*** Meta theorems ***) |
401 |
409 |
402 datatype thm = Thm of |
410 datatype thm = Thm of |
403 {sign_ref: Sign.sg_ref, (*mutable reference to signature*) |
411 {sign_ref: Sign.sg_ref, (*mutable reference to signature*) |
404 der: deriv, (*derivation*) |
412 der: bool * deriv, (*derivation*) |
405 maxidx: int, (*maximum index of any Var or TVar*) |
413 maxidx: int, (*maximum index of any Var or TVar*) |
406 shyps: sort list, (*sort hypotheses*) |
414 shyps: sort list, (*sort hypotheses*) |
407 hyps: term list, (*hypotheses*) |
415 hyps: term list, (*hypotheses*) |
408 prop: term}; (*conclusion*) |
416 prop: term}; (*conclusion*) |
409 |
417 |
606 |
614 |
607 |
615 |
608 (* name and tags -- make proof objects more readable *) |
616 (* name and tags -- make proof objects more readable *) |
609 |
617 |
610 fun get_name_tags (Thm {der, ...}) = |
618 fun get_name_tags (Thm {der, ...}) = |
611 (case der of |
619 (case #2 der of |
612 Join (Theorem x, _) => x |
620 Join (Theorem x, _) => x |
613 | Join (Axiom x, _) => x |
621 | Join (Axiom x, _) => x |
614 | _ => ("", [])); |
622 | _ => ("", [])); |
615 |
623 |
616 fun put_name_tags x (Thm {sign_ref, der, maxidx, shyps, hyps, prop}) = |
624 fun put_name_tags x (Thm {sign_ref, der = (ora, der), maxidx, shyps, hyps, prop}) = |
617 let |
625 let |
618 val der' = |
626 val der' = |
619 (case der of |
627 (case der of |
620 Join (Theorem _, ds) => Join (Theorem x, ds) |
628 Join (Theorem _, ds) => Join (Theorem x, ds) |
621 | Join (Axiom _, ds) => Join (Axiom x, ds) |
629 | Join (Axiom _, ds) => Join (Axiom x, ds) |
622 | _ => Join (Theorem x, [der])); |
630 | _ => Join (Theorem x, [der])); |
623 in |
631 in |
624 Thm {sign_ref = sign_ref, der = der', maxidx = maxidx, |
632 Thm {sign_ref = sign_ref, der = (ora, der'), maxidx = maxidx, |
625 shyps = shyps, hyps = hyps, prop = prop} |
633 shyps = shyps, hyps = hyps, prop = prop} |
626 end; |
634 end; |
627 |
635 |
628 val name_of_thm = #1 o get_name_tags; |
636 val name_of_thm = #1 o get_name_tags; |
629 val tags_of_thm = #2 o get_name_tags; |
637 val tags_of_thm = #2 o get_name_tags; |
2166 (case botc true skel0 mss trec of |
2174 (case botc true skel0 mss trec of |
2167 Some(trec1) => trec1 | None => trec) |
2175 Some(trec1) => trec1 | None => trec) |
2168 |
2176 |
2169 and subc skel |
2177 and subc skel |
2170 (mss as Mss{rules,congs,procs,bounds,prems,mk_rews,termless}) |
2178 (mss as Mss{rules,congs,procs,bounds,prems,mk_rews,termless}) |
2171 (trec as (t0:term,etc:sort list*term list * rule mtree list)) = |
2179 (trec as (t0:term,etc:sort list*term list * (bool * deriv) list)) = |
2172 (case t0 of |
2180 (case t0 of |
2173 Abs(a,T,t) => |
2181 Abs(a,T,t) => |
2174 let val b = variant bounds a |
2182 let val b = variant bounds a |
2175 val v = Free("." ^ b,T) |
2183 val v = Free("." ^ b,T) |
2176 val mss' = mk_mss (rules, congs, procs, b :: bounds, prems, mk_rews, termless) |
2184 val mss' = mk_mss (rules, congs, procs, b :: bounds, prems, mk_rews, termless) |
2351 in |
2359 in |
2352 if T <> propT then |
2360 if T <> propT then |
2353 raise THM ("Oracle's result must have type prop: " ^ name, 0, []) |
2361 raise THM ("Oracle's result must have type prop: " ^ name, 0, []) |
2354 else fix_shyps [] [] |
2362 else fix_shyps [] [] |
2355 (Thm {sign_ref = sign_ref', |
2363 (Thm {sign_ref = sign_ref', |
2356 der = Join (Oracle (name, sign, exn), []), |
2364 der = (true, Join (Oracle (name, sign, exn), [])), |
2357 maxidx = maxidx, |
2365 maxidx = maxidx, |
2358 shyps = [], |
2366 shyps = [], |
2359 hyps = [], |
2367 hyps = [], |
2360 prop = prop}) |
2368 prop = prop}) |
2361 end |
2369 end |