Commit 972dde8c authored by Guillaume Sabbagh's avatar Guillaume Sabbagh
Browse files

Catégorie Préordre transformée

parent 9f611e88
......@@ -226,13 +226,7 @@ class CategorieDiscrete(Categorie):
def __hash__(self):
return hash(self.source)
def __call__(self,*args):
if len(args) == 1:
# on doit renvoyer l'identité de a
return CategorieDiscrete.Identite(args[0])
if len(args) > 2:
raise Exception("Categorie __call__ : plus de deux arguments passés")
source,cible = args
def __call__(self,source,cible):
if source in self.objets:
# source est de type a
source = {source}
......
......@@ -50,23 +50,14 @@ class CategorieLibre(Categorie):
# raise Exception("Incoherence CategorieLibre : le(s) morphisme(s) entrant(s) "+str(self.morph_entrants(obj)-{m for m in self(self.objets,self.objets) if len(m) == 1})+\
# "n'est pas un morphisme de la catégorie")
def __call__(self,*args):
def __call__(self,source,cible):
"""Soit C est une catégorie:
C({a_i},{b_i}) renvoie l'ensemble des flèches d'un élément de {a_i} vers un élément de {b_i}
C({a_i},b) renvoie l'ensemble des flèches d'un élément de {a_i} vers b
C(a,{b_i}) renvoie l'ensemble des flèches de a vers un élément de {b_i}
C(a,b) renvoie l'ensemble des flèches de a vers b,
C(a) renvoie l'identité de a.
C(a,b) renvoie l'ensemble des flèches de a vers b.
Pour la catégorie libre, on doit énumérer tous les chemins et les composer.
"""
if len(args) == 1:
# on doit renvoyer l'identité de a
if args[0] not in self.identites:
raise Exception("Categorie __call__ : tentative de recuperer l'identite d'un objet qui n'est pas dans la catégorie")
return self.identites[args[0]]
if len(args) > 2:
raise Exception("Categorie __call__ : plus de deux arguments passés")
source,cible = args
if source in self.objets:
# source est de type a
source = {source}
......
from Categorie import Categorie
from Diagramme import DiagrammeIdentite
from copy import copy
from Morphisme import Morphisme
class CategoriePreordre(Categorie):
"""Catégorie pré-ordre engendré par une catégorie.
Les morphismes et les objets sont partagés avec la catégorie originale (shallow copy)."""
class MorphismePreordre(Morphisme):
"""
Il n'y a qu'un seul morphisme pré-ordre entre deux objets d'une catégorie pré-ordre.
"""
def __init__(self,source,cible,representant=None):
Morphisme.__init__(self,source,cible,representant,source==cible)
def __eq__(self,other):
return issubclass(type(self),type(other)) and self.source == other.source and self.cible == other.cible
def __hash__(self):
return hash((self.source,self.cible))
def __matmul__(self,other):
"""
self @ other <=> self o other
"""
if not issubclass(type(other),MorphismePreordre):
raise Exception("Composition d'un morphisme pre-ordre avec un morphisme de type different : "+str(self)+" o "+str(other))
return MorphismePreordre(other.source,self.cible,str(self)+'o'+str(other))
def __new__(cls, cat):
instance = copy(cat)
instance.nom = "Catégorie pré-ordre engendré par " + str(cat.nom)
diag = DiagrammeIdentite(instance)
diag.faire_commuter()
return instance
class CategoriePreordre(Categorie):
"""
Il n'y a qu'un seul morphisme pré-ordre entre deux objets d'une catégorie pré-ordre.
"""
def __call__(self,source,cible):
if source in self.objets:
# source est de type a
source = {source}
if cible in self.objets:
# cible est de type b
cible = {cible}
#maintenant tout est de la forme {a_i} vers {b_i}
return {MorphismePreordre(a,b) for a in source for b in cible}
def identite(self,objet):
return MorphismePreordre(objet,objet,'Id'+str(objet))
def test_CategoriePreordre():
cat = CategoriePreordre()
cat += set("ABCDEF")
MPO = MorphismePreordre
f,g,h,i,j,k,l,m = [MPO('A','B','f'),MPO('C','D','g'),MPO('D','E','h'),MPO('E','A','i'),
MPO('F','D','j'),MPO('F','E','k'),MPO('D','B','l'),MPO('B','E','m')]
cat += {f,g,h,i,j,k,l,m}
cat.transformer_graphviz()
cat.transformer_graphviz()
def main():
from Morphisme import Morphisme
cat = Categorie("Test comptage composees")
cat.ajouter_objets("ABCDE")
f, g, h, i, j, k, l, m = [Morphisme('A', 'B', 'f'), Morphisme('A', 'E', 'g'), Morphisme('A', 'E', 'h'),
Morphisme('B', 'E', 'i'),
Morphisme('C', 'D', 'j'), Morphisme('B', 'E', 'k'), Morphisme('C', 'A', 'l'),
Morphisme('D', 'E', 'm')]
cat.ajouter_morphismes([f, g, h, i, j, k, l, m])
cat.transformer_graphviz()
cat2 = CategoriePreordre(cat)
cat2.transformer_graphviz()
test_CategoriePreordre()
if __name__ == '__main__':
......
......@@ -43,7 +43,7 @@ class Foncteur(Morphisme.Morphisme):
def __matmul__(self,other):
"""
self @ other
self @ other <=> self o other
"""
if not issubclass(type(other),Foncteur):
raise Exception("Composition d'un foncteur avec un morphisme de type different : "+str(self)+" o "+str(other))
......
......@@ -68,7 +68,7 @@ class MorphismeGrapheDeComposition(Morphisme):
def __matmul__(self,other):
"""
self @ other
self @ other <=> self o other
"""
if TOUJOURS_VERIFIER_COHERENCE_COMPOSEE:
MorphismeGrapheDeComposition.verifier_coherence()
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment