added Promise constructor, which is similar to Oracle but may be replaced later;
authorwenzelm
Mon, 22 Sep 2008 15:26:13 +0200
changeset 2831913cb2108c2b9
parent 28318 6b8d001ce1de
child 28320 c6aef67f964d
added Promise constructor, which is similar to Oracle but may be replaced later;
added promise_proof;
export min_proof, mk_min_proof;
moved infer_derivs to thm.ML as derive_rule0/1/2;
tuned oracles_of_proof;
added is_named;
src/Pure/proofterm.ML
     1.1 --- a/src/Pure/proofterm.ML	Mon Sep 22 15:26:11 2008 +0200
     1.2 +++ b/src/Pure/proofterm.ML	Mon Sep 22 15:26:13 2008 +0200
     1.3 @@ -21,6 +21,7 @@
     1.4     | PThm of string * proof * term * typ list option
     1.5     | PAxm of string * term * typ list option
     1.6     | Oracle of string * term * typ list option
     1.7 +   | Promise of serial * term * typ list option
     1.8     | MinProof of ((string * term) * proof) list * (string * term) list * (string * term) list;
     1.9  
    1.10    val %> : proof * term -> proof
    1.11 @@ -30,10 +31,8 @@
    1.12  sig
    1.13    include BASIC_PROOFTERM
    1.14  
    1.15 -  val infer_derivs : (proof -> proof -> proof) -> bool * proof -> bool * proof -> bool * proof
    1.16 -  val infer_derivs' : (proof -> proof) -> (bool * proof -> bool * proof)
    1.17 -
    1.18    (** primitive operations **)
    1.19 +  val min_proof : proof
    1.20    val proof_combt : proof * term list -> proof
    1.21    val proof_combt' : proof * term option list -> proof
    1.22    val proof_combP : proof * proof list -> proof
    1.23 @@ -66,7 +65,10 @@
    1.24    val thms_of_proof' : proof -> (term * proof) list Symtab.table ->
    1.25      (term * proof) list Symtab.table
    1.26    val axms_of_proof : proof -> proof Symtab.table -> proof Symtab.table
    1.27 -  val oracles_of_proof : (string * term) list -> proof -> (string * term) list
    1.28 +  val mk_min_proof : proof ->
    1.29 +   ((string * term) * proof) list * (string * term) list * (string * term) list ->
    1.30 +   ((string * term) * proof) list * (string * term) list * (string * term) list
    1.31 +  val oracles_of_proof : proof -> (string * term) list -> (string * term) list
    1.32  
    1.33    (** proof terms for specific inference rules **)
    1.34    val implies_intr_proof : term -> proof -> proof
    1.35 @@ -99,8 +101,10 @@
    1.36    val equal_elim : term -> term -> proof -> proof -> proof
    1.37    val axm_proof : string -> term -> proof
    1.38    val oracle_proof : string -> term -> proof
    1.39 +  val promise_proof : serial -> term -> proof
    1.40    val thm_proof : theory -> string -> term list -> term -> proof -> proof
    1.41    val get_name : term list -> term -> proof -> string
    1.42 +  val is_named : proof -> bool
    1.43  
    1.44    (** rewriting on proof terms **)
    1.45    val add_prf_rrule : proof * proof -> theory -> theory
    1.46 @@ -128,6 +132,7 @@
    1.47   | PThm of string * proof * term * typ list option
    1.48   | PAxm of string * term * typ list option
    1.49   | Oracle of string * term * typ list option
    1.50 + | Promise of serial * term * typ list option
    1.51   | MinProof of ((string * term) * proof) list * (string * term) list * (string * term) list;
    1.52  
    1.53  fun proof_of_min_axm (s, prop) = PAxm (s, prop, NONE);
    1.54 @@ -135,7 +140,7 @@
    1.55  
    1.56  val string_term_ord = prod_ord fast_string_ord Term.fast_term_ord;
    1.57  
    1.58 -fun oracles_of_proof oras prf =
    1.59 +fun oracles_of_proof prf oras =
    1.60    let
    1.61      fun oras_of (Abst (_, _, prf)) = oras_of prf
    1.62        | oras_of (AbsP (_, _, prf)) = oras_of prf
    1.63 @@ -213,24 +218,8 @@
    1.64  
    1.65  val proofs = ref 2;
    1.66  
    1.67 -fun err_illegal_level i =
    1.68 -  error ("Illegal level of detail for proof objects: " ^ string_of_int i);
    1.69 -
    1.70 -fun if_ora b = if b then oracles_of_proof else K;
    1.71  val min_proof = MinProof ([], [], []);
    1.72  
    1.73 -fun infer_derivs f (ora1, prf1) (ora2, prf2) =
    1.74 -  let val ora = ora1 orelse ora2 in
    1.75 -    (ora,
    1.76 -      case !proofs of
    1.77 -        2 => f prf1 prf2
    1.78 -      | 1 => MinProof (([], [], []) |> mk_min_proof prf1 |> mk_min_proof prf2)
    1.79 -      | 0 => if ora then MinProof ([], [], if_ora ora2 (if_ora ora1 [] prf1) prf2) else min_proof
    1.80 -      | i => err_illegal_level i)
    1.81 -  end;
    1.82 -
    1.83 -fun infer_derivs' f = infer_derivs (K f) (false, min_proof);
    1.84 -
    1.85  fun (prf %> t) = prf % SOME t;
    1.86  
    1.87  val proof_combt = Library.foldl (op %>);
    1.88 @@ -317,6 +306,7 @@
    1.89  fun change_type opTs (PThm (name, prf, prop, _)) = PThm (name, prf, prop, opTs)
    1.90    | change_type opTs (PAxm (name, prop, _)) = PAxm (name, prop, opTs)
    1.91    | change_type opTs (Oracle (name, prop, _)) = Oracle (name, prop, opTs)
    1.92 +  | change_type opTs (Promise (i, prop, _)) = Promise (i, prop, opTs)
    1.93    | change_type _ prf = prf;
    1.94  
    1.95  
    1.96 @@ -911,6 +901,8 @@
    1.97    if !proofs = 0 then Oracle (name, dummy, NONE)
    1.98    else gen_axm_proof Oracle name prop;
    1.99  
   1.100 +fun promise_proof i prop = gen_axm_proof Promise i prop;
   1.101 +
   1.102  fun shrink_proof thy =
   1.103    let
   1.104      fun shrink ls lev (prf as Abst (a, T, body)) =
   1.105 @@ -946,7 +938,8 @@
   1.106        | shrink' ls lev ts prfs prf =
   1.107            let
   1.108              val prop = (case prf of PThm (_, _, prop, _) => prop | PAxm (_, prop, _) => prop
   1.109 -              | Oracle (_, prop, _) => prop | _ => error "shrink: proof not in normal form");
   1.110 +              | Oracle (_, prop, _) => prop | Promise (_, prop, _) => prop
   1.111 +              | _ => error "shrink: proof not in normal form");
   1.112              val vs = vars_of prop;
   1.113              val (ts', ts'') = chop (length vs) ts;
   1.114              val insts = Library.take (length ts', map (fst o dest_Var) vs) ~~ ts';
   1.115 @@ -1224,6 +1217,10 @@
   1.116      | _ => "")
   1.117    end;
   1.118  
   1.119 +fun is_named (PThm (name, _, _, _)) = name <> ""
   1.120 +  | is_named (PAxm (name, _, _)) = name <> ""
   1.121 +  | is_named _ = false;
   1.122 +
   1.123  end;
   1.124  
   1.125  structure BasicProofterm : BASIC_PROOFTERM = Proofterm;