src/Pure/thm.ML
changeset 1703 e22ad43bab5f
parent 1659 41e37e5211f2
child 1802 d2f07baaf776
equal deleted inserted replaced
1702:4aa538e82f76 1703:e22ad43bab5f
    24   val term_of           : cterm -> term
    24   val term_of           : cterm -> term
    25   val cterm_of          : Sign.sg -> term -> cterm
    25   val cterm_of          : Sign.sg -> term -> cterm
    26   val read_cterm        : Sign.sg -> string * typ -> cterm
    26   val read_cterm        : Sign.sg -> string * typ -> cterm
    27   val read_cterms       : Sign.sg -> string list * typ list -> cterm list
    27   val read_cterms       : Sign.sg -> string list * typ list -> cterm list
    28   val cterm_fun         : (term -> term) -> (cterm -> cterm)
    28   val cterm_fun         : (term -> term) -> (cterm -> cterm)
    29   val dest_cimplies     : cterm -> cterm * cterm
       
    30   val dest_comb         : cterm -> cterm * cterm
    29   val dest_comb         : cterm -> cterm * cterm
    31   val dest_abs          : cterm -> cterm * cterm
    30   val dest_abs          : cterm -> cterm * cterm
       
    31   val adjust_maxidx     : cterm -> cterm
    32   val capply            : cterm -> cterm -> cterm
    32   val capply            : cterm -> cterm -> cterm
    33   val cabs              : cterm -> cterm -> cterm
    33   val cabs              : 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
   193   end;
   193   end;
   194 
   194 
   195 fun cterm_fun f (Cterm {sign, t, ...}) = cterm_of sign (f t);
   195 fun cterm_fun f (Cterm {sign, t, ...}) = cterm_of sign (f t);
   196 
   196 
   197 
   197 
   198 (*dest_implies for cterms. Note T=prop below*)
       
   199 fun dest_cimplies (Cterm{sign, T, maxidx, t=Const("==>", _) $ A $ B}) =
       
   200        (Cterm{sign=sign, T=T, maxidx=maxidx, t=A},
       
   201         Cterm{sign=sign, T=T, maxidx=maxidx, t=B})
       
   202   | dest_cimplies ct = raise TERM ("dest_cimplies", [term_of ct]);
       
   203 
       
   204 exception CTERM of string;
   198 exception CTERM of string;
   205 
   199 
   206 (*Destruct application in cterms*)
   200 (*Destruct application in cterms*)
   207 fun dest_comb (Cterm{sign, T, maxidx, t = A $ B}) =
   201 fun dest_comb (Cterm{sign, T, maxidx, t = A $ B}) =
   208       let val typeA = fastype_of A;
   202       let val typeA = fastype_of A;
   220       let val (y,N) = variant_abs (x,ty,M)
   214       let val (y,N) = variant_abs (x,ty,M)
   221       in (Cterm {sign = sign, T = ty, maxidx = 0, t = Free(y,ty)},
   215       in (Cterm {sign = sign, T = ty, maxidx = 0, t = Free(y,ty)},
   222           Cterm {sign = sign, T = S, maxidx = maxidx, t = N})
   216           Cterm {sign = sign, T = S, maxidx = maxidx, t = N})
   223       end
   217       end
   224   | dest_abs _ = raise CTERM "dest_abs";
   218   | dest_abs _ = raise CTERM "dest_abs";
       
   219 
       
   220 fun adjust_maxidx (Cterm {sign, T, t, ...}) =
       
   221   Cterm {sign = sign, T = T, maxidx = maxidx_of_term t, t = t}
   225 
   222 
   226 (*Form cterm out of a function and an argument*)
   223 (*Form cterm out of a function and an argument*)
   227 fun capply (Cterm {t=f, sign=sign1, T=Type("fun",[dty,rty]), maxidx=maxidx1})
   224 fun capply (Cterm {t=f, sign=sign1, T=Type("fun",[dty,rty]), maxidx=maxidx1})
   228            (Cterm {t=x, sign=sign2, T, maxidx=maxidx2}) =
   225            (Cterm {t=x, sign=sign2, T, maxidx=maxidx2}) =
   229       if T = dty then Cterm{t=f$x, sign=Sign.merge(sign1,sign2), T=rty,
   226       if T = dty then Cterm{t=f$x, sign=Sign.merge(sign1,sign2), T=rty,