src/Pure/assumption.ML
changeset 20222 e2b876cd9e29
child 20296 753fad9f6e03
--- /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;