234 equalities = equalities, extinjects=extinjects, extsplit = extsplit, splits = splits, |
234 equalities = equalities, extinjects=extinjects, extsplit = extsplit, splits = splits, |
235 extfields = extfields, fieldext = fieldext }: record_data; |
235 extfields = extfields, fieldext = fieldext }: record_data; |
236 |
236 |
237 structure RecordsArgs = |
237 structure RecordsArgs = |
238 struct |
238 struct |
239 val name = "HOL/records"; |
239 val name = "HOL/records"; |
240 type T = record_data; |
240 type T = record_data; |
241 |
241 |
242 val empty = |
242 val empty = |
243 make_record_data Symtab.empty |
243 make_record_data Symtab.empty |
244 {selectors = Symtab.empty, updates = Symtab.empty, simpset = HOL_basic_ss} |
244 {selectors = Symtab.empty, updates = Symtab.empty, simpset = HOL_basic_ss} |
627 gen_adv_record_type_scheme_tr "_field_types" "_field_type" ext_typeN; |
627 gen_adv_record_type_scheme_tr "_field_types" "_field_type" ext_typeN; |
628 |
628 |
629 |
629 |
630 val parse_translation = |
630 val parse_translation = |
631 [("_record_update", record_update_tr), |
631 [("_record_update", record_update_tr), |
632 ("_update_name", update_name_tr)]; |
632 ("_update_name", update_name_tr)]; |
633 |
633 |
634 val adv_parse_translation = |
634 val adv_parse_translation = |
635 [("_record",adv_record_tr), |
635 [("_record",adv_record_tr), |
636 ("_record_scheme",adv_record_scheme_tr), |
636 ("_record_scheme",adv_record_scheme_tr), |
637 ("_record_type",adv_record_type_tr), |
637 ("_record_type",adv_record_type_tr), |
638 ("_record_type_scheme",adv_record_type_scheme_tr)]; |
638 ("_record_type_scheme",adv_record_type_scheme_tr)]; |
639 |
639 |
640 (* print translations *) |
640 (* print translations *) |
641 |
641 |
642 val print_record_type_abbr = ref true; |
642 val print_record_type_abbr = ref true; |
643 val print_record_type_as_fields = ref true; |
643 val print_record_type_as_fields = ref true; |
727 val T = fixT (Sign.intern_typ sg |
727 val T = fixT (Sign.intern_typ sg |
728 (Syntax.typ_of_term (get_sort (Syntax.raw_term_sorts tm)) I tm)); |
728 (Syntax.typ_of_term (get_sort (Syntax.raw_term_sorts tm)) I tm)); |
729 val tsig = Sign.tsig_of sg |
729 val tsig = Sign.tsig_of sg |
730 |
730 |
731 fun mk_type_abbr subst name alphas = |
731 fun mk_type_abbr subst name alphas = |
732 let val abbrT = Type (name, map (fn a => TVar ((a, 0), [])) alphas); |
732 let val abbrT = Type (name, map (fn a => TVar ((a, 0), Sign.defaultS sg)) alphas); |
733 in Syntax.term_of_typ (! Syntax.show_sorts) (Envir.norm_type subst abbrT) end; |
733 in Syntax.term_of_typ (! Syntax.show_sorts) (Envir.norm_type subst abbrT) end; |
734 |
734 |
735 fun unify rT T = fst (Type.unify tsig (Vartab.empty,0) (Type.varifyT rT,T)); |
735 fun unify rT T = fst (Type.unify tsig (Vartab.empty,0) (Type.varifyT rT,T)); |
736 |
736 |
737 in if !print_record_type_abbr |
737 in if !print_record_type_abbr |
738 then (case last_extT T of |
738 then (case last_extT T of |
739 SOME (name,_) |
739 SOME (name,_) |
740 => if name = lastExt |
740 => if name = lastExt |
741 then |
741 then |
742 (let |
742 (let |
743 val subst = unify schemeT T |
743 val subst = unify schemeT T |
744 in |
744 in |
745 if HOLogic.is_unitT (Envir.norm_type subst (TVar((zeta,0),Sign.defaultS sg))) |
745 if HOLogic.is_unitT (Envir.norm_type subst (TVar((zeta,0),Sign.defaultS sg))) |
746 then mk_type_abbr subst abbr alphas |
746 then mk_type_abbr subst abbr alphas |
747 else mk_type_abbr subst (suffix schemeN abbr) (alphas@[zeta]) |
747 else mk_type_abbr subst (suffix schemeN abbr) (alphas@[zeta]) |
748 end handle TUNIFY => default_tr' sg tm) |
748 end handle TUNIFY => default_tr' sg tm) |