src/Pure/Syntax/syn_trans.ML
changeset 3928 787d2659ce4a
parent 3777 434d875f4661
child 4148 e0e5a2820ac1
equal deleted inserted replaced
3927:27c63b757af5 3928:787d2659ce4a
   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