theory NSet imports IFOL begin declare [[eta_contract = false]] typedecl i type_synonym set = i arities i :: "term" consts "zero" :: i ("0") "one" :: i ("1") "empty" :: set ("{}") insert :: "[i, set]\set" "member" :: "[i, set]\o" "lesseq" :: "[set, set]\o" (infixl "<=" 50) Collect :: "[i\o]\set" INTER :: "[set, i\set]\set" UNION :: "[set, i\set]\set" "Minus" :: "[set, set]\set" (infixl "-" 65) "Int" :: "[set, set]\set" (infixl "\" 70) "Un" :: "[set, set]\set" (infixl "\" 65) Compl :: "set\set" Pow :: "set\set" UNIV :: set Ball :: "[set, i\o]\o" Bex :: "[set, i\o]\o" notation member ("op :") and member ("(_/ : _)" [51,51] 50) notation (xsymbols) member ("op \") and member ("(_/ \ _)" [51, 51] 50) notation (HTML output) member ("op \") and member ("(_/ \ _)" [51, 51] 50) syntax "_Coll" :: "pttrn => o => set" ("(1{_./ _})") translations "{x. P}" == "CONST Collect (%x. P)" hide_const (open) member syntax "_Ball" :: "pttrn => set => o => o" ("(3ALL _:_./ _)" [0, 0, 10] 10) "_Bex" :: "pttrn => set => o => o" ("(3EX _:_./ _)" [0, 0, 10] 10) syntax (HOL) "_Ball" :: "pttrn => set => o => o" ("(3! _:_./ _)" [0, 0, 10] 10) "_Bex" :: "pttrn => set => o => o" ("(3? _:_./ _)" [0, 0, 10] 10) syntax (xsymbols) "_Ball" :: "pttrn => set => o => o" ("(3\_\_./ _)" [0, 0, 10] 10) "_Bex" :: "pttrn => set => o => o" ("(3\_\_./ _)" [0, 0, 10] 10) syntax (HTML output) "_Ball" :: "pttrn => set => o => o" ("(3\_\_./ _)" [0, 0, 10] 10) "_Bex" :: "pttrn => set => o => o" ("(3\_\_./ _)" [0, 0, 10] 10) translations "ALL x:A. P" == "CONST Ball(A (%x. P))" "EX x:A. P" == "CONST Bex(A (%x. P))" syntax "op ̃~:" :: "[i,set]\o" ("(_/ ~: _)" [50, 51] 50) (* "@Collect" :: "[pttrn, o]\set" ("(1{_./ _})") *) "@Finset" :: "args \ set" ("{(_)}") (* "op Int" :: "[set, set]\set" (infixl "\" 70) "op Un" :: "[set, set]\set" (infixl "\" 65)*) "@INTER" :: "[pttrn, set, set]\set" ("(3INT _:_./ _)" 10) "@UNION" :: "[pttrn, set, set]\set" ("(3UN _:_./ _)" 10) "_Ball" :: "pttrn \ set \ o \o" ("(3ALL _:_./ _)" [0, 0, 10] 10) "_Bex" :: "[pttrn, set, o]\o" ("(3EX _:_./ _)" [0, 0, 10] 10) translations "NSet.UNIV" == "NSet.Compl({})" "x~: y" == "\(x : y)" "{x, xs}" == "NSet.insert(x,{xs})" "{x}" == "NSet.insert(x,{})" "{x. P}" == "NSet.Collect(\x. P)" "INT x:A. B" == "NSet.INTER(A, (\x. B))" "UN x:A. B" == "NSet.UNION(A, (\x. B))" "ALL x:A. P" == "CONST NSet.Ball(A, (\x. P))" "EX x:A. P" == "CONST NSet.Bex(A, (\x. P))" axiomatization where ext: "A = B\(\x. ((x:A)\(x:B)))" and Collect: "(t :{x. P(x)})\(P(t))" syntax ("" output) " _setle " :: "[set, set]\o" ("op <=") " _setle " :: "[set, set]\o" ("(_/ <= _)" [50, 51] 50) " _setless " :: "[set, set]\o" ("op <") " _setless " :: "[set, set]\o" ("(_/ < _)" [50, 51] 50) syntax (xsymbols) " _setle " :: "[set, set]\o" ("op \") " _setle " :: "[set, set]\o" ("(_/ \ _)" [50, 51] 50) " _setless " :: "[set, set]\o" ("op \") " _setless " :: "[set, set]\o" ("(_/ \ _)" [50, 51] 50) "op ̃~:" :: "['a, set]\o" ("op \") "op ̃~:" :: "['a, set]\o" ("(_/ \ _)" [50, 51] 50) translations "op \" == "op <= :: [set,set] \o" defs subset_def: "A <= B\\x. x\A\x\B" empty_def: "{} \{x. False}" Minus_def: "A - B\{x. x\A\x\B}" Un_def: "A \ B\{x. x\A\x\B}" Int_def : "A \ B\{x. x\A\x\B}" Ball_def: "Ball(A, P)\(\x. x\A\P(x))" Bex_def: "Bex(A, P)\(\x. x\A\P(x))" Compl_def: "Compl(A)\{x.\x\A}" INTER_def: "INTER(A, B)\{y. ALL x:A. y\B(x)}" UNION_def: "UNION(A, B)\ {y. EX x:A. y\B(x)}" insert_def : "insert(a, B)\{x. x=a} \ B" Pow_def: "Pow(A)\{B. B<= A}" lemma inI: "(P(t)) \(t\{x. P(x)})" proof (rule iffD2) show "t \ {x. P(x)} \ P(t)" by (rule Collect) qed lemma "inE2": "(t\{x. P(x)}) \ P(t)" proof (rule iffD1) show "t \ {x. P(x)} \ P(t)" by (rule Collect) qed lemma inE: assumes p1: "(t\{x. P(x)})" assumes p2: "P(t) \ R" shows "R" proof (rule p2) from p1 show "P(t)" by (rule inE2) qed lemma equalsI: "(\ x. x\A\x\B) \ A = B" proof (rule iffD2) show "A=B \ (\x. x \ A \ x \ B)" by (rule ext) qed lemma equalsE2: "A = B \ (\ x. x\A\x\B)" proof (rule iffD1) show "A=B \ (\x. x \ A \ x \ B)" by (rule ext) qed lemma equalsE: assumes p1: "A = B" assumes p2: "(\ x. x\A\x\B) \ R" shows "R" proof (rule p2) from p1 show "\x. x \ A \ x \ B" by (rule equalsE2) qed end