Foncteur.py 3.75 KB
Newer Older
Guillaume Sabbagh's avatar
Guillaume Sabbagh committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#!/usr/bin/env python
# -*- coding: utf-8 -*-

class Foncteur:


    def __init__(self, categorie_source, categorie_cible, application_objets, application_morphismes):
        """application_objets doit être complète, application_morphismes peut omettre les identités sur identités"""
        self.cat_source = categorie_source
        self.cat_cible = categorie_cible
        self.app_objets = application_objets
        self.app_morph = application_morphismes
        for obj in self.cat_source.objets:
            self.app_morph[self.cat_source.identites[obj]] = self.cat_cible.identites[self.app_objets[obj]]
        
        
        self.verifier_coherence()
        
    def verifier_coherence(self):
        for o in self.cat_source.objets:
            if o not in self.app_objets:
                raise Exception("Incoherence foncteur : l'application d'objet n'est pas une application, "+str(o)+" n'a pas d'image")
        for m in self.cat_source.morphismes:
            if m not in self.app_morph:
                raise Exception("Incoherence foncteur : l'application de morphismes n'est pas une application, "+str(m)+" n'a pas d'image")
       
        ##respect de l'identite
        for objet in self.cat_source.objets:
            if self.app_morph[self.cat_source.identites[objet]] != self.cat_cible.identites[self.app_objets[objet]]:
                raise Exception("Incoherence foncteur : l'image de l'identite de "+str(objet)+" ("+str(self.cat_source.identites[objet])+\
                ") n'est pas l'identite de l'image de l'objet ("+str(self.cat_cible.identites[self.app_objets[objet]])+")")
        
        ##respect de la composition
        for couple in self.cat_source.loi_de_composition:
            if self.cat_cible.loi_de_composition[(self.app_morph[couple[0]],self.app_morph[couple[1]])] != \
                self.app_morph[self.cat_source.loi_de_composition[couple]]:
                raise Exception("Incoherence foncteur : il n'y a pas le respect de la composition, F("+str(couple[0])+" o "+str(couple[1])+") != F("+str(self.app_morph[couple[0]])+") o' F("+str(self.app_morph[couple[1]])+")")
    
    def pretty_print(self):
        result = "Categorie source\n ===========\n"+self.cat_source.pretty_print()+"Categorie cible\n ============ \n"+self.cat_cible.pretty_print()
        result += "Application objets\n===========\n"
        for obj in self.app_objets:
            result += str(obj)+" -> "+str(self.app_objets[obj])+"\n"
        result += "Application morphismes\n===========\n"
        for morph in self.app_morph:
            result += str(morph)+" -> "+str(self.app_morph[morph])+"\n"
        return result
        
    
def main():
    from Categorie import Categorie
    from Morphisme import Morphismes
    
    triangle = Categorie()
    triangle.ajouter_objets(['A','B','C'])
    
    morphismes_triangle = Morphismes()
    morphismes_triangle.ajouter_morphisme('f','A','B')
    morphismes_triangle.ajouter_morphisme('g','B','C')
    morphismes_triangle.ajouter_morphisme('h','A','C')
    triangle.ajouter_morphismes(morphismes_triangle,{('f','g'):'h'})
    
    carre = Categorie()
    carre.ajouter_objets([1,2,3,4])

    morphismes_carre = Morphismes()    
    morphismes_carre.ajouter_morphisme('f',1,2)
    morphismes_carre.ajouter_morphisme('g',1,3)
    morphismes_carre.ajouter_morphisme('h',2,3)
    morphismes_carre.ajouter_morphisme('i',2,4)
    morphismes_carre.ajouter_morphisme('j',3,4)
    morphismes_carre.ajouter_morphisme('k',1,4)
    carre.ajouter_morphismes(morphismes_carre,{('f','h'):'g',('f','i'):'k',('g','j'):'k',('h','j'):'i'})
    
    app_obj = {'A':1,'B':2,'C':3}
    app_morph = {'f':'f','g':'h','h':'g'}
    diagramme = Foncteur(triangle, carre, app_obj, app_morph)
    
    print(diagramme.pretty_print())
    
if __name__ == '__main__':
    main()