657 let |
657 let |
658 val fact_policy = mk_fact_policy no_defs_lthy; |
658 val fact_policy = mk_fact_policy no_defs_lthy; |
659 val bnf_b = qualify raw_bnf_b; |
659 val bnf_b = qualify raw_bnf_b; |
660 val live = length raw_sets; |
660 val live = length raw_sets; |
661 |
661 |
662 val bnf_rhs_T = prep_typ no_defs_lthy raw_bnf_T; |
662 val T_rhs = prep_typ no_defs_lthy raw_bnf_T; |
663 val map_rhs = prep_term no_defs_lthy raw_map; |
663 val map_rhs = prep_term no_defs_lthy raw_map; |
664 val set_rhss = map (prep_term no_defs_lthy) raw_sets; |
664 val set_rhss = map (prep_term no_defs_lthy) raw_sets; |
665 val bd_rhs = prep_term no_defs_lthy raw_bd; |
665 val bd_rhs = prep_term no_defs_lthy raw_bd; |
666 |
666 |
667 fun err T = |
667 fun err T = |
668 error ("Trying to register the type " ^ quote (Syntax.string_of_typ no_defs_lthy T) ^ |
668 error ("Trying to register the type " ^ quote (Syntax.string_of_typ no_defs_lthy T) ^ |
669 " as unnamed BNF"); |
669 " as unnamed BNF"); |
670 |
670 |
671 val (bnf_b, key) = |
671 val (bnf_b, key) = |
672 if Binding.eq_name (bnf_b, Binding.empty) then |
672 if Binding.eq_name (bnf_b, Binding.empty) then |
673 (case bnf_rhs_T of |
673 (case T_rhs of |
674 Type (C, Ts) => if forall (can dest_TFree) Ts |
674 Type (C, Ts) => if forall (can dest_TFree) Ts |
675 then (Binding.qualified_name C, C) else err bnf_rhs_T |
675 then (Binding.qualified_name C, C) else err T_rhs |
676 | T => err T) |
676 | T => err T) |
677 else (bnf_b, Local_Theory.full_name no_defs_lthy bnf_b); |
677 else (bnf_b, Local_Theory.full_name no_defs_lthy bnf_b); |
678 |
678 |
679 val def_qualify = Binding.conceal o Binding.qualify false (Binding.name_of bnf_b); |
679 val def_qualify = Binding.conceal o Binding.qualify false (Binding.name_of bnf_b); |
680 |
680 |
743 handle TYPE _ => error "Bad map function"; |
743 handle TYPE _ => error "Bad map function"; |
744 |
744 |
745 val CA_params = map TVar (Term.add_tvarsT CA []); |
745 val CA_params = map TVar (Term.add_tvarsT CA []); |
746 |
746 |
747 val bnf_sets = map2 (normalize_set CA_params) alphas (map (Morphism.term phi) bnf_set_terms); |
747 val bnf_sets = map2 (normalize_set CA_params) alphas (map (Morphism.term phi) bnf_set_terms); |
748 val bnf_T = Morphism.typ phi bnf_rhs_T; |
748 val bnf_T = Morphism.typ phi T_rhs; |
749 val bnf_bd = |
749 val bnf_bd = |
750 Term.subst_TVars (Term.add_tvar_namesT bnf_T [] ~~ CA_params) (Morphism.term phi bnf_bd_term); |
750 Term.subst_TVars (Term.add_tvar_namesT bnf_T [] ~~ CA_params) (Morphism.term phi bnf_bd_term); |
751 |
751 |
752 (*TODO: assert Ds = (TVars of bnf_map) \ (alphas @ betas) as sets*) |
752 (*TODO: assert Ds = (TVars of bnf_map) \ (alphas @ betas) as sets*) |
753 val deads = (case Ds_opt of |
753 val deads = (case Ds_opt of |