# HG changeset patch # User wenzelm # Date 1154000579 -7200 # Node ID e2b876cd9e2925be0fdc1dc44b6fd7fb6abde42e # Parent d765cb6faa39184b2d23f26389c38c12d60bd2e2 Local assumptions, parameterized by export rules. diff -r d765cb6faa39 -r e2b876cd9e29 src/Pure/assumption.ML --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/Pure/assumption.ML Thu Jul 27 13:42:59 2006 +0200 @@ -0,0 +1,110 @@ +(* Title: Pure/assumption.ML + ID: $Id$ + Author: Makarius + +Local assumptions, parameterized by export rules. +*) + +signature ASSUMPTION = +sig + type export + val assume_export: export + val presume_export: export + val assume: cterm -> thm + val assms_of: Context.proof -> term list + val prems_of: Context.proof -> thm list + val extra_hyps: Context.proof -> thm -> term list + val add_assms: export -> cterm list -> Context.proof -> thm list * Context.proof + val add_assumes: cterm list -> Context.proof -> thm list * Context.proof + val add_view: Context.proof -> cterm list -> Context.proof -> Context.proof + val exports: bool -> Context.proof -> Context.proof -> thm list -> thm list Seq.seq +end; + +structure Assumption: ASSUMPTION = +struct + +(** basic rules **) + +type export = bool -> cterm list -> thm -> thm Seq.seq; + +(* + [A] + : + B + -------- + #A ==> B +*) +fun assume_export true = Seq.single oo Drule.implies_intr_protected + | assume_export false = Seq.single oo Drule.implies_intr_list; + +(* + [A] + : + B + ------- + A ==> B +*) +fun presume_export _ = assume_export false; + +val assume = norm_hhf o Thm.assume; + + + +(** local context data **) + +datatype data = Data of + {assms: (export * cterm list) list, (*assumes and views: A ==> _*) + prems: thm list}; (*prems: A |- A*) + +fun make_data (assms, prems) = Data {assms = assms, prems = prems}; + +structure Data = ProofDataFun +( + val name = "Pure/assumption"; + type T = data; + fun init _ = make_data ([], []); + fun print _ _ = (); +); + +val _ = Context.add_setup Data.init; + +fun map_data f = Data.map (fn Data {assms, prems} => make_data (f (assms, prems))); +fun rep_data ctxt = Data.get ctxt |> (fn Data args => args); + +val assumptions_of = #assms o rep_data; +val assms_of = map Thm.term_of o maps #2 o assumptions_of; +val prems_of = #prems o rep_data; + +fun extra_hyps ctxt th = subtract (op aconv) (assms_of ctxt) (Thm.hyps_of th); + + +(* add assumptions *) + +fun add_assms export new_asms = + let val new_prems = map assume new_asms in + map_data (fn (asms, prems) => (asms @ [(export, new_asms)], prems @ new_prems)) #> + pair new_prems + end; + +val add_assumes = add_assms assume_export; + +fun add_view outer view = map_data (fn (asms, prems) => + let + val (asms1, asms2) = chop (length (assumptions_of outer)) asms; + val asms' = asms1 @ [(assume_export, view)] @ asms2; + in (asms', prems) end); + + +(* exports *) + +fun exports is_goal inner outer = + let + val asms = rev (Library.drop (length (assumptions_of outer), assumptions_of inner)); + val exp_asms = map (fn (exp, As) => exp is_goal As) asms; + in + map norm_hhf_protect + #> Seq.map_list (Seq.EVERY exp_asms) + #> Seq.map (map norm_hhf_protect) + end; + +end;