From d8981eb386223ce517647a497eee61759711fa19 Mon Sep 17 00:00:00 2001
From: keleher <keleher@cs.umd.edu>
Date: Wed, 27 Sep 2017 10:45:34 -0400
Subject: [PATCH] auto

---
 .cshrc                                        |   2 +-
 ...tional-Database-Design-Normalization.ipynb | 605 +++++++++++-------
 2 files changed, 366 insertions(+), 241 deletions(-)

diff --git a/.cshrc b/.cshrc
index 06f1933..139f52c 100644
--- a/.cshrc
+++ b/.cshrc
@@ -17,7 +17,7 @@ a l ls -CF
 a ll "ls -alh \!*"
 a llm "ls -alh \!* | m"
 a m 'less -i -M -e -c'
-a jup 'jupyter notebook --port=8889 --no-browser --ip=0.0.0.0'
+a jup 'jupyter notebook --port=8881 --no-browser --ip=0.0.0.0'
 
 bindkey "^[h" backward-delete-word
 bindkey "^[H" backward-delete-word
diff --git a/jupyter/07-Relational-Database-Design-Normalization.ipynb b/jupyter/07-Relational-Database-Design-Normalization.ipynb
index f455556..02b5eab 100644
--- a/jupyter/07-Relational-Database-Design-Normalization.ipynb
+++ b/jupyter/07-Relational-Database-Design-Normalization.ipynb
@@ -19,9 +19,7 @@
   {
    "cell_type": "code",
    "execution_count": 1,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [],
    "source": [
     "from itertools import chain, combinations\n",
@@ -45,9 +43,7 @@
   {
    "cell_type": "code",
    "execution_count": 2,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [],
    "source": [
     "# The following is not really needed for normalization, but may be useful to get intuitions about FDs\n",
@@ -61,7 +57,7 @@
     "                if len(t) == len(self.schema):\n",
     "                        self.tuples.append(t)\n",
     "                else:\n",
-    "                        print \"Added tuple does not match the length of the schema\"\n",
+    "                        print (\"Added tuple does not match the length of the schema\")\n",
     "        def checkIfMatch(self, t1, t2, attr_set):\n",
     "                return all(t1[self.schema.index(attr)] == t2[self.schema.index(attr)] for attr in attr_set)\n",
     "        def checkFDHolds(self, fd):\n",
@@ -70,9 +66,9 @@
     "                for t1 in self.tuples:\n",
     "                        for t2 in self.tuples:\n",
     "                                if t1 < t2 and self.checkIfMatch(t1, t2, fd.lhs) and not self.checkIfMatch(t1, t2, fd.rhs):\n",
-    "                                        print \"Tuples \" + str(t1) + \" and \" + str(t2) + \" violate the FD \" + str(fd)\n",
+    "                                        print (\"Tuples \" + str(t1) + \" and \" + str(t2) + \" violate the FD \" + str(fd))\n",
     "                                        holds = False\n",
-    "                if holds: print \"FD \" + str(fd) + \" holds on this relation\""
+    "                if holds: print (\"FD \" + str(fd) + \" holds on this relation\")"
    ]
   },
   {
@@ -88,9 +84,7 @@
   {
    "cell_type": "code",
    "execution_count": 3,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
@@ -122,9 +116,7 @@
   {
    "cell_type": "code",
    "execution_count": 4,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [],
    "source": [
     "# We need to construct powersets quite frequently.\n",
@@ -143,9 +135,7 @@
   {
    "cell_type": "code",
    "execution_count": 5,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [],
    "source": [
     "def applyreflexivity(R):\n",
@@ -164,9 +154,7 @@
   {
    "cell_type": "code",
    "execution_count": 6,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [],
    "source": [
     "def applyaugmentation(F, PW, printflag):\n",
@@ -175,7 +163,7 @@
     "        \"\"\"\n",
     "        N = {FD(x.lhs.union(y), x.rhs.union(y)) for x in F for y in PW}\n",
     "        for fd in N - F:\n",
-    "                if printflag: print \"   Adding \" + str(fd) + \" by Augmenting \" + str(x) + \" using \" + \"\".join(y)\n",
+    "                if printflag: print (\"   Adding \" + str(fd) + \" by Augmenting \" + str(x) + \" using \" + \"\".join(y))\n",
     "        return F.union(N)"
    ]
   },
@@ -189,9 +177,7 @@
   {
    "cell_type": "code",
    "execution_count": 7,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [],
    "source": [
     "def applytransitivity(F, printflag):\n",
@@ -199,7 +185,7 @@
     "        N = { FD(x.lhs, y.rhs)  for x in F for y in F if x.rhs == y.lhs }\n",
     "        for fd in N - F:\n",
     "                if printflag:\n",
-    "                        print \" Adding \" + str(fd) + \" using Transitivity from \" + str(x) + \" and \" + str(y)\n",
+    "                        print (\" Adding \" + str(fd) + \" using Transitivity from \" + str(x) + \" and \" + str(y))\n",
     "        return F.union(N)"
    ]
   },
@@ -213,9 +199,7 @@
   {
    "cell_type": "code",
    "execution_count": 8,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [],
    "source": [
     "def findClosure(R, F, printflag = False):\n",
@@ -228,13 +212,13 @@
     "        # Repeat application of the other two rules until no change\n",
     "        done = False;\n",
     "        while done == False:\n",
-    "                if printflag: print \"Trying to find new FDs using Transitivity\"\n",
+    "                if printflag: print (\"Trying to find new FDs using Transitivity\")\n",
     "                F2 = applytransitivity(F, printflag)\n",
-    "                if printflag: print \"Trying to find new FDs using Augmentation\"\n",
+    "                if printflag: print (\"Trying to find new FDs using Augmentation\")\n",
     "                F2 = applyaugmentation(F2, powerset(R), printflag)\n",
     "                done = len(F2) == len(F)\n",
     "                F = F2\n",
-    "        if printflag: print \"Finished\"\n",
+    "        if printflag: print (\"Finished\")\n",
     "        return F"
    ]
   },
@@ -248,9 +232,7 @@
   {
    "cell_type": "code",
    "execution_count": 9,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [],
    "source": [
     "def findKeys(R, FClosure):\n",
@@ -281,10 +263,8 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 33,
-   "metadata": {
-    "collapsed": false
-   },
+   "execution_count": 10,
+   "metadata": {},
    "outputs": [],
    "source": [
     "def isInBCNF(R, FClosure, keys):\n",
@@ -299,7 +279,7 @@
     "        \"\"\"Same as above, but finds all violations and prints them\"\"\"\n",
     "        for fd in FClosure:\n",
     "                if (not fd.isTrivial()) and (fd.lhs not in keys):\n",
-    "                        print str(fd) + \" is an FD whose LHS is not a key\"\n",
+    "                        print (str(fd) + \" is an FD whose LHS is not a key\")\n",
     "\n",
     "def findSmallestViolatingFD(R, FClosure, keys):\n",
     "        \"\"\"Same as above, but finds a small FD that violates\"\"\"\n",
@@ -319,9 +299,7 @@
   {
    "cell_type": "code",
    "execution_count": 11,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [],
    "source": [
     "def DecomposeUsingFD(R, FClosure, fd):\n",
@@ -342,18 +320,18 @@
     "def BCNFDecomposition(R, FClosure):\n",
     "        keys = findKeys(R, FClosure)\n",
     "        if not isInBCNF(R, FClosure, keys):\n",
-    "                print \"\".join(R) + \" is not in BCNF\"\n",
+    "                print (\"\".join(R) + \" is not in BCNF\")\n",
     "                fd = findSmallestViolatingFD(R, FClosure, keys)\n",
     "\n",
     "                # Decompose using that FD\n",
     "                (R1, R2, F1Closure, F2Closure) = DecomposeUsingFD(R, FClosure, fd)\n",
-    "                print \"Decomposing \" + \"\".join(R) + \" using \" + str(fd) + \" into relations \" + \"\".join(R1) + \" and \" + \"\".join(R2)\n",
+    "                print (\"Decomposing \" + \"\".join(R) + \" using \" + str(fd) + \" into relations \" + \"\".join(R1) + \" and \" + \"\".join(R2))\n",
     "\n",
     "                # Recurse\n",
     "                BCNFDecomposition(R1, F1Closure)\n",
     "                BCNFDecomposition(R2, F2Closure)\n",
     "        else:\n",
-    "                print \"\".join(R) + \" is in BCNF\""
+    "                print (\"\".join(R) + \" is in BCNF\")"
    ]
   },
   {
@@ -366,10 +344,8 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 12,
-   "metadata": {
-    "collapsed": false
-   },
+   "execution_count": 18,
+   "metadata": {},
    "outputs": [],
    "source": [
     "R = \"ABCD\"\n",
@@ -379,110 +355,108 @@
   {
    "cell_type": "code",
    "execution_count": 13,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "CB -> AC\n",
-      "ACD -> B\n",
-      "BD -> AD\n",
-      "D -> A\n",
-      "AC -> ACD\n",
-      "ACD -> ABD\n",
-      "ACD -> CBD\n",
-      "CD -> BD\n",
-      "A -> AB\n",
-      "ACB -> AD\n",
-      "CBD -> AC\n",
-      "AC -> CB\n",
-      "BD -> A\n",
-      "ACB -> D\n",
-      "CD -> AB\n",
-      "CB -> AB\n",
-      "AC -> AD\n",
-      "AD -> ABD\n",
-      "CB -> BD\n",
-      "A -> B\n",
-      "AD -> BD\n",
-      "CD -> AC\n",
-      "CD -> CBD\n",
-      "CB -> AD\n",
-      "CB -> CD\n",
-      "AC -> ACB\n",
-      "CBD -> A\n",
-      "BD -> ABD\n",
-      "D -> BD\n",
-      "CBD -> AD\n",
+      "D -> DB\n",
+      "DCA -> DBA\n",
+      "CA -> BCA\n",
       "CB -> A\n",
-      "AC -> BD\n",
-      "CB -> ABD\n",
-      "ACB -> ACD\n",
-      "ACB -> CBD\n",
-      "CD -> ACD\n",
-      "ACB -> ABD\n",
-      "CD -> ABD\n",
-      "CB -> ACB\n",
       "D -> B\n",
-      "AC -> CD\n",
-      "BD -> AB\n",
+      "DCA -> BCA\n",
+      "BCA -> DCA\n",
+      "BCA -> DB\n",
+      "CB -> DBA\n",
+      "DC -> DBCA\n",
+      "ACB -> D\n",
+      "D -> DA\n",
+      "DA -> B\n",
+      "DCB -> DCA\n",
+      "DCA -> DCB\n",
+      "DB -> A\n",
+      "DCB -> DAB\n",
+      "DC -> A\n",
+      "DC -> DB\n",
+      "DC -> AB\n",
+      "DCB -> DA\n",
+      "CB -> DB\n",
+      "BCA -> DAB\n",
+      "DCA -> BA\n",
+      "DA -> BA\n",
+      "CB -> ACB\n",
+      "CB -> CA\n",
+      "CA -> CB\n",
+      "DC -> DCB\n",
+      "CA -> BA\n",
+      "DA -> DBA\n",
+      "BCA -> DA\n",
+      "D -> DBA\n",
+      "CA -> B\n",
       "CB -> D\n",
-      "ACD -> BD\n",
-      "AC -> AB\n",
-      "AC -> B\n",
-      "ACD -> ACB\n",
-      "D -> AB\n",
-      "ACB -> BD\n",
-      "CD -> AD\n",
-      "CD -> ACB\n",
-      "CD -> A\n",
-      "CB -> ACBD\n",
-      "ACB -> ACBD\n",
-      "CB -> CBD\n",
-      "CD -> B\n",
-      "ACD -> AB\n",
-      "CBD -> ABD\n",
-      "CBD -> ACB\n",
-      "AD -> B\n",
-      "AD -> AB\n",
-      "CBD -> AB\n",
-      "CBD -> ACD\n",
-      "CBD -> ACBD\n",
-      "ACD -> CB\n",
-      "AC -> ACBD\n",
-      "AC -> CBD\n",
-      "CB -> ACD\n",
-      "ACD -> ACBD\n",
-      "CD -> ACBD\n",
-      "AC -> D\n",
-      "D -> AD\n",
-      "CD -> CB\n",
-      "ACB -> CD\n",
-      "AC -> ABD\n",
-      "D -> ABD\n",
+      "DCB -> ACB\n",
+      "BCA -> DCB\n",
+      "CB -> DA\n",
+      "DC -> B\n",
+      "DCB -> A\n",
+      "DC -> DA\n",
+      "BCA -> DC\n",
+      "DC -> BCA\n",
+      "DB -> AB\n",
+      "DB -> DAB\n",
+      "CB -> DCB\n",
+      "CA -> DB\n",
+      "CA -> DCA\n",
+      "DCA -> DB\n",
+      "D -> A\n",
+      "CA -> D\n",
+      "DCA -> CB\n",
+      "CB -> DCA\n",
+      "DA -> DB\n",
+      "DC -> DCA\n",
+      "DB -> DA\n",
+      "A -> B\n",
+      "DCA -> DBCA\n",
+      "CA -> DBA\n",
+      "DCB -> DACB\n",
+      "D -> BA\n",
+      "BCA -> DACB\n",
+      "CA -> DBCA\n",
+      "CB -> AB\n",
+      "A -> BA\n",
+      "DC -> CB\n",
+      "CB -> DC\n",
+      "CB -> DBCA\n",
+      "CA -> DA\n",
+      "DCB -> CA\n",
+      "CA -> DCB\n",
+      "DCA -> B\n",
+      "DC -> CA\n",
+      "DCB -> AB\n",
+      "CA -> DC\n",
+      "DC -> DBA\n",
       "Keys are:\n",
-      "ACB\n",
-      "CBD\n",
-      "ACD\n",
-      "ACBD\n",
+      "BCA\n",
+      "CA\n",
+      "DBCA\n",
+      "DCB\n",
       "CB\n",
-      "AC\n",
-      "CD\n"
+      "DCA\n",
+      "DC\n"
      ]
     }
    ],
    "source": [
     "Fclosure = findClosure(R, F)\n",
     "for i in Fclosure:\n",
-    "        if not i.isTrivial(): print i\n",
+    "        if not i.isTrivial(): print (i)\n",
     "\n",
     "keys = findKeys(R, Fclosure)\n",
-    "print \"Keys are:\"\n",
+    "print (\"Keys are:\")\n",
     "for i in keys:\n",
-    "        print \"\".join(i)"
+    "        print (\"\".join(i))"
    ]
   },
   {
@@ -495,48 +469,37 @@
   {
    "cell_type": "code",
    "execution_count": 14,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Candidate Keys are:\n",
-      "CB\n",
-      "AC\n",
-      "CD\n"
+     "ename": "TypeError",
+     "evalue": "must use keyword argument for key function",
+     "output_type": "error",
+     "traceback": [
+      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
+      "\u001b[0;31mTypeError\u001b[0m                                 Traceback (most recent call last)",
+      "\u001b[0;32m<ipython-input-14-f976dc9cf4d4>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mcandidatekeys\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfindCandidateKeys\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mR\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mFclosure\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      2\u001b[0m \u001b[0mprint\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;34m\"Candidate Keys are:\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      3\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mcandidatekeys\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      4\u001b[0m         \u001b[0mprint\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;34m\"\"\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mjoin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m<ipython-input-9-3a26a87149f6>\u001b[0m in \u001b[0;36mfindCandidateKeys\u001b[0;34m(R, FClosure)\u001b[0m\n\u001b[1;32m      7\u001b[0m         \u001b[0mkeys\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfindKeys\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mR\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mFClosure\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      8\u001b[0m         \u001b[0mckeys\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 9\u001b[0;31m         \u001b[0;32mfor\u001b[0m \u001b[0mk\u001b[0m \u001b[0;32min\u001b[0m \u001b[0msorted\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkeys\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;32mlambda\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mcmp\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0my\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     10\u001b[0m                 \u001b[0mdontadd\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     11\u001b[0m                 \u001b[0;32mfor\u001b[0m \u001b[0mck\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mckeys\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;31mTypeError\u001b[0m: must use keyword argument for key function"
      ]
     }
    ],
    "source": [
     "candidatekeys = findCandidateKeys(R, Fclosure)\n",
-    "print \"Candidate Keys are:\"\n",
+    "print (\"Candidate Keys are:\")\n",
     "for i in candidatekeys:\n",
-    "        print \"\".join(i)"
+    "        print (\"\".join(i))"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 20,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Checking if the schema is in BCNF\n",
-      "Decomposing using B -> C into relations CB and ABD\n"
-     ]
-    }
-   ],
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
    "source": [
-    "print \"Checking if the schema is in BCNF\"\n",
+    "print (\"Checking if the schema is in BCNF\")\n",
     "if isInBCNF(R, Fclosure, keys):\n",
-    "        print \"The schema is in BCNF\"\n",
+    "        print (\"The schema is in BCNF\")\n",
     "\n",
     "(R1, R2, F1Closure, F2Closure) = DecomposeUsingFD(R, Fclosure, FD('B', 'C'))\n",
     "print \"Decomposing using \" + str(FD('B', 'C')) + \" into relations \" + \"\".join(R1) + \" and \" + \"\".join(R2)"
@@ -544,31 +507,13 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 21,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "-------------- Doing a full BCNF Decompisition -------\n",
-      "ABCD is not in BCNF\n",
-      "Decomposing ABCD using D -> A into relations AD and CBD\n",
-      "AD is in BCNF\n",
-      "CBD is not in BCNF\n",
-      "Decomposing CBD using D -> B into relations BD and CD\n",
-      "BD is in BCNF\n",
-      "CD is in BCNF\n",
-      "------------------------------------------------------\n"
-     ]
-    }
-   ],
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
    "source": [
-    "print \"-------------- Doing a full BCNF Decompisition -------\"\n",
+    "print (\"-------------- Doing a full BCNF Decompisition -------\")\n",
     "BCNFDecomposition(R, Fclosure)\n",
-    "print \"------------------------------------------------------\""
+    "print (\"------------------------------------------------------\")"
    ]
   },
   {
@@ -581,52 +526,25 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 35,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Candidate Keys are:\n",
-      "ED\n",
-      "Checking if the schema is in BCNF\n",
-      "-------------- NO: Doing a full BCNF Decompisition -------\n",
-      "ABCDEH is not in BCNF\n",
-      "Decomposing ABCDEH using E -> B into relations BE and AHCED\n",
-      "BE is in BCNF\n",
-      "AHCED is not in BCNF\n",
-      "Decomposing AHCED using E -> C into relations CE and AHED\n",
-      "CE is in BCNF\n",
-      "AHED is not in BCNF\n",
-      "Decomposing AHED using E -> H into relations HE and AED\n",
-      "HE is in BCNF\n",
-      "AED is not in BCNF\n",
-      "Decomposing AED using E -> A into relations AE and ED\n",
-      "AE is in BCNF\n",
-      "ED is in BCNF\n",
-      "------------------------------------------------------\n"
-     ]
-    }
-   ],
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
    "source": [
     "R2 = \"ABCDEH\"\n",
     "F2 = {FD('A', 'BC'), FD('E', 'HA')}\n",
     "Fclosure2 = findClosure(R2, F2)\n",
     "keys = findKeys(R2, Fclosure2)\n",
     "candidatekeys = findCandidateKeys(R2, Fclosure2)\n",
-    "print \"Candidate Keys are:\"\n",
+    "print (\"Candidate Keys are:\")\n",
     "for i in candidatekeys:\n",
-    "        print \"\".join(i)\n",
-    "print \"Checking if the schema is in BCNF\"\n",
+    "        print (\"\".join(i))\n",
+    "print (\"Checking if the schema is in BCNF\")\n",
     "if isInBCNF(R2, Fclosure2, keys):\n",
-    "        print \"The schema is in BCNF\"\n",
+    "        print (\"The schema is in BCNF\")\n",
     "else:\n",
-    "    print \"-------------- NO: Doing a full BCNF Decompisition -------\"\n",
+    "    print (\"-------------- NO: Doing a full BCNF Decompisition -------\")\n",
     "    BCNFDecomposition(R2, Fclosure2)\n",
-    "    print \"------------------------------------------------------\""
+    "    print (\"------------------------------------------------------\")"
    ]
   },
   {
@@ -637,33 +555,240 @@
     "Below is the smallest relation schema and FDs such that, there is no dependency-preserving BCNF decomposition. In this case, the schema is not in BCNF and needs to be split; but if we do that, then we cannot check for the FD JK --> L without doing a join. The original schema (\"JKL\") is in 3NF"
    ]
   },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "BCNFDecomposition(\"JKL\", findClosure(\"JKL\", {FD('JK', 'L'), FD('L', 'K')}))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 15,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "{<__main__.FD at 0x7f765c969588>,\n",
+       " <__main__.FD at 0x7f765c969d30>,\n",
+       " <__main__.FD at 0x7f765c969390>,\n",
+       " <__main__.FD at 0x7f765d1c5898>,\n",
+       " <__main__.FD at 0x7f765c964198>,\n",
+       " <__main__.FD at 0x7f765c9695f8>,\n",
+       " <__main__.FD at 0x7f765c969470>,\n",
+       " <__main__.FD at 0x7f765c964e10>,\n",
+       " <__main__.FD at 0x7f765c9647f0>,\n",
+       " <__main__.FD at 0x7f7660ab2b38>,\n",
+       " <__main__.FD at 0x7f765c9691d0>,\n",
+       " <__main__.FD at 0x7f765d1c5ef0>,\n",
+       " <__main__.FD at 0x7f765c969898>,\n",
+       " <__main__.FD at 0x7f765c964470>,\n",
+       " <__main__.FD at 0x7f765c964748>,\n",
+       " <__main__.FD at 0x7f7660a59f60>,\n",
+       " <__main__.FD at 0x7f765c969b70>,\n",
+       " <__main__.FD at 0x7f765c9852b0>,\n",
+       " <__main__.FD at 0x7f765c9692e8>,\n",
+       " <__main__.FD at 0x7f765d1c5400>,\n",
+       " <__main__.FD at 0x7f765c969128>,\n",
+       " <__main__.FD at 0x7f7660ab2f98>,\n",
+       " <__main__.FD at 0x7f765c969710>,\n",
+       " <__main__.FD at 0x7f765c969630>,\n",
+       " <__main__.FD at 0x7f765c969208>,\n",
+       " <__main__.FD at 0x7f765c964400>,\n",
+       " <__main__.FD at 0x7f765d1c5748>,\n",
+       " <__main__.FD at 0x7f765c9644e0>,\n",
+       " <__main__.FD at 0x7f765c969438>,\n",
+       " <__main__.FD at 0x7f765c9690b8>,\n",
+       " <__main__.FD at 0x7f765c969278>,\n",
+       " <__main__.FD at 0x7f7660ab2a90>,\n",
+       " <__main__.FD at 0x7f765d1c5550>,\n",
+       " <__main__.FD at 0x7f7660ab26d8>,\n",
+       " <__main__.FD at 0x7f765c964f28>,\n",
+       " <__main__.FD at 0x7f7660a59860>,\n",
+       " <__main__.FD at 0x7f765d1c56a0>,\n",
+       " <__main__.FD at 0x7f765c9641d0>,\n",
+       " <__main__.FD at 0x7f765c964828>,\n",
+       " <__main__.FD at 0x7f765c964048>,\n",
+       " <__main__.FD at 0x7f765d1c58d0>,\n",
+       " <__main__.FD at 0x7f765c969940>,\n",
+       " <__main__.FD at 0x7f765d1c5be0>,\n",
+       " <__main__.FD at 0x7f765d1c5940>,\n",
+       " <__main__.FD at 0x7f765c9645c0>,\n",
+       " <__main__.FD at 0x7f765c9696d8>,\n",
+       " <__main__.FD at 0x7f765d1c5dd8>,\n",
+       " <__main__.FD at 0x7f765c9640f0>,\n",
+       " <__main__.FD at 0x7f765c9694e0>,\n",
+       " <__main__.FD at 0x7f765c9692b0>,\n",
+       " <__main__.FD at 0x7f765d1c5e80>,\n",
+       " <__main__.FD at 0x7f765c969e10>,\n",
+       " <__main__.FD at 0x7f765c969080>,\n",
+       " <__main__.FD at 0x7f765c9697b8>,\n",
+       " <__main__.FD at 0x7f765c969f98>,\n",
+       " <__main__.FD at 0x7f765c9694a8>,\n",
+       " <__main__.FD at 0x7f7660ab2f60>,\n",
+       " <__main__.FD at 0x7f765c964da0>,\n",
+       " <__main__.FD at 0x7f765c94de80>,\n",
+       " <__main__.FD at 0x7f7660ab2c50>,\n",
+       " <__main__.FD at 0x7f765c964550>,\n",
+       " <__main__.FD at 0x7f765c969c88>,\n",
+       " <__main__.FD at 0x7f7660a59e80>,\n",
+       " <__main__.FD at 0x7f765c969550>,\n",
+       " <__main__.FD at 0x7f765c969a20>,\n",
+       " <__main__.FD at 0x7f765c964940>,\n",
+       " <__main__.FD at 0x7f765c969908>,\n",
+       " <__main__.FD at 0x7f765d1c52b0>,\n",
+       " <__main__.FD at 0x7f765c964ef0>,\n",
+       " <__main__.FD at 0x7f765c9644a8>,\n",
+       " <__main__.FD at 0x7f765c985278>,\n",
+       " <__main__.FD at 0x7f765c969cf8>,\n",
+       " <__main__.FD at 0x7f765c969320>,\n",
+       " <__main__.FD at 0x7f765c969668>,\n",
+       " <__main__.FD at 0x7f765c969cc0>,\n",
+       " <__main__.FD at 0x7f7660ab29b0>,\n",
+       " <__main__.FD at 0x7f7660ab27b8>,\n",
+       " <__main__.FD at 0x7f765c969828>,\n",
+       " <__main__.FD at 0x7f765c9696a0>,\n",
+       " <__main__.FD at 0x7f765c969240>,\n",
+       " <__main__.FD at 0x7f765c9695c0>,\n",
+       " <__main__.FD at 0x7f765c964278>,\n",
+       " <__main__.FD at 0x7f765d1c5240>,\n",
+       " <__main__.FD at 0x7f765c9697f0>,\n",
+       " <__main__.FD at 0x7f765d1c5f28>,\n",
+       " <__main__.FD at 0x7f765c9640b8>,\n",
+       " <__main__.FD at 0x7f765c94d4a8>,\n",
+       " <__main__.FD at 0x7f765d1c5860>,\n",
+       " <__main__.FD at 0x7f765c969c18>,\n",
+       " <__main__.FD at 0x7f765c969358>,\n",
+       " <__main__.FD at 0x7f765c969978>,\n",
+       " <__main__.FD at 0x7f765c964668>,\n",
+       " <__main__.FD at 0x7f765c985160>,\n",
+       " <__main__.FD at 0x7f765c9693c8>,\n",
+       " <__main__.FD at 0x7f765c969a58>,\n",
+       " <__main__.FD at 0x7f765c969780>,\n",
+       " <__main__.FD at 0x7f765c964f98>,\n",
+       " <__main__.FD at 0x7f765c969748>,\n",
+       " <__main__.FD at 0x7f7660ab2828>,\n",
+       " <__main__.FD at 0x7f765c964e48>,\n",
+       " <__main__.FD at 0x7f765c94d160>,\n",
+       " <__main__.FD at 0x7f765c9698d0>,\n",
+       " <__main__.FD at 0x7f765c969ba8>,\n",
+       " <__main__.FD at 0x7f7660ab2fd0>,\n",
+       " <__main__.FD at 0x7f765c969d68>,\n",
+       " <__main__.FD at 0x7f765d1c5438>,\n",
+       " <__main__.FD at 0x7f765c969160>,\n",
+       " <__main__.FD at 0x7f7660ab2c18>,\n",
+       " <__main__.FD at 0x7f765d1c5518>,\n",
+       " <__main__.FD at 0x7f7660ab28d0>,\n",
+       " <__main__.FD at 0x7f7660ab2e80>,\n",
+       " <__main__.FD at 0x7f765c964898>,\n",
+       " <__main__.FD at 0x7f765c969ac8>,\n",
+       " <__main__.FD at 0x7f765c964fd0>,\n",
+       " <__main__.FD at 0x7f765d1c5c50>,\n",
+       " <__main__.FD at 0x7f765c969048>,\n",
+       " <__main__.FD at 0x7f765c969518>,\n",
+       " <__main__.FD at 0x7f765c969400>,\n",
+       " <__main__.FD at 0x7f765c969b00>,\n",
+       " <__main__.FD at 0x7f765c969dd8>,\n",
+       " <__main__.FD at 0x7f765c9649b0>,\n",
+       " <__main__.FD at 0x7f765c9699b0>,\n",
+       " <__main__.FD at 0x7f765d1c5cc0>,\n",
+       " <__main__.FD at 0x7f765c9642b0>,\n",
+       " <__main__.FD at 0x7f765c969860>,\n",
+       " <__main__.FD at 0x7f765c969198>,\n",
+       " <__main__.FD at 0x7f765c9690f0>,\n",
+       " <__main__.FD at 0x7f765c969a90>,\n",
+       " <__main__.FD at 0x7f765c985208>,\n",
+       " <__main__.FD at 0x7f765da3e0f0>,\n",
+       " <__main__.FD at 0x7f765c969da0>,\n",
+       " <__main__.FD at 0x7f765c964630>,\n",
+       " <__main__.FD at 0x7f765da3e160>,\n",
+       " <__main__.FD at 0x7f765c964588>,\n",
+       " <__main__.FD at 0x7f765c969b38>,\n",
+       " <__main__.FD at 0x7f7660ab26a0>,\n",
+       " <__main__.FD at 0x7f765c964eb8>,\n",
+       " <__main__.FD at 0x7f765c964dd8>,\n",
+       " <__main__.FD at 0x7f765c985240>,\n",
+       " <__main__.FD at 0x7f765c9699e8>,\n",
+       " <__main__.FD at 0x7f765c969be0>}"
+      ]
+     },
+     "execution_count": 15,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "Fclosure"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 16,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'ABCD'"
+      ]
+     },
+     "execution_count": 16,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "R"
+   ]
+  },
   {
    "cell_type": "code",
    "execution_count": 19,
-   "metadata": {
-    "collapsed": false
-   },
+   "metadata": {},
    "outputs": [
     {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "JKL is not in BCNF\n",
-      "Decomposing JKL using L -> KL into relations KL and JL\n",
-      "KL is in BCNF\n",
-      "JL is in BCNF\n"
+     "data": {
+      "text/plain": [
+       "{<__main__.FD at 0x7f765d1c5390>,\n",
+       " <__main__.FD at 0x7f765d1c54e0>,\n",
+       " <__main__.FD at 0x7f765d1c5cf8>}"
+      ]
+     },
+     "execution_count": 19,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "F"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 20,
+   "metadata": {},
+   "outputs": [
+    {
+     "ename": "SyntaxError",
+     "evalue": "unexpected EOF while parsing (<ipython-input-20-92c25cba582c>, line 1)",
+     "output_type": "error",
+     "traceback": [
+      "\u001b[0;36m  File \u001b[0;32m\"<ipython-input-20-92c25cba582c>\"\u001b[0;36m, line \u001b[0;32m1\u001b[0m\n\u001b[0;31m    FD('A', 'B'\u001b[0m\n\u001b[0m               ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m unexpected EOF while parsing\n"
      ]
     }
    ],
    "source": [
-    "BCNFDecomposition(\"JKL\", findClosure(\"JKL\", {FD('JK', 'L'), FD('L', 'K')}))"
+    "FD('A', 'B'"
    ]
   },
   {
    "cell_type": "code",
    "execution_count": null,
    "metadata": {
-    "collapsed": false
+    "collapsed": true
    },
    "outputs": [],
    "source": []
@@ -671,23 +796,23 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "Python 2",
+   "display_name": "Python 3",
    "language": "python",
-   "name": "python2"
+   "name": "python3"
   },
   "language_info": {
    "codemirror_mode": {
     "name": "ipython",
-    "version": 2
+    "version": 3
    },
    "file_extension": ".py",
    "mimetype": "text/x-python",
    "name": "python",
    "nbconvert_exporter": "python",
-   "pygments_lexer": "ipython2",
-   "version": "2.7.6"
+   "pygments_lexer": "ipython3",
+   "version": "3.5.2"
   }
  },
  "nbformat": 4,
- "nbformat_minor": 0
+ "nbformat_minor": 1
 }
-- 
GitLab