TFL/dcterm.sml
changeset 3391 5e45dd3b64e9
parent 3330 ab7161e593c8
child 3405 2cccd0e3e9ea
equal deleted inserted replaced
3390:0c7625196d95 3391:5e45dd3b64e9
    10 
    10 
    11 structure Dcterm :
    11 structure Dcterm :
    12 sig
    12 sig
    13     val mk_conj : cterm * cterm -> cterm
    13     val mk_conj : cterm * cterm -> cterm
    14     val mk_disj : cterm * cterm -> cterm
    14     val mk_disj : cterm * cterm -> cterm
    15     val mk_select : cterm * cterm -> cterm
       
    16     val mk_forall : cterm * cterm -> cterm
       
    17     val mk_exists : cterm * cterm -> cterm
    15     val mk_exists : cterm * cterm -> cterm
    18 
    16 
    19     val dest_conj : cterm -> cterm * cterm
    17     val dest_conj : cterm -> cterm * cterm
    20     val dest_const : cterm -> {Name:string, Ty:typ}
    18     val dest_const : cterm -> {Name:string, Ty:typ}
    21     val dest_disj : cterm -> cterm * cterm
    19     val dest_disj : cterm -> cterm * cterm
    24     val dest_forall : cterm -> cterm * cterm
    22     val dest_forall : cterm -> cterm * cterm
    25     val dest_imp : cterm -> cterm * cterm
    23     val dest_imp : cterm -> cterm * cterm
    26     val dest_let : cterm -> cterm * cterm
    24     val dest_let : cterm -> cterm * cterm
    27     val dest_neg : cterm -> cterm
    25     val dest_neg : cterm -> cterm
    28     val dest_pair : cterm -> cterm * cterm
    26     val dest_pair : cterm -> cterm * cterm
    29     val dest_select : cterm -> cterm * cterm
       
    30     val dest_var : cterm -> {Name:string, Ty:typ}
    27     val dest_var : cterm -> {Name:string, Ty:typ}
    31     val is_conj : cterm -> bool
    28     val is_conj : cterm -> bool
    32     val is_cons : cterm -> bool
    29     val is_cons : cterm -> bool
    33     val is_disj : cterm -> bool
    30     val is_disj : cterm -> bool
    34     val is_eq : cterm -> bool
    31     val is_eq : cterm -> bool
    36     val is_forall : cterm -> bool
    33     val is_forall : cterm -> bool
    37     val is_imp : cterm -> bool
    34     val is_imp : cterm -> bool
    38     val is_let : cterm -> bool
    35     val is_let : cterm -> bool
    39     val is_neg : cterm -> bool
    36     val is_neg : cterm -> bool
    40     val is_pair : cterm -> bool
    37     val is_pair : cterm -> bool
    41     val is_select : cterm -> bool
       
    42     val list_mk_abs : cterm list -> cterm -> cterm
    38     val list_mk_abs : cterm list -> cterm -> cterm
    43     val list_mk_exists : cterm list * cterm -> cterm
    39     val list_mk_exists : cterm list * cterm -> cterm
    44     val list_mk_forall : cterm list * cterm -> cterm
       
    45     val list_mk_disj : cterm list -> cterm
    40     val list_mk_disj : cterm list -> cterm
    46     val strip_abs : cterm -> cterm list * cterm
    41     val strip_abs : cterm -> cterm list * cterm
    47     val strip_comb : cterm -> cterm * cterm list
    42     val strip_comb : cterm -> cterm * cterm list
    48     val strip_conj : cterm -> cterm list
       
    49     val strip_disj : cterm -> cterm list
    43     val strip_disj : cterm -> cterm list
    50     val strip_exists : cterm -> cterm list * cterm
    44     val strip_exists : cterm -> cterm list * cterm
    51     val strip_forall : cterm -> cterm list * cterm
    45     val strip_forall : cterm -> cterm list * cterm
    52     val strip_imp : cterm -> cterm list * cterm
    46     val strip_imp : cterm -> cterm list * cterm
    53     val strip_pair : cterm -> cterm list
       
    54     val drop_prop : cterm -> cterm
    47     val drop_prop : cterm -> cterm
    55     val mk_prop : cterm -> cterm
    48     val mk_prop : cterm -> cterm
    56   end =
    49   end =
    57 struct
    50 struct
    58 
    51 
    77  * Some simple constructor functions.
    70  * Some simple constructor functions.
    78  *---------------------------------------------------------------------------*)
    71  *---------------------------------------------------------------------------*)
    79 
    72 
    80 fun mk_const sign pr = cterm_of sign (Const pr);
    73 fun mk_const sign pr = cterm_of sign (Const pr);
    81 val mk_hol_const = mk_const (sign_of HOL.thy);
    74 val mk_hol_const = mk_const (sign_of HOL.thy);
    82 
       
    83 fun mk_select (r as (Bvar,Body)) = 
       
    84   let val ty = #T(rep_cterm Bvar)
       
    85       val c = mk_hol_const("Eps", (ty --> HOLogic.boolT) --> ty)
       
    86   in capply c (uncurry cabs r)
       
    87   end;
       
    88 
       
    89 fun mk_forall (r as (Bvar,Body)) = 
       
    90   let val ty = #T(rep_cterm Bvar)
       
    91       val c = mk_hol_const("All", (ty --> HOLogic.boolT) --> HOLogic.boolT)
       
    92   in capply c (uncurry cabs r)
       
    93   end;
       
    94 
    75 
    95 fun mk_exists (r as (Bvar,Body)) = 
    76 fun mk_exists (r as (Bvar,Body)) = 
    96   let val ty = #T(rep_cterm Bvar)
    77   let val ty = #T(rep_cterm Bvar)
    97       val c = mk_hol_const("Ex", (ty --> HOLogic.boolT) --> HOLogic.boolT)
    78       val c = mk_hol_const("Ex", (ty --> HOLogic.boolT) --> HOLogic.boolT)
    98   in capply c (uncurry cabs r)
    79   in capply c (uncurry cabs r)
   184  * Iterated creation.
   165  * Iterated creation.
   185  *---------------------------------------------------------------------------*)
   166  *---------------------------------------------------------------------------*)
   186 val list_mk_abs = itlist cabs;
   167 val list_mk_abs = itlist cabs;
   187 
   168 
   188 fun list_mk_exists(V,t) = itlist(fn v => fn b => mk_exists(v, b)) V t;
   169 fun list_mk_exists(V,t) = itlist(fn v => fn b => mk_exists(v, b)) V t;
   189 fun list_mk_forall(V,t) = itlist(fn v => fn b => mk_forall(v, b)) V t;
       
   190 val list_mk_disj = end_itlist(fn d1 => fn tm => mk_disj(d1, tm))
   170 val list_mk_disj = end_itlist(fn d1 => fn tm => mk_disj(d1, tm))
   191 
   171 
   192 (*---------------------------------------------------------------------------
   172 (*---------------------------------------------------------------------------
   193  * Iterated destruction. (To the "right" in a term.)
   173  * Iterated destruction. (To the "right" in a term.)
   194  *---------------------------------------------------------------------------*)
   174  *---------------------------------------------------------------------------*)
   206 val strip_imp    = rev2swap o strip dest_imp
   186 val strip_imp    = rev2swap o strip dest_imp
   207 val strip_abs    = rev2swap o strip dest_abs
   187 val strip_abs    = rev2swap o strip dest_abs
   208 val strip_forall = rev2swap o strip dest_forall
   188 val strip_forall = rev2swap o strip dest_forall
   209 val strip_exists = rev2swap o strip dest_exists
   189 val strip_exists = rev2swap o strip dest_exists
   210 
   190 
   211 val strip_conj   = rev o (op::) o strip dest_conj
       
   212 val strip_disj   = rev o (op::) o strip dest_disj
   191 val strip_disj   = rev o (op::) o strip dest_disj
   213 val strip_pair   = rev o (op::) o strip dest_pair;
       
   214 
   192 
   215 
   193 
   216 (*---------------------------------------------------------------------------
   194 (*---------------------------------------------------------------------------
   217  * Going into and out of prop
   195  * Going into and out of prop
   218  *---------------------------------------------------------------------------*)
   196  *---------------------------------------------------------------------------*)