TFL/thry.sml
author sandnerr
Mon, 09 Dec 1996 19:13:13 +0100
changeset 2355 ee9bdbe2ac8a
parent 2112 3902e9af752f
child 3191 14bd6e5985f1
permissions -rw-r--r--
simpset extension moved from HOLCF.ML to One.ML and Tr2.ML
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2112
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
     1
structure Thry : Thry_sig (* LThry_sig *) = 
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
     2
struct
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
     3
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
     4
structure USyntax  = USyntax;
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
     5
type Type = USyntax.Type
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
     6
type Preterm = USyntax.Preterm
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
     7
type Term = USyntax.Term
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
     8
type Thm = Thm.thm
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
     9
type Thry = theory;
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    10
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    11
open Mask;
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    12
structure S = USyntax;
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    13
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    14
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    15
fun THRY_ERR{func,mesg} = Utils.ERR{module = "Thry",func=func,mesg=mesg};
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    16
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    17
(*---------------------------------------------------------------------------
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    18
 *    Matching 
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    19
 *---------------------------------------------------------------------------*)
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    20
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    21
local open Utils
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    22
      infix 3 |->
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    23
      fun tybind (x,y) = TVar (x,["term"])  |-> y
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    24
      fun tmbind (x,y) = Var  (x,type_of y) |-> y
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    25
in
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    26
 fun match_term thry pat ob = 
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    27
    let val tsig = #tsig(Sign.rep_sg(sign_of thry))
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    28
        val (ty_theta,tm_theta) = Pattern.match tsig (pat,ob)
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    29
    in (map tmbind tm_theta, map tybind ty_theta)
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    30
    end
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    31
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    32
 fun match_type thry pat ob = 
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    33
    map tybind(Type.typ_match (#tsig(Sign.rep_sg(sign_of thry))) ([],(pat,ob)))
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    34
end;
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    35
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    36
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    37
(*---------------------------------------------------------------------------
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    38
 * Typing 
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    39
 *---------------------------------------------------------------------------*)
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    40
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    41
fun typecheck thry = cterm_of (sign_of thry);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    42
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    43
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    44
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    45
(*----------------------------------------------------------------------------
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    46
 * Making a definition. The argument "tm" looks like "f = WFREC R M". This 
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    47
 * entrypoint is specialized for interactive use, since it closes the theory
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    48
 * after making the definition. This allows later interactive definitions to
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    49
 * refer to previous ones. The name for the new theory is automatically 
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    50
 * generated from the name of the argument theory.
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    51
 *---------------------------------------------------------------------------*)
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    52
local val (imp $ tprop $ (eeq $ _ $ _ )) = #prop(rep_thm(eq_reflection))
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    53
      val Const(eeq_name, ty) = eeq
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    54
      val prop = #2 (S.strip_type ty)
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    55
in
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    56
fun make_definition parent s tm = 
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    57
   let val {lhs,rhs} = S.dest_eq tm
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    58
       val {Name,Ty} = S.dest_var lhs
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    59
       val lhs1 = S.mk_const{Name = Name, Ty = Ty}
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    60
       val eeq1 = S.mk_const{Name = eeq_name, Ty = Ty --> Ty --> prop}
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    61
       val dtm = S.list_mk_comb(eeq1,[lhs1,rhs])      (* Rename "=" to "==" *)
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    62
       val thry1 = add_consts_i [(Name,Ty,NoSyn)] parent
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    63
       val thry2 = add_defs_i [(s,dtm)] thry1
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    64
       val parent_names = map ! (stamps_of_thy parent)
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    65
       val newthy_name = variant parent_names (hd parent_names)
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    66
       val new_thy = add_thyname newthy_name thry2
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    67
   in 
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    68
   ((get_axiom new_thy s) RS meta_eq_to_obj_eq, new_thy)
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    69
   end
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    70
end;
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    71
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    72
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    73
(*---------------------------------------------------------------------------
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    74
 * Utility routine. Insert into list ordered by the key (a string). If two 
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    75
 * keys are equal, the new element replaces the old. A more efficient option 
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    76
 * for the future is needed. In fact, having the list of datatype facts be 
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    77
 * ordered is useless, since the lookup should never fail!
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    78
 *---------------------------------------------------------------------------*)
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    79
fun insert (el as (x:string, _)) = 
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    80
 let fun canfind[] = [el] 
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    81
       | canfind(alist as ((y as (k,_))::rst)) = 
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    82
           if (x<k) then el::alist
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    83
           else if (x=k) then el::rst
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    84
           else y::canfind rst 
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    85
 in canfind
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    86
 end;
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    87
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    88
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    89
(*---------------------------------------------------------------------------
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    90
 *     A collection of facts about datatypes
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    91
 *---------------------------------------------------------------------------*)
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    92
val nat_record = Dtype.build_record (Nat.thy, ("nat",["0","Suc"]), nat_ind_tac)
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    93
val prod_record =
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    94
    let val prod_case_thms = Dtype.case_thms (sign_of Prod.thy) [split] 
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    95
                                 (fn s => res_inst_tac [("p",s)] PairE_lemma)
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    96
         fun const s = Const(s, the(Sign.const_type (sign_of Prod.thy) s))
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    97
     in ("*", 
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    98
         {constructors = [const "Pair"],
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    99
            case_const = const "split",
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   100
         case_rewrites = [split RS eq_reflection],
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   101
             case_cong = #case_cong prod_case_thms,
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   102
              nchotomy = #nchotomy prod_case_thms}) 
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   103
     end;
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   104
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   105
(*---------------------------------------------------------------------------
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   106
 * Hacks to make interactive mode work. Referring to "datatypes" directly
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   107
 * is temporary, I hope!
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   108
 *---------------------------------------------------------------------------*)
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   109
val match_info = fn thy =>
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   110
    fn "*" => Utils.SOME({case_const = #case_const (#2 prod_record),
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   111
                     constructors = #constructors (#2 prod_record)})
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   112
     | "nat" => Utils.SOME({case_const = #case_const (#2 nat_record),
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   113
                       constructors = #constructors (#2 nat_record)})
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   114
     | ty => case assoc(!datatypes,ty)
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   115
               of None => Utils.NONE
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   116
                | Some{case_const,constructors, ...} =>
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   117
                   Utils.SOME{case_const=case_const, constructors=constructors}
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   118
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   119
val induct_info = fn thy =>
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   120
    fn "*" => Utils.SOME({nchotomy = #nchotomy (#2 prod_record),
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   121
                     constructors = #constructors (#2 prod_record)})
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   122
     | "nat" => Utils.SOME({nchotomy = #nchotomy (#2 nat_record),
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   123
                       constructors = #constructors (#2 nat_record)})
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   124
     | ty => case assoc(!datatypes,ty)
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   125
               of None => Utils.NONE
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   126
                | Some{nchotomy,constructors, ...} =>
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   127
                  Utils.SOME{nchotomy=nchotomy, constructors=constructors}
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   128
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   129
val extract_info = fn thy => 
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   130
 let val case_congs = map (#case_cong o #2) (!datatypes)
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   131
         val case_rewrites = flat(map (#case_rewrites o #2) (!datatypes))
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   132
 in {case_congs = #case_cong (#2 prod_record)::
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   133
                  #case_cong (#2 nat_record)::case_congs,
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   134
     case_rewrites = #case_rewrites(#2 prod_record)@
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   135
                     #case_rewrites(#2 nat_record)@case_rewrites}
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   136
 end;
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   137
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   138
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   139
end; (* Thry *)