85 val could_unify: typ * typ -> bool |
85 val could_unify: typ * typ -> bool |
86 val could_unifys: typ list * typ list -> bool |
86 val could_unifys: typ list * typ list -> bool |
87 val eq_type: tyenv -> typ * typ -> bool |
87 val eq_type: tyenv -> typ * typ -> bool |
88 |
88 |
89 (*extend and merge type signatures*) |
89 (*extend and merge type signatures*) |
90 val add_class: Proof.context -> Name_Space.naming -> binding * class list -> tsig -> tsig |
90 val add_class: Context.generic -> binding * class list -> tsig -> tsig |
91 val hide_class: bool -> string -> tsig -> tsig |
91 val hide_class: bool -> string -> tsig -> tsig |
92 val set_defsort: sort -> tsig -> tsig |
92 val set_defsort: sort -> tsig -> tsig |
93 val add_type: Proof.context -> Name_Space.naming -> binding * int -> tsig -> tsig |
93 val add_type: Context.generic -> binding * int -> tsig -> tsig |
94 val add_abbrev: Proof.context -> Name_Space.naming -> binding * string list * typ -> tsig -> tsig |
94 val add_abbrev: Context.generic -> binding * string list * typ -> tsig -> tsig |
95 val add_nonterminal: Proof.context -> Name_Space.naming -> binding -> tsig -> tsig |
95 val add_nonterminal: Context.generic -> binding -> tsig -> tsig |
96 val hide_type: bool -> string -> tsig -> tsig |
96 val hide_type: bool -> string -> tsig -> tsig |
97 val add_arity: Proof.context -> arity -> tsig -> tsig |
97 val add_arity: Context.pretty -> arity -> tsig -> tsig |
98 val add_classrel: Proof.context -> class * class -> tsig -> tsig |
98 val add_classrel: Context.pretty -> class * class -> tsig -> tsig |
99 val merge_tsig: Proof.context -> tsig * tsig -> tsig |
99 val merge_tsig: Context.pretty -> tsig * tsig -> tsig |
100 end; |
100 end; |
101 |
101 |
102 structure Type: TYPE = |
102 structure Type: TYPE = |
103 struct |
103 struct |
104 |
104 |
582 |
583 |
583 (** extend and merge type signatures **) |
584 (** extend and merge type signatures **) |
584 |
585 |
585 (* classes *) |
586 (* classes *) |
586 |
587 |
587 fun add_class ctxt naming (c, cs) tsig = |
588 fun add_class context (c, cs) tsig = |
588 tsig |> map_tsig (fn ((space, classes), default, types) => |
589 tsig |> map_tsig (fn ((space, classes), default, types) => |
589 let |
590 let |
590 val cs' = map (cert_class tsig) cs |
591 val cs' = map (cert_class tsig) cs |
591 handle TYPE (msg, _, _) => error msg; |
592 handle TYPE (msg, _, _) => error msg; |
592 val _ = Binding.check c; |
593 val _ = Binding.check c; |
593 val (c', space') = space |> Name_Space.declare ctxt true naming c; |
594 val (c', space') = space |> Name_Space.declare context true c; |
594 val classes' = classes |> Sorts.add_class ctxt (c', cs'); |
595 val classes' = classes |> Sorts.add_class (Context.pretty_generic context) (c', cs'); |
595 in ((space', classes'), default, types) end); |
596 in ((space', classes'), default, types) end); |
596 |
597 |
597 fun hide_class fully c = map_tsig (fn ((space, classes), default, types) => |
598 fun hide_class fully c = map_tsig (fn ((space, classes), default, types) => |
598 ((Name_Space.hide fully c space, classes), default, types)); |
599 ((Name_Space.hide fully c space, classes), default, types)); |
599 |
600 |
600 |
601 |
601 (* arities *) |
602 (* arities *) |
602 |
603 |
603 fun add_arity ctxt (t, Ss, S) tsig = tsig |> map_tsig (fn ((space, classes), default, types) => |
604 fun add_arity pp (t, Ss, S) tsig = tsig |> map_tsig (fn ((space, classes), default, types) => |
604 let |
605 let |
605 val _ = |
606 val _ = |
606 (case lookup_type tsig t of |
607 (case lookup_type tsig t of |
607 SOME (LogicalType n) => if length Ss <> n then error (bad_nargs t) else () |
608 SOME (LogicalType n) => if length Ss <> n then error (bad_nargs t) else () |
608 | SOME _ => error ("Logical type constructor expected: " ^ quote t) |
609 | SOME _ => error ("Logical type constructor expected: " ^ quote t) |
609 | NONE => error (undecl_type t)); |
610 | NONE => error (undecl_type t)); |
610 val (Ss', S') = (map (cert_sort tsig) Ss, cert_sort tsig S) |
611 val (Ss', S') = (map (cert_sort tsig) Ss, cert_sort tsig S) |
611 handle TYPE (msg, _, _) => error msg; |
612 handle TYPE (msg, _, _) => error msg; |
612 val classes' = classes |> Sorts.add_arities ctxt ((t, map (fn c' => (c', Ss')) S')); |
613 val classes' = classes |> Sorts.add_arities pp ((t, map (fn c' => (c', Ss')) S')); |
613 in ((space, classes'), default, types) end); |
614 in ((space, classes'), default, types) end); |
614 |
615 |
615 |
616 |
616 (* classrel *) |
617 (* classrel *) |
617 |
618 |
618 fun add_classrel ctxt rel tsig = |
619 fun add_classrel pp rel tsig = |
619 tsig |> map_tsig (fn ((space, classes), default, types) => |
620 tsig |> map_tsig (fn ((space, classes), default, types) => |
620 let |
621 let |
621 val rel' = pairself (cert_class tsig) rel |
622 val rel' = pairself (cert_class tsig) rel |
622 handle TYPE (msg, _, _) => error msg; |
623 handle TYPE (msg, _, _) => error msg; |
623 val classes' = classes |> Sorts.add_classrel ctxt rel'; |
624 val classes' = classes |> Sorts.add_classrel pp rel'; |
624 in ((space, classes'), default, types) end); |
625 in ((space, classes'), default, types) end); |
625 |
626 |
626 |
627 |
627 (* default sort *) |
628 (* default sort *) |
628 |
629 |
649 orelse exists (syntactic types) Ts |
650 orelse exists (syntactic types) Ts |
650 | syntactic _ _ = false; |
651 | syntactic _ _ = false; |
651 |
652 |
652 in |
653 in |
653 |
654 |
654 fun add_type ctxt naming (c, n) = |
655 fun add_type context (c, n) = |
655 if n < 0 then error ("Bad type constructor declaration " ^ Binding.print c) |
656 if n < 0 then error ("Bad type constructor declaration " ^ Binding.print c) |
656 else map_types (new_decl ctxt naming (c, LogicalType n)); |
657 else map_types (new_decl context (c, LogicalType n)); |
657 |
658 |
658 fun add_abbrev ctxt naming (a, vs, rhs) tsig = tsig |> map_types (fn types => |
659 fun add_abbrev context (a, vs, rhs) tsig = tsig |> map_types (fn types => |
659 let |
660 let |
660 fun err msg = |
661 fun err msg = |
661 cat_error msg ("The error(s) above occurred in type abbreviation " ^ Binding.print a); |
662 cat_error msg ("The error(s) above occurred in type abbreviation " ^ Binding.print a); |
662 val rhs' = strip_sorts (no_tvars (cert_typ_mode mode_syntax tsig rhs)) |
663 val rhs' = strip_sorts (no_tvars (cert_typ_mode mode_syntax tsig rhs)) |
663 handle TYPE (msg, _, _) => err msg; |
664 handle TYPE (msg, _, _) => err msg; |
667 | dups => err ("Duplicate variables on lhs: " ^ commas_quote dups)); |
668 | dups => err ("Duplicate variables on lhs: " ^ commas_quote dups)); |
668 val _ = |
669 val _ = |
669 (case subtract (op =) vs (map #1 (Term.add_tfreesT rhs' [])) of |
670 (case subtract (op =) vs (map #1 (Term.add_tfreesT rhs' [])) of |
670 [] => [] |
671 [] => [] |
671 | extras => err ("Extra variables on rhs: " ^ commas_quote extras)); |
672 | extras => err ("Extra variables on rhs: " ^ commas_quote extras)); |
672 in types |> new_decl ctxt naming (a, Abbreviation (vs, rhs', syntactic (#2 types) rhs')) end); |
673 in types |> new_decl context (a, Abbreviation (vs, rhs', syntactic (#2 types) rhs')) end); |
673 |
674 |
674 fun add_nonterminal ctxt naming = map_types o new_decl ctxt naming o rpair Nonterminal; |
675 fun add_nonterminal context = map_types o new_decl context o rpair Nonterminal; |
675 |
676 |
676 end; |
677 end; |
677 |
678 |
678 fun hide_type fully c = map_tsig (fn (classes, default, (space, types)) => |
679 fun hide_type fully c = map_tsig (fn (classes, default, (space, types)) => |
679 (classes, default, (Name_Space.hide fully c space, types))); |
680 (classes, default, (Name_Space.hide fully c space, types))); |
680 |
681 |
681 |
682 |
682 (* merge type signatures *) |
683 (* merge type signatures *) |
683 |
684 |
684 fun merge_tsig ctxt (tsig1, tsig2) = |
685 fun merge_tsig pp (tsig1, tsig2) = |
685 let |
686 let |
686 val (TSig {classes = (space1, classes1), default = default1, types = types1, |
687 val (TSig {classes = (space1, classes1), default = default1, types = types1, |
687 log_types = _}) = tsig1; |
688 log_types = _}) = tsig1; |
688 val (TSig {classes = (space2, classes2), default = default2, types = types2, |
689 val (TSig {classes = (space2, classes2), default = default2, types = types2, |
689 log_types = _}) = tsig2; |
690 log_types = _}) = tsig2; |
690 |
691 |
691 val space' = Name_Space.merge (space1, space2); |
692 val space' = Name_Space.merge (space1, space2); |
692 val classes' = Sorts.merge_algebra ctxt (classes1, classes2); |
693 val classes' = Sorts.merge_algebra pp (classes1, classes2); |
693 val default' = Sorts.inter_sort classes' (default1, default2); |
694 val default' = Sorts.inter_sort classes' (default1, default2); |
694 val types' = Name_Space.merge_tables (types1, types2); |
695 val types' = Name_Space.merge_tables (types1, types2); |
695 in build_tsig ((space', classes'), default', types') end; |
696 in build_tsig ((space', classes'), default', types') end; |
696 |
697 |
697 end; |
698 end; |