src/Pure/thm.ML
changeset 1516 96286c4e32de
parent 1503 7dba648ee25c
child 1517 d2f865740d8e
equal deleted inserted replaced
1515:4ed79ebab64d 1516:96286c4e32de
    28   val read_cterms       : Sign.sg -> string list * typ list -> cterm list
    28   val read_cterms       : Sign.sg -> string list * typ list -> cterm list
    29   val cterm_fun         : (term -> term) -> (cterm -> cterm)
    29   val cterm_fun         : (term -> term) -> (cterm -> cterm)
    30   val dest_cimplies     : cterm -> cterm * cterm
    30   val dest_cimplies     : cterm -> cterm * cterm
    31   val dest_comb         : cterm -> cterm * cterm
    31   val dest_comb         : cterm -> cterm * cterm
    32   val dest_abs          : cterm -> cterm * cterm
    32   val dest_abs          : cterm -> cterm * cterm
    33   val mk_prop           : cterm -> cterm
    33   val capply            : cterm -> cterm -> cterm
    34   val read_def_cterm    :
    34   val read_def_cterm    :
    35     Sign.sg * (indexname -> typ option) * (indexname -> sort option) ->
    35     Sign.sg * (indexname -> typ option) * (indexname -> sort option) ->
    36     string list -> bool -> string * typ -> cterm * (indexname * typ) list
    36     string list -> bool -> string * typ -> cterm * (indexname * typ) list
    37 
    37 
    38   (*meta theorems*)
    38   (*meta theorems*)
   210        Cterm {sign=sign, maxidx=maxidx, t=B, T=typeB})
   210        Cterm {sign=sign, maxidx=maxidx, t=B, T=typeB})
   211       end
   211       end
   212   | dest_comb _ = raise CTERM "dest_comb";
   212   | dest_comb _ = raise CTERM "dest_comb";
   213 
   213 
   214 (*Destruct abstraction in cterms*)
   214 (*Destruct abstraction in cterms*)
   215 fun dest_abs (Cterm{sign, T, maxidx, t = tm as Abs(s,ty,M)}) = 
   215 fun dest_abs (Cterm {sign, T as Type("fun",[_,S]), maxidx, t=Abs(x,ty,M)}) = 
   216       let fun mk_var{Name,Ty} = Free(Name,Ty);
   216       let val (y,N) = variant_abs (x,ty,M)
   217           val v = mk_var{Name = s, Ty = ty};
   217       in (Cterm {sign = sign, T = ty, maxidx = 0, t = Free(y,ty)},
   218           val ty2 =
   218           Cterm {sign = sign, T = S, maxidx = maxidx, t = N})
   219             case T of Type("fun",[_,S]) => S
       
   220                     | _ => error "Function type expected in dest_abs";
       
   221       in (Cterm{sign = sign, T = ty, maxidx = maxidx, t = v},
       
   222           Cterm{sign = sign, T = ty2, maxidx = maxidx, t = betapply (tm,v)})
       
   223       end
   219       end
   224   | dest_abs _ = raise CTERM "dest_abs";
   220   | dest_abs _ = raise CTERM "dest_abs";
   225 
   221 
   226 (*Convert cterm of type "o" to "prop" by using Trueprop*)
   222 (*Form cterm out of a function and an argument*)
   227 fun mk_prop (ct as Cterm{sign, T, maxidx, t = Const("Trueprop",_) $ _}) = ct
   223 fun capply (Cterm {t=f, sign=sign1, T=Type("fun",[dty,rty]), maxidx=maxidx1})
   228   | mk_prop (Cterm{sign, T, maxidx, t}) =
   224            (Cterm {t=x, sign=sign2, T, maxidx=maxidx2}) =
   229       if T = Type("o",[]) then
   225       if T = dty then Cterm{t=f$x, sign=Sign.merge(sign1,sign2), T=rty,
   230         Cterm{sign = sign, T = Type("prop",[]), maxidx = maxidx,
   226                             maxidx=max[maxidx1, maxidx2]}
   231               t = Const("Trueprop", Type("o",[]) --> Type("prop",[])) $ t}
   227       else raise CTERM "capply: types don't agree"
   232       else error "Type o expected in mk_prop";
   228   | capply _ _ = raise CTERM "capply: first arg is not a function"
   233 
   229 
   234 
   230 
   235 (** read cterms **)   (*exception ERROR*)
   231 (** read cterms **)   (*exception ERROR*)
   236 
   232 
   237 (*read term, infer types, certify term*)
   233 (*read term, infer types, certify term*)