src/HOL/Set.thy
changeset 2261 d926157c0a6a
parent 2006 72754e060aa2
child 2368 d394336997cf
equal deleted inserted replaced
2260:b59781f2b809 2261:d926157c0a6a
     3     Author:     Tobias Nipkow
     3     Author:     Tobias Nipkow
     4     Copyright   1993  University of Cambridge
     4     Copyright   1993  University of Cambridge
     5 *)
     5 *)
     6 
     6 
     7 Set = Ord +
     7 Set = Ord +
       
     8 
       
     9 
       
    10 (** Core syntax **)
     8 
    11 
     9 types
    12 types
    10   'a set
    13   'a set
    11 
    14 
    12 arities
    15 arities
    23   Int           :: ['a set, 'a set] => 'a set       (infixl 70)
    26   Int           :: ['a set, 'a set] => 'a set       (infixl 70)
    24   Un            :: ['a set, 'a set] => 'a set       (infixl 65)
    27   Un            :: ['a set, 'a set] => 'a set       (infixl 65)
    25   UNION, INTER  :: ['a set, 'a => 'b set] => 'b set     (*general*)
    28   UNION, INTER  :: ['a set, 'a => 'b set] => 'b set     (*general*)
    26   UNION1        :: ['a => 'b set] => 'b set         (binder "UN " 10)
    29   UNION1        :: ['a => 'b set] => 'b set         (binder "UN " 10)
    27   INTER1        :: ['a => 'b set] => 'b set         (binder "INT " 10)
    30   INTER1        :: ['a => 'b set] => 'b set         (binder "INT " 10)
    28   Union, Inter  :: (('a set)set) => 'a set              (*of a set*)
    31   Union, Inter  :: (('a set) set) => 'a set             (*of a set*)
    29   Pow           :: 'a set => 'a set set                 (*powerset*)
    32   Pow           :: 'a set => 'a set set                 (*powerset*)
    30   range         :: ('a => 'b) => 'b set                 (*of function*)
    33   range         :: ('a => 'b) => 'b set                 (*of function*)
    31   Ball, Bex     :: ['a set, 'a => bool] => bool         (*bounded quantifiers*)
    34   Ball, Bex     :: ['a set, 'a => bool] => bool         (*bounded quantifiers*)
    32   inj, surj     :: ('a => 'b) => bool                   (*inj/surjective*)
    35   inj, surj     :: ('a => 'b) => bool                   (*inj/surjective*)
    33   inj_onto      :: ['a => 'b, 'a set] => bool
    36   inj_onto      :: ['a => 'b, 'a set] => bool
    34   "``"          :: ['a => 'b, 'a set] => ('b set)   (infixr 90)
    37   "``"          :: ['a => 'b, 'a set] => ('b set)   (infixr 90)
    35      (*membership*)
    38   (*membership*)
    36   "op :"        :: ['a, 'a set] => bool             ("(_/ : _)" [50,51] 50)
    39   "op :"        :: ['a, 'a set] => bool             ("(_/ : _)" [50, 51] 50)
    37 
    40 
       
    41 
       
    42 
       
    43 (** Additional concrete syntax **)
    38 
    44 
    39 syntax
    45 syntax
    40 
    46 
    41   UNIV         :: 'a set
    47   "op :"        :: ['a, 'a set] => bool               ("op :")
    42 
    48 
    43      (*infix synatx for non-membership*)
    49   UNIV          :: 'a set
    44   "op ~:"        :: ['a, 'a set] => bool             ("(_/ ~: _)" [50,51] 50)
       
    45 
    50 
    46   "@Finset"     :: args => 'a set                   ("{(_)}")
    51   (* Infix syntax for non-membership *)
    47 
    52 
    48   "@Coll"       :: [pttrn, bool] => 'a set          ("(1{_./ _})")
    53   "op ~:"       :: ['a, 'a set] => bool               ("(_/ ~: _)" [50, 51] 50)
    49   "@SetCompr"   :: ['a, idts, bool] => 'a set       ("(1{_ |/_./ _})")
    54   "op ~:"       :: ['a, 'a set] => bool               ("op ~:")
       
    55 
       
    56   "@Finset"     :: args => 'a set                     ("{(_)}")
       
    57 
       
    58   "@Coll"       :: [pttrn, bool] => 'a set            ("(1{_./ _})")
       
    59   "@SetCompr"   :: ['a, idts, bool] => 'a set         ("(1{_ |/_./ _})")
    50 
    60 
    51   (* Big Intersection / Union *)
    61   (* Big Intersection / Union *)
    52 
    62 
    53   "@INTER"      :: [pttrn, 'a set, 'b set] => 'b set  ("(3INT _:_./ _)" 10)
    63   "@INTER"      :: [pttrn, 'a set, 'b set] => 'b set  ("(3INT _:_./ _)" 10)
    54   "@UNION"      :: [pttrn, 'a set, 'b set] => 'b set  ("(3UN _:_./ _)" 10)
    64   "@UNION"      :: [pttrn, 'a set, 'b set] => 'b set  ("(3UN _:_./ _)" 10)
    60   "*Ball"       :: [pttrn, 'a set, bool] => bool      ("(3ALL _:_./ _)" 10)
    70   "*Ball"       :: [pttrn, 'a set, bool] => bool      ("(3ALL _:_./ _)" 10)
    61   "*Bex"        :: [pttrn, 'a set, bool] => bool      ("(3EX _:_./ _)" 10)
    71   "*Bex"        :: [pttrn, 'a set, bool] => bool      ("(3EX _:_./ _)" 10)
    62 
    72 
    63 translations
    73 translations
    64   "UNIV"        == "Compl {}"
    74   "UNIV"        == "Compl {}"
    65   "range(f)"    == "f``UNIV"
    75   "range f"     == "f``UNIV"
    66   "x ~: y"      == "~ (x : y)"
    76   "x ~: y"      == "~ (x : y)"
    67   "{x, xs}"     == "insert x {xs}"
    77   "{x, xs}"     == "insert x {xs}"
    68   "{x}"         == "insert x {}"
    78   "{x}"         == "insert x {}"
    69   "{x. P}"      == "Collect (%x. P)"
    79   "{x. P}"      == "Collect (%x. P)"
    70   "INT x:A. B"  == "INTER A (%x. B)"
    80   "INT x:A. B"  == "INTER A (%x. B)"
    73   "? x:A. P"    == "Bex A (%x. P)"
    83   "? x:A. P"    == "Bex A (%x. P)"
    74   "ALL x:A. P"  => "Ball A (%x. P)"
    84   "ALL x:A. P"  => "Ball A (%x. P)"
    75   "EX x:A. P"   => "Bex A (%x. P)"
    85   "EX x:A. P"   => "Bex A (%x. P)"
    76 
    86 
    77 
    87 
       
    88 syntax (symbols)
       
    89   "op Int"      :: ['a set, 'a set] => 'a set         (infixl "\\<inter>" 70)
       
    90   "op Un"       :: ['a set, 'a set] => 'a set         (infixl "\\<union>" 65)
       
    91   "op :"        :: ['a, 'a set] => bool               ("(_/ \\<in> _)" [50, 51] 50)
       
    92   "op :"        :: ['a, 'a set] => bool               ("op \\<in>")
       
    93   "op ~:"       :: ['a, 'a set] => bool               ("(_/ \\<notin> _)" [50, 51] 50)
       
    94   "op ~:"       :: ['a, 'a set] => bool               ("op \\<notin>")
       
    95   "UN "         :: [idts, bool] => bool               ("(3\\<Union> _./ _)" 10)
       
    96   "INT "        :: [idts, bool] => bool               ("(3\\<Inter> _./ _)" 10)
       
    97   "@UNION"      :: [pttrn, 'a set, 'b set] => 'b set  ("(3\\<Union> _\\<in>_./ _)" 10)
       
    98   "@INTER"      :: [pttrn, 'a set, 'b set] => 'b set  ("(3\\<Inter> _\\<in>_./ _)" 10)
       
    99   Union         :: (('a set) set) => 'a set           ("\\<Union> _" [90] 90)
       
   100   Inter         :: (('a set) set) => 'a set           ("\\<Inter> _" [90] 90)
       
   101   "@Ball"       :: [pttrn, 'a set, bool] => bool      ("(3\\<forall> _\\<in>_./ _)" 10)
       
   102   "@Bex"        :: [pttrn, 'a set, bool] => bool      ("(3\\<exists> _\\<in>_./ _)" 10)
       
   103   "*Ball"       :: [pttrn, 'a set, bool] => bool      ("(3\\<forall> _\\<in>_./ _)" 10)
       
   104   "*Bex"        :: [pttrn, 'a set, bool] => bool      ("(3\\<exists> _\\<in>_./ _)" 10)
       
   105 
       
   106 
       
   107 
       
   108 (** Rules and definitions **)
       
   109 
    78 rules
   110 rules
    79 
   111 
    80   (* Isomorphisms between Predicates and Sets *)
   112   (* Isomorphisms between Predicates and Sets *)
    81 
   113 
    82   mem_Collect_eq    "(a : {x.P(x)}) = P(a)"
   114   mem_Collect_eq    "(a : {x.P(x)}) = P(a)"
    83   Collect_mem_eq    "{x.x:A} = A"
   115   Collect_mem_eq    "{x.x:A} = A"
    84 
   116 
    85 
   117 
    86 defs
   118 defs
       
   119 
    87   Ball_def      "Ball A P       == ! x. x:A --> P(x)"
   120   Ball_def      "Ball A P       == ! x. x:A --> P(x)"
    88   Bex_def       "Bex A P        == ? x. x:A & P(x)"
   121   Bex_def       "Bex A P        == ? x. x:A & P(x)"
    89   subset_def    "A <= B         == ! x:A. x:B"
   122   subset_def    "A <= B         == ! x:A. x:B"
    90   Compl_def     "Compl(A)       == {x. ~x:A}"
   123   Compl_def     "Compl(A)       == {x. ~x:A}"
    91   Un_def        "A Un B         == {x.x:A | x:B}"
   124   Un_def        "A Un B         == {x.x:A | x:B}"
   107 
   140 
   108 (* start 8bit 1 *)
   141 (* start 8bit 1 *)
   109 (* end 8bit 1 *)
   142 (* end 8bit 1 *)
   110 
   143 
   111 end
   144 end
       
   145 
   112 
   146 
   113 ML
   147 ML
   114 
   148 
   115 local
   149 local
   116 
   150 
   148 val print_translation = [("Collect", setcompr_tr')];
   182 val print_translation = [("Collect", setcompr_tr')];
   149 val print_ast_translation =
   183 val print_ast_translation =
   150   map HOL.alt_ast_tr' [("@Ball", "*Ball"), ("@Bex", "*Bex")];
   184   map HOL.alt_ast_tr' [("@Ball", "*Ball"), ("@Bex", "*Bex")];
   151 
   185 
   152 end;
   186 end;
   153