{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Infrastructure for generic code in Sage: categories, axioms, constructions"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "from sage.categories.category_with_axiom import CategoryWithAxiom\n",
    "from sage.categories.cartesian_product import CartesianProductsCategory"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Parents, Elements, and generic code, the plain Python way"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "class SemigroupElement:\n",
    "    def __pow__(self, k):\n",
    "        assert k==8\n",
    "        self = self * self\n",
    "        self = self * self\n",
    "        self = self * self\n",
    "        return self\n",
    "\n",
    "class Stroumph(SemigroupElement):\n",
    "    def __init__(self, name):\n",
    "        self._name = name\n",
    "    def __repr__(self):\n",
    "        return self._name\n",
    "    def __mul__(self, other):\n",
    "        return other\n",
    "    def sing(self):\n",
    "        print \"I sing\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Stroumph coquet"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "s = Stroumph(\"Stroumph coquet\"); s"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Stroumph costaud"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "t = Stroumph(\"Stroumph costaud\"); t"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Stroumph costaud"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "s*t"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Stroumph coquet"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "s^8"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 118,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "class Semigroup:\n",
    "    def cayley_graph():\n",
    "        pass\n",
    "    # stuff about generators, ...\n",
    "\n",
    "\n",
    "class BandOfStroumphs(Semigroup):\n",
    "    def __iter__(self):\n",
    "        yield Stroumph(\"Stroumph coquet\")\n",
    "        yield Stroumph(\"Stroumph costaud\")\n",
    "        yield Stroumph(\"Grand stroumph\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Stroumph coquet\n",
      "Stroumph costaud\n",
      "Grand stroumph\n"
     ]
    }
   ],
   "source": [
    "for x in BandOfStroumphs():\n",
    "    print x"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## A hierarchy of abstract classes the usual way"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 119,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "class Set(object):\n",
    "    \"\"\"Methods for sets\"\"\"\n",
    "class SetElement(object):\n",
    "    \"\"\"Methods for elements of sets\"\"\"\n",
    "class SetMorphism(object):\n",
    "    \"\"\"Methods for set morphisms\"\"\"\n",
    "\n",
    "class Magma(Set):\n",
    "    \"\"\"Methods for magmas\"\"\"\n",
    "class MagmaElement(SetElement):\n",
    "    \"\"\"Methods for elements of magmas\"\"\"\n",
    "\n",
    "class Semigroup(Magma):\n",
    "    \"\"\"Methods for semigroups\"\"\"\n",
    "class SemigroupElement(MagmaElement):\n",
    "    \"\"\"Methods for elements of semigroups\"\"\"\n",
    "    def __pow__(self, k): pass"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Refactoring as a category"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 120,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "class MySemigroups(Category):\n",
    "    def super_categories(self):  # Mathematical information\n",
    "        return [Magmas()]\n",
    "    class ParentMethods:         # This is a mix-in\n",
    "        \"\"\"Methods for semigroups\"\"\"\n",
    "    class ElementMethods:\n",
    "        \"\"\"Methods for semigroup elements\"\"\"\n",
    "        def __pow__(self, k): pass\n",
    "    class MorphismMethods:\n",
    "        \"\"\"Methods for semigroup morphisms\"\"\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[Category of magmas]"
      ]
     },
     "execution_count": 60,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "MySemigroups().super_categories()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "cls = MySemigroups().parent_class"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<class '__main__.MySemigroups.parent_class'>,\n",
       " <class 'sage.categories.magmas.Magmas.parent_class'>,\n",
       " <class 'sage.categories.sets_cat.Sets.parent_class'>,\n",
       " <class 'sage.categories.sets_with_partial_maps.SetsWithPartialMaps.parent_class'>,\n",
       " <class 'sage.categories.objects.Objects.parent_class'>,\n",
       " <type 'object'>]"
      ]
     },
     "execution_count": 65,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cls.mro()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## A complete Parent, written the Sage way"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "class BandOfStroumphs(Parent):\n",
    "    def __init__(self):\n",
    "        category = Semigroups() & EnumeratedSets().Finite()\n",
    "        Parent.__init__(self, category=category)\n",
    "    \n",
    "    def semigroup_generators(self):\n",
    "        return Family(list(self))\n",
    "    \n",
    "    def __iter__(self):\n",
    "        yield self(\"Stroumph coquet\")\n",
    "        yield self(\"Stroumph costaud\")\n",
    "        yield self(\"Grand stroumph\")\n",
    "        \n",
    "    class Element(ElementWrapper):\n",
    "        def _mul_(self, other):\n",
    "            return other"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "B = BandOfStroumphs()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'Stroumph coquet'"
      ]
     },
     "execution_count": 92,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "B(\"Stroumph coquet\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 91,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<bound method BandOfStroumphs_with_category.list of <class '__main__.BandOfStroumphs_with_category'>>"
      ]
     },
     "execution_count": 91,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "B.list()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'Stroumph coquet'"
      ]
     },
     "execution_count": 87,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "s = B.an_element(); s"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "Looped multi-digraph on 3 vertices"
      ]
     },
     "execution_count": 88,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "B.cayley_graph()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 112,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "running ._test_an_element() . . . pass\n",
      "running ._test_associativity() . . . pass\n",
      "running ._test_cardinality() . . . pass\n",
      "running ._test_category() . . . pass\n",
      "running ._test_elements() . . .\n",
      "  Running the test suite of self.an_element()\n",
      "  running ._test_category() . . . pass\n",
      "  running ._test_eq() . . . pass\n",
      "  running ._test_not_implemented_methods() . . . pass\n",
      "  running ._test_pickling() . . . fail\n",
      "  Traceback (most recent call last):\n",
      "    File \"/opt/sage-git/local/lib/python2.7/site-packages/sage/misc/sage_unittest.py\", line 283, in run\n",
      "      test_method(tester = tester)\n",
      "    File \"sage/structure/sage_object.pyx\", line 665, in sage.structure.sage_object.SageObject._test_pickling (/opt/sage-git/src/build/cythonized/sage/structure/sage_object.c:5231)\n",
      "      tester.assertEqual(loads(dumps(self)), self)\n",
      "    File \"sage/structure/sage_object.pyx\", line 1130, in sage.structure.sage_object.dumps (/opt/sage-git/src/build/cythonized/sage/structure/sage_object.c:12525)\n",
      "      return obj.dumps(compress)\n",
      "    File \"sage/structure/sage_object.pyx\", line 488, in sage.structure.sage_object.SageObject.dumps (/opt/sage-git/src/build/cythonized/sage/structure/sage_object.c:3912)\n",
      "      s = cPickle.dumps(self, protocol=2)\n",
      "  PicklingError: Can't pickle <class '__main__.Element'>: attribute lookup __main__.Element failed\n",
      "  ------------------------------------------------------------\n",
      "  The following tests failed: _test_pickling\n",
      "running ._test_elements_eq_reflexive() . . . pass\n",
      "running ._test_elements_eq_symmetric() . . . pass\n",
      "running ._test_elements_eq_transitive() . . . pass\n",
      "running ._test_elements_neq() . . . pass\n",
      "running ._test_enumerated_set_contains() . . . pass\n",
      "running ._test_enumerated_set_iter_cardinality() . . . pass\n",
      "running ._test_enumerated_set_iter_list() . . . pass\n",
      "running ._test_eq() . . . pass\n",
      "running ._test_not_implemented_methods() . . . pass\n",
      "running ._test_some_elements() . . . pass\n",
      "The following tests failed: _test_elements\n"
     ]
    }
   ],
   "source": [
    "TestSuite(B).run(verbose=True, skip=\"_test_pickling\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Join of Category of finite semigroups and Category of finite enumerated sets"
      ]
     },
     "execution_count": 93,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "B.category()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 94,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[Join of Category of finite semigroups and Category of finite enumerated sets,\n",
       " Category of finite semigroups,\n",
       " Category of semigroups,\n",
       " Category of magmas,\n",
       " Category of finite enumerated sets,\n",
       " Category of enumerated sets,\n",
       " Category of finite sets,\n",
       " Category of sets,\n",
       " Category of sets with partial maps,\n",
       " Category of objects]"
      ]
     },
     "execution_count": 94,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "B.categories()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 95,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<class '__main__.BandOfStroumphs_with_category'>,\n",
       " <class '__main__.BandOfStroumphs'>,\n",
       " <type 'sage.structure.parent.Parent'>,\n",
       " <type 'sage.structure.category_object.CategoryObject'>,\n",
       " <type 'sage.structure.sage_object.SageObject'>,\n",
       " <class 'sage.categories.category.JoinCategory.parent_class'>,\n",
       " <class 'sage.categories.finite_semigroups.FiniteSemigroups.parent_class'>,\n",
       " <class 'sage.categories.semigroups.Semigroups.parent_class'>,\n",
       " <class 'sage.categories.magmas.Magmas.parent_class'>,\n",
       " <class 'sage.categories.finite_enumerated_sets.FiniteEnumeratedSets.parent_class'>,\n",
       " <class 'sage.categories.enumerated_sets.EnumeratedSets.parent_class'>,\n",
       " <class 'sage.categories.finite_sets.FiniteSets.parent_class'>,\n",
       " <class 'sage.categories.sets_cat.Sets.parent_class'>,\n",
       " <class 'sage.categories.sets_with_partial_maps.SetsWithPartialMaps.parent_class'>,\n",
       " <class 'sage.categories.objects.Objects.parent_class'>,\n",
       " <type 'object'>]"
      ]
     },
     "execution_count": 95,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "B.__class__.mro()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Side benefits of having categories as first class objects"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "C = Semigroups()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Category of semigroups"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "C"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "S = C.example()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "S??"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "frozenset({'Associative'})"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "C.axioms()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 117,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "frozenset({Category of additive unital additive magmas,\n",
       "           Category of additive magmas,\n",
       "           Category of euclidean domains,\n",
       "           Category of unital magmas,\n",
       "           Category of magmas,\n",
       "           Category of sets with partial maps,\n",
       "           Category of sets})"
      ]
     },
     "execution_count": 117,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "C.structure()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 114,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Category of fields"
      ]
     },
     "execution_count": 114,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "C = Fields(); C"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 116,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "frozenset({Category of additive unital additive magmas,\n",
       "           Category of additive magmas,\n",
       "           Category of euclidean domains,\n",
       "           Category of unital magmas,\n",
       "           Category of magmas,\n",
       "           Category of sets with partial maps,\n",
       "           Category of sets})"
      ]
     },
     "execution_count": 116,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "C.structure()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 115,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "frozenset({'AdditiveAssociative',\n",
       "           'AdditiveCommutative',\n",
       "           'AdditiveInverse',\n",
       "           'AdditiveUnital',\n",
       "           'Associative',\n",
       "           'Commutative',\n",
       "           'Distributive',\n",
       "           'Division',\n",
       "           'NoZeroDivisors',\n",
       "           'Unital'})"
      ]
     },
     "execution_count": 115,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "C.axioms()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 217,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "C = HopfAlgebras(QQ).Graded().Connected().Commutative().WithBasis()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 218,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "frozenset({Category of additive unital additive magmas,\n",
       "           Category of additive magmas,\n",
       "           Category of coalgebras over Rational Field,\n",
       "           Category of filtered modules over Rational Field,\n",
       "           Category of graded modules over Rational Field,\n",
       "           Category of hopf algebras over Rational Field,\n",
       "           Category of left modules over Rational Field,\n",
       "           Category of unital magmas,\n",
       "           Category of magmas,\n",
       "           Category of right modules over Rational Field,\n",
       "           Category of sets with partial maps,\n",
       "           Category of sets})"
      ]
     },
     "execution_count": 218,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "C.structure()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 219,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "frozenset({'AdditiveAssociative',\n",
       "           'AdditiveCommutative',\n",
       "           'AdditiveInverse',\n",
       "           'AdditiveUnital',\n",
       "           'Associative',\n",
       "           'Commutative',\n",
       "           'Connected',\n",
       "           'Distributive',\n",
       "           'Unital',\n",
       "           'WithBasis'})"
      ]
     },
     "execution_count": 219,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "C.axioms()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Operations on categories\n",
    "- Adding an axiom"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Category of commutative magmas"
      ]
     },
     "execution_count": 98,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Magmas().Commutative()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 99,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Category of commutative rings"
      ]
     },
     "execution_count": 99,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Rings().Commutative()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- Intersection"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Category of finite groups"
      ]
     },
     "execution_count": 100,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Groups() & Sets().Finite()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 101,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Category of distributive magmas and additive magmas"
      ]
     },
     "execution_count": 101,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "C = (AdditiveMagmas() & Magmas()).Distributive(); C"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 102,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Category of additive commutative additive associative additive unital distributive magmas and additive magmas"
      ]
     },
     "execution_count": 102,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "C = C.AdditiveAssociative().AdditiveUnital().AdditiveCommutative(); C"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 103,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Category of semirings"
      ]
     },
     "execution_count": 103,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "C = C.Associative().Unital(); C"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 104,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Category of rings"
      ]
     },
     "execution_count": 104,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "C = C.AdditiveInverse(); C"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 105,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Category of division rings"
      ]
     },
     "execution_count": 105,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "C = C.Division(); C"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 106,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Category of finite fields"
      ]
     },
     "execution_count": 106,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "C = C.Finite(); C"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 107,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "frozenset({'AdditiveAssociative',\n",
       "           'AdditiveCommutative',\n",
       "           'AdditiveInverse',\n",
       "           'AdditiveUnital',\n",
       "           'Associative',\n",
       "           'Commutative',\n",
       "           'Distributive',\n",
       "           'Division',\n",
       "           'Finite',\n",
       "           'NoZeroDivisors',\n",
       "           'Unital'})"
      ]
     },
     "execution_count": 107,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "C.axioms()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 108,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "frozenset({Category of additive unital additive magmas,\n",
       "           Category of additive magmas,\n",
       "           Category of euclidean domains,\n",
       "           Category of unital magmas,\n",
       "           Category of magmas,\n",
       "           Category of sets with partial maps,\n",
       "           Category of sets})"
      ]
     },
     "execution_count": 108,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "C.structure()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "SageMath 7.3.beta1",
   "language": "",
   "name": "sagemath"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
