-
Notifications
You must be signed in to change notification settings - Fork 0
/
sig.mli
146 lines (110 loc) · 3.94 KB
/
sig.mli
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
(** Sigantures utilisées par la bibliothèques *)
(** ordre total sur t, utilisé pour indexer le graphe et type d'étiquettes *)
module type VERTEX = sig
(** Type d'index des noeuds du graphe *)
type t
(** compare deux valeurs {b e1} et {b e2}, renvoit un entier < 0 si {b e1} < {b e2}, nul si égalité et > 0 si {b e1} > {b e2} *)
val compare : t -> t -> int
(** type d'étiquette *)
type label
(** l'étiquette {i vide}, c'est à dire ajoutée à un noeud crée *)
val empty : label
end
(** Des couleurs pour un graphe *)
module type COLOR = sig
(** type de couleur *)
type t
(** couleur vide *)
val empty : t
end
(** Signature d'un noeud étiqueté *)
module type VERT =
sig
(** Type de l'index du noeud dans le graphe *)
type key
(** type de la valeur d'un noeud, *)
type value
(** type d'étiquette *)
type label
val compare : key -> key -> int
(** Prend une étiquette et renvoit un noeud vide pour cette étiquette *)
val empty : value
(** définit l'étiquette d'un noeud *)
val setLabel : value -> label -> value
(** renvoit l'étiquette d'un noeud *)
val getLabel : value -> label
(** Ajoute un successeur au noeud *)
val addSucc : value -> key -> value
(** Enlève le successeur au noeud *)
val removeSucc : value -> key -> value
(** renvoit la liste des successeurs du noeud *)
val getSucc : value -> key list
(** Prend une fonction {b f k: (key -> unit)}, un noeud et applique {b f s1; f s2; ... f sn ;} ou {b s1...sn} sont les successeurs du noeud donné *)
val iterSucc : ( key -> unit ) -> value -> unit
(** Prend une fonction {b f k d : ( key -> 'b -> 'b )}, un noeud, un élément {b d} de type {b 'b} et renvoit (f kN ... (f k1 d) ...) ou {b k1...kN} sont les clés des successeurs du noeud *)
val foldSucc : ( key -> 'b -> 'b ) -> value -> 'b -> 'b
end
(** Sigature minimale d'un graphe *)
module type G =
sig
(** Type des clés indexant les noeuds *)
type key
(** Type d'un noeud *)
type value
(** type abstrait du graphe *)
type t
(** Renvoyée quand le noeud recherché est manquant *)
exception Vertex_missing of key
(** le graphe vide *)
val empty : t
(** Renvoit le nombre de noeuds du graphe *)
val size : t -> int
(** cherche un noeud dans le graphe, renvoit True si existant *)
val mem : t -> key -> bool
(** Un noeud au graphe *
@param g graphe
@param key index du noeud *)
val addVertex : t -> key -> t
(** Modifie la valeur du noeud *)
val setVertex : t -> key -> value -> t
(** Supprime un noeud d'un graphe
@param g graphe
@param key index du noeud *)
val removeVertex : t -> key -> t
(** Supprime une Branche du graphe, @raise Vertex_missing si src n'existe pas
@param g graphe
@param src noeud source
@param dst noeud destination
*)
val removeEdge : t -> key -> key -> t
(** Ajoute une branche au graphe. Si un noeud n'existe pas, il est créé
@param g graphe
@param src neoud source
@param dst noeud destination *)
val addEdge : t -> key -> key -> t
(** Map sur les noeuds *)
val mapVertex : ( value -> value) -> t -> t
val iterVertex : ( key -> value -> unit) -> t -> unit
val foldVertex : ( key -> value -> 'b -> 'b) -> t -> 'b -> 'b
(** Renvoit la valeur du noeud key, @raise Missing_vertex si non existant
@param g graphe
@param key noeud *)
val find : t -> key -> value
end
(** Signature d'un graphe étiquetté *)
module type L = sig
include(G)
(** type d'étiquette du graphe *)
type label
(** Réunit les primitives sur les noeuds *)
module Vertex : (VERT with type key = key and type value = value and type label = label)
(** Renvoit l'étiquette d'un noeud
@param g graphe
@param key noeud *)
val getLabel : t -> key -> label
(** Définit l'étiquette d'un noeud
@param g graphe
@param key noeud
@param label étiquette*)
val setLabel : t -> key -> label -> t
end