src/Pure/Syntax/syn_trans.ML
changeset 39128 93a7365fb4ee
parent 37216 3165bc303f66
child 39163 4d701c0388c3
equal deleted inserted replaced
39127:e7ecbe86d22e 39128:93a7365fb4ee
     4 Syntax translation functions.
     4 Syntax translation functions.
     5 *)
     5 *)
     6 
     6 
     7 signature SYN_TRANS0 =
     7 signature SYN_TRANS0 =
     8 sig
     8 sig
     9   val eta_contract: bool Unsynchronized.ref
     9   val eta_contract_default: bool Unsynchronized.ref
       
    10   val eta_contract_value: Config.value Config.T
       
    11   val eta_contract: bool Config.T
    10   val atomic_abs_tr': string * typ * term -> term * term
    12   val atomic_abs_tr': string * typ * term -> term * term
    11   val preserve_binder_abs_tr': string -> string -> string * (term list -> term)
    13   val preserve_binder_abs_tr': string -> string -> string * (term list -> term)
    12   val preserve_binder_abs2_tr': string -> string -> string * (term list -> term)
    14   val preserve_binder_abs2_tr': string -> string -> string * (term list -> term)
    13   val mk_binder_tr: string * string -> string * (term list -> term)
    15   val mk_binder_tr: string * string -> string * (term list -> term)
    14   val mk_binder_tr': string * string -> string * (term list -> term)
    16   val mk_binder_tr': string * string -> string * (term list -> term)
    47 end;
    49 end;
    48 
    50 
    49 signature SYN_TRANS =
    51 signature SYN_TRANS =
    50 sig
    52 sig
    51   include SYN_TRANS1
    53   include SYN_TRANS1
    52   val abs_tr': term -> term
    54   val abs_tr': Proof.context -> term -> term
    53   val prop_tr': term -> term
    55   val prop_tr': term -> term
    54   val appl_ast_tr': Ast.ast * Ast.ast list -> Ast.ast
    56   val appl_ast_tr': Ast.ast * Ast.ast list -> Ast.ast
    55   val applC_ast_tr': Ast.ast * Ast.ast list -> Ast.ast
    57   val applC_ast_tr': Ast.ast * Ast.ast list -> Ast.ast
    56   val pts_to_asts: Proof.context ->
    58   val pts_to_asts: Proof.context ->
    57     (string -> (Proof.context -> Ast.ast list -> Ast.ast) option) ->
    59     (string -> (Proof.context -> Ast.ast list -> Ast.ast) option) ->
   278   in (rev rev_vars', body') end;
   280   in (rev rev_vars', body') end;
   279 
   281 
   280 
   282 
   281 (*do (partial) eta-contraction before printing*)
   283 (*do (partial) eta-contraction before printing*)
   282 
   284 
   283 val eta_contract = Unsynchronized.ref true;
   285 val eta_contract_default = Unsynchronized.ref true;
   284 
   286 val eta_contract_value =
   285 fun eta_contr tm =
   287   Config.declare "eta_contract" (fn _ => Config.Bool (! eta_contract_default));
       
   288 val eta_contract = Config.bool eta_contract_value;
       
   289 
       
   290 fun eta_contr ctxt tm =
   286   let
   291   let
   287     fun is_aprop (Const ("_aprop", _)) = true
   292     fun is_aprop (Const ("_aprop", _)) = true
   288       | is_aprop _ = false;
   293       | is_aprop _ = false;
   289 
   294 
   290     fun eta_abs (Abs (a, T, t)) =
   295     fun eta_abs (Abs (a, T, t)) =
   296                   else  incr_boundvars ~1 f
   301                   else  incr_boundvars ~1 f
   297               | _ => Abs (a, T, t'))
   302               | _ => Abs (a, T, t'))
   298           | t' => Abs (a, T, t'))
   303           | t' => Abs (a, T, t'))
   299       | eta_abs t = t;
   304       | eta_abs t = t;
   300   in
   305   in
   301     if ! eta_contract then eta_abs tm else tm
   306     if Config.get ctxt eta_contract then eta_abs tm else tm
   302   end;
   307   end;
   303 
   308 
   304 
   309 
   305 fun abs_tr' tm =
   310 fun abs_tr' ctxt tm =
   306   uncurry (fold_rev (fn x => fn t => Lexicon.const "_abs" $ x $ t))
   311   uncurry (fold_rev (fn x => fn t => Lexicon.const "_abs" $ x $ t))
   307     (strip_abss strip_abs_vars strip_abs_body (eta_contr tm));
   312     (strip_abss strip_abs_vars strip_abs_body (eta_contr ctxt tm));
   308 
   313 
   309 fun atomic_abs_tr' (x, T, t) =
   314 fun atomic_abs_tr' (x, T, t) =
   310   let val [xT] = Term.rename_wrt_term t [(x, T)]
   315   let val [xT] = Term.rename_wrt_term t [(x, T)]
   311   in (mark_boundT xT, subst_bound (mark_bound (fst xT), t)) end;
   316   in (mark_boundT xT, subst_bound (mark_bound (fst xT), t)) end;
   312 
   317