{"cells":[{"metadata":{},"cell_type":"markdown","source":"### 0. Creating a set\n\nWe can easily create a set just by inputing directly the values in the curly braces: `{}`","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"set_A = {1, 2, 3, \"hello\", \"cut\"}\ntype(set_A)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"using `set(list of something)`","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"set_B = set([1, 2, 3, \"hello\", \"cut\"])\ntype(set_B)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"or `set(numpy_array of something)`","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"import numpy as np\nset_C = set(np.arange(0, 3, 1))\ntype(set_C)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### 1. complement and (regular) difference.\n\nLet $S$ be a universal set, and A, B be its subsets, we have\n\n$$ A \\setminus B = \\lbrace x \\in A : x \\not \\in B \\rbrace $$\n\nMoreover, the set $A^C$ defined by\n\n$$ A^C = S \\setminus A = \\lbrace x \\in S : x \\not \\in A \\rbrace $$\n\nis called the complement of $A$ in $S$.","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"S = set([\"cat1\", \"dog1\", \"cat2\", \"dog2\", \"cat3\", \"cat4\", 2j, False, 1, 1j+2, 2.5, 1+2j])\nA = set([\"cat1\", \"dog1\", \"cat2\", \"dog2\", 1, 2.5, False, 1+2j])\nB = set([\"cat1\", \"dog1\", \"cat2\", \"dog2\", \"cat3\", \"cat4\", 2j])","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"We can use both of \n\n                        S.difference(A) \nand\n\n                        S - A \nto simplify the expression $S \\setminus A$","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"print(S.difference(A))\nprint(S - A)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(S - A)\nprint(S - B)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"But, noting that the `set_difference` is not **`symmetric`**, that is\n$$ A \\setminus B \\neq B \\setminus A $$\niff $A \\neq B$","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"print(B - A)\nprint(A - B)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Obviousky, $A \\setminus A = \\emptyset$","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"A - A","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### 2. Intersection.\n\n\nWe have  $$ A \\cap B = B \\cap A = \\lbrace x \\in A \\text{ and } x \\in B \\rbrace = A \\setminus ( A \\setminus B ) = B \\setminus ( B \\setminus A ) $$\n","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"print(A - (A - B))\nprint(B - (B - A))\nprint(B.intersection(A))\nprint(A.intersection(B))","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Moreover, we can call `A & B` to simplify the expression $A \\cap B$","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"A & B","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### 3. Union.\n\nWe have  $$ A \\cup B = B \\cup A = \\lbrace x \\in A \\text{ or } x \\in B \\rbrace $$","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"print(A.union(B))\nprint(B.union(A))","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Likewise, we can call `A | B` to simplify the expression $A \\cup B$","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"print(A | B)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### 4. Symmetric difference.\n\nThe `symmetric difference` is equivalent to the union of both relative complements, that is:\n\n$${\\displaystyle A\\,\\triangle \\,B=\\left(A\\setminus B\\right)\\cup \\left(B\\setminus A\\right) = \\displaystyle B \\triangle \\displaystyle A,}$$","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"print(A.symmetric_difference(B))\nprint(B.symmetric_difference(A))\nprint('Verify: \\n')\n(A - B).union(B - A)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"**Properties.**\n\n1. The symmetric difference is commutative and associative:\n\n$${\\displaystyle {\\begin{aligned} A\\,\\triangle \\,B &= B\\,\\triangle \\,A \\,\\\\(A\\,\\triangle \\,B)\\,\\triangle \\,C &= A\\,\\triangle \\,(B\\,\\triangle \\,C).\\end{aligned}}}$$\n\nMoreover,\n\n$$ A\\,\\triangle \\,B = A^C \\, \\triangle B^C.$$\n\n2. $A \\cup B$ can be expressed by the disjoint-union of $A \\cap B$ and $A\\,\\triangle \\,B$, So the symmetric difference can also be expressed as the union of the two sets, minus their intersection:\n\n$$ {\\displaystyle A\\,\\triangle \\,B=(A\\cup B)\\setminus (A\\cap B),}$$\n\n3. The empty set is neutral, and every set is its own inverse:\n\n$${\\displaystyle {\\begin{aligned}A\\,\\triangle \\,\\emptyset &=A, \\end{aligned}}} \\\\ {\\displaystyle {\\begin{aligned}A\\,\\triangle A\\ &= \\emptyset .\\end{aligned}}}$$\n\n4. Distributes over symmetric difference\n\n$$ {\\displaystyle (A\\,\\triangle \\,B)\\,\\triangle \\,(B\\,\\triangle \\,C)=A\\,\\triangle \\,C.} $$\n\n$$ A\\cap (B\\,\\triangle \\,C)=(A\\cap B)\\,\\triangle \\,(A\\cap C),$$\n\n5. $\\left(\\bigcup _{\\alpha \\in {\\mathcal {I}}}A_{\\alpha }\\right)\\triangle \\left(\\bigcup _{\\alpha \\in {\\mathcal {I}}}B_{\\alpha }\\right)\\subseteq \\bigcup _{\\alpha \\in {\\mathcal {I}}}\\left(A_{\\alpha }\\triangle B_{\\alpha }\\right),$ where $\\displaystyle {\\mathcal {I}}$ is an arbitrary non-empty index set.","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"print('Illustration example')\n##############################################\nA = set([1 , 2, \"1\"])\nB = set([2, \"2\", 1])\nC = set([\"3\", 1, 2])\nS = set([1,2,3, \"1\", \"2\", \"3\"])\nE = set([])\nprint('Let S = %s be the sample_space and \\n \\t\\t\\t A = %s, B = %s, C = %s be its subsets'%(S , A, B, C))\n##############################################\nprint('properties 1: \\n\\t  i) A sym_diff B = %s = %s = B sym_diff A '%(\n    A.symmetric_difference(B), B.symmetric_difference(A)))\nprint('\\t ii) (A sym_diff B) sym_diff C = %s = %s = A sym_diff (B sym_diff C)'%(\n    (A.symmetric_difference(B)).symmetric_difference(C), \n    A.symmetric_difference((B).symmetric_difference(C))))\nprint('\\tiii) A sym_diff B = %s = %s = A^c sym_diff B^c' %(\n    A.symmetric_difference(B), (S - A).symmetric_difference(S - B) ) )\n##############################################\nprint('properties 2: \\n \\t A sym_diff B = %s = %s = %s \\ %s = (A U B) \\ (A \\cap B)'%(\n    A.symmetric_difference(B), \n    ( A.union(B) ) - ( A.intersection(B) ),  \n    A.union(B), A.intersection(B) ) )\n##############################################\nprint('properties 3:')\nprint('\\t  i) A sym_diff emptyset = %s = A'%(A.symmetric_difference(E)))\nprint('\\t ii) A sym_diff A = %s = emptyset'%(A.symmetric_difference(A)))\n##############################################\nprint('properties 4:')\nprint('\\t  i) (A sym_diff B) sym_diff (B sym_diff C) = %s = %s = A sym_diff C'%(\n    (A.symmetric_difference(B) ).symmetric_difference( (B.symmetric_difference(C) ) ),\n    A.symmetric_difference(C)))\nprint('\\t ii) A cap (B sym_diff C) = %s = %s = (A cap B) sym_diff (A cap C)'%(\n    A.intersection( B.symmetric_difference(C) ), \n    ( A.intersection(B) ).symmetric_difference( A.intersection(C) ) ) )\n##############################################","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"**Remarks.** We can also use `A ^ B` to express the operation $A \\, \\triangle B$","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"print(A ^ B)\nprint(A.symmetric_difference(B))","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### 5. Isdisjoint. Checking any 2 set is disjoint or not!\n\n**Quick reminder!** 2 set $X, Y$ is called `disjoint` if $$ X \\cap Y = \\emptyset $$\n\nObviously, $A \\cap \\emptyset = \\emptyset,$ for any set $A$","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"D = set([5, \"6\", \"2\"])\nprint('Is A and B disjoint? \\t\\t%s'%A.isdisjoint(B))\nprint('Is A and C disjoint? \\t\\t%s'%A.isdisjoint(C))\nprint('Is B and C disjoint? \\t\\t%s'%C.isdisjoint(B))\nprint('Is A and E(= emptyset) disjoint? %s'%A.isdisjoint(E))\nprint('Is D and A disjoint? \\t\\t%s'%D.isdisjoint(A))\nprint('Is D and B disjoint? \\t\\t%s'%D.isdisjoint(B))\nprint('Is D and C disjoint? \\t\\t%s'%D.isdisjoint(C))\nprint('Is D and E disjoint? \\t\\t%s'%E.isdisjoint(D))","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### 6. Issubset & issuperset. \n\nUsing `set_A.issubset(set_B)` to verify the given set $A$ is a subset of $B$ or not? \n\nIn the other hand; using `set_B.issuperset(set_A)` to verify whether $B$ contains $A$ or not?","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"print('\"A is a subset of B??\". This statement is: %s.'%A.issubset(B))\nprint('\"A is contained in S??\". This statement is: %s.'%S.issuperset(A))\nprint('\"E is a subset of B??\". This statement is: %s.'%E.issubset(B))\nprint('\"D is a subset of D??\". This statement is: %s.'%D.issubset(D))\nprint('\"D is contained in D??\". This statement is: %s.'%D.issuperset(D))","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"To distinguish the operator $\\subset$ and $\\subseteq$ in Python, we can use `<` and `<=` for any sets. For example","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"def is_sub_propsub(x , y):   \n    \"\"\" \n        Input: x, y (set)\n        return: x is subset or proper_subset or not a subset of y\n    \"\"\"\n    if x < y:\n        print('%s is a proper subset of %s'%(str(x), str(y)))\n    elif x <= y:\n        print('%s is a subset or identical to %s'%(str(x), str(y)))\n    else:\n        print('%s is not subset of %s'%(str(x), str(y)))\n        \nis_sub_propsub(D, D)\nis_sub_propsub(D, S)\nis_sub_propsub(A, S)\nis_sub_propsub(A, B)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"help(is_sub_propsub)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def is_sup_propsup(x , y):\n    if x > y:\n        print('%s is a proper superset of %s'%(str(x), str(y)))\n    elif x >= y:\n        print('%s is a superset or identical to %s'%(str(x), str(y)))\n    else:\n        print('%s is not superset of %s'%(str(x), str(y)))\n        \nis_sup_propsup(A, A)\nis_sup_propsup(S, A)\nis_sup_propsup(D, A)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Ref: \n- https://en.wikipedia.org/wiki/Symmetric_difference\n- https://en.wikipedia.org/wiki/Set_theory","execution_count":null}],"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat":4,"nbformat_minor":4}