equal
deleted
inserted
replaced
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 |