143 in |
143 in |
144 (map mark_boundT (rev rev_new_vars), |
144 (map mark_boundT (rev rev_new_vars), |
145 subst_bounds (map (mark_bound o #1) rev_new_vars, body)) |
145 subst_bounds (map (mark_bound o #1) rev_new_vars, body)) |
146 end; |
146 end; |
147 |
147 |
|
148 |
148 (*do (partial) eta-contraction before printing*) |
149 (*do (partial) eta-contraction before printing*) |
149 |
150 |
150 val eta_contract = ref true; |
151 val eta_contract = ref true; |
151 |
152 |
152 fun eta_contr tm = |
153 fun eta_contr tm = |
153 let |
154 let |
|
155 fun is_aprop (Const ("_aprop", _)) = true |
|
156 | is_aprop _ = false; |
|
157 |
154 fun eta_abs (Abs (a, T, t)) = |
158 fun eta_abs (Abs (a, T, t)) = |
155 (case eta_abs t of |
159 (case eta_abs t of |
156 t' as f $ u => |
160 t' as f $ u => |
157 (case eta_abs u of |
161 (case eta_abs u of |
158 Bound 0 => |
162 Bound 0 => |
159 if not (0 mem loose_bnos f) then incr_boundvars ~1 f |
163 if 0 mem loose_bnos f orelse is_aprop f then Abs (a, T, t') |
160 else Abs (a, T, t') |
164 else incr_boundvars ~1 f |
161 | _ => Abs (a, T, t')) |
165 | _ => Abs (a, T, t')) |
162 | t' => Abs (a, T, t')) |
166 | t' => Abs (a, T, t')) |
163 | eta_abs t = t; |
167 | eta_abs t = t; |
164 in |
168 in |
165 if ! eta_contract then eta_abs tm else tm |
169 if ! eta_contract then eta_abs tm else tm |