File : objets_prolog.ads
1 -- Fichier OBJETS.ADS
2 -- Spécifications du package de manipulation des objets de base PROLOG.
3
4
5 ----------------------------------------------------------------------------------------------------------------------------------
6
7
8 package Objets_Prolog is
9
10
11 ---------------------------------------------
12 -- Les exceptions susceptibles d'etre levées.
13 ---------------------------------------------
14 Table_Doublets_Pleine : exception; -- par CREE_DOUBLET.
15 Table_Carac_Pleine : exception; -- par CREE_SYMBOLE.
16 Table_Symb_Pleine : exception; -- par CREE_SYMBOLE.
17 Table_Var_Pleine : exception; -- par CREE_VARIABLE.
18
19
20 --------------------------------
21 -- Description d'un mot memoire.
22 --------------------------------
23 type Mot is private;
24 subtype Mot_Valeur is Integer;
25
26 function Mot_Nul return Mot;
27
28 ----------------------------------------------------------------------
29 -- Caractéristique des valeurs internes des atomes (entier et chaine).
30 ----------------------------------------------------------------------
31 subtype Type_Nombre is Mot_Valeur; -- La taille des entiers dépend de la taille d'un mot de la mémoire.
32 Longmax_Pname : constant Positive := 255; -- Longueur maximale d'une chaine de p-name.
33 Pname_Buffer : String(1..Longmax_Pname); -- Servira pour les entrées-sorties et pour toute opération sur p-names
34 Pname_Long : Natural; -- Longueur du p-name courant.
35 Pname_Print_Quote : Boolean; -- Flag indiquant s'il faut entourer le p-name par des quotes.
36
37
38 ----------------------------------------------
39 -- Nombre maximum de variables dans une regle.
40 ----------------------------------------------
41 Nbre_Max_Var_Par_Regle : constant := 100;
42
43
44 -------------------------------
45 -- Procedures de mise au point.
46 -------------------------------
47 procedure Put_Mot(Arg : Mot);
48 procedure Debug;
49
50
51 --------------------------------------------------------------------------------------------
52 -- Procédure utilitaire pour appeler une fonction renvoyant un MOT sans récuperer sa valeur.
53 --------------------------------------------------------------------------------------------
54 procedure Call(V : Mot);
55
56
57 ------------------------------------
58 -- Comparaison de deux mots mémoire.
59 ------------------------------------
60 function Egalite_Mot(Obj1, Obj2 : Mot) return Boolean;
61
62
63 ----------------
64 -- Informations.
65 ----------------
66
67 procedure Types_Informations;
68 procedure Informations;
69
70
71 ---------------------------------------------------------
72 -- Fonctions de reconnaissance du type d'un objet PROLOG.
73 ---------------------------------------------------------
74 function Entier(Obj : Mot) return Boolean;
75 function Symbole(Obj : Mot) return Boolean;
76 function Atome(Obj : Mot) return Boolean;
77 function Doublet_V(Obj : Mot) return Boolean;
78 function Doublet_F(Obj : Mot) return Boolean;
79 function Doublet_L(Obj : Mot) return Boolean;
80 function Doublet(Obj : Mot) return Boolean;
81 function Variable(Obj : Mot) return Boolean;
82 function Vect1(Obj : Mot) return Boolean;
83 function Vect2(Obj : Mot) return Boolean;
84 function Func1(Obj : Mot) return Boolean;
85 function Func2(Obj : Mot) return Boolean;
86
87 function Caractere_De_Symbole(C : Character) return Boolean;
88
89 ---------------------------------------
90 -- Fonctions d'acces aux objets PROLOG.
91 ---------------------------------------
92 procedure Symbole_Chaine(Obj : in Mot;
93 Chaine : out String; Long : out Natural;
94 Print_Quote: out Boolean); -- Représentation externe d'un symbole.
95 function Entier_Val(Obj : Mot) return Type_Nombre; -- Renvoie la valeur numérique d'un entier.
96 function Variable_Rang(Obj : Mot) return Type_Nombre; -- Renvoie le rang d'une variable.
97 function Variable_Nom(Ind : Type_Nombre) return Mot; -- Renvoie le symbole correspondant au nom de la variable.
98 function Premier(Obj : Mot) return Mot; -- Correspond au CAR de LISP.
99 function Reste(Obj : Mot) return Mot; -- Correspond au CDR de LISP.
100 function Id_Liste_Regles(Symb : Mot) return Mot; -- Renvoie la liste des regles rattachées au symbole SYMB.
101 function Nbre_De_Variables return Natural; -- Renvoie le nbre de variables crées depuis le dernier RAZ_VARIABLES.
102
103 function Decompose_Entier(N, un_Entier : Mot) return Mot;
104 function Decompose_Symbole(N, un_Symbole : Mot) return Mot;
105 function Decompose_Doublet(N, un_Doublet : Mot) return Mot;
106
107 ----------------------------------------------
108 -- Fonctions de fabrication des objets PROLOG.
109 ----------------------------------------------
110 function Cree_Symbole(Str : String; Print_Quote : Boolean := False) return Mot;
111 function Cree_Variable(Str : String) return Mot;
112 function Cree_Variable(Num : Natural) return Mot;
113 procedure Raz_Variables;
114 function Cree_Entier(Nombre : Type_Nombre) return Mot;
115 function Cree_Doublet_V(Car, Cdr : Mot) return Mot;
116 function Cree_Doublet_F(Car, Cdr : Mot) return Mot;
117 function Cree_Doublet_L(Car, Cdr : Mot) return Mot;
118 function Concatene(Obj1, Obj2 : Mot) return Mot;
119 function Cree_Liste(Obj1 : Mot) return Mot; -- Liste d'un objet
120 function Cree_Liste(Obj1, Obj2 : Mot) return Mot; -- Liste de deux objets
121 function Cree_Liste(Obj1, Obj2, Obj3 : Mot) return Mot; -- Liste de trois objets
122 function Cree_Vecteur(Obj1 : Mot) return Mot; -- Vecteur d'un objet
123 function Cree_Vecteur(Obj1, Obj2 : Mot) return Mot; -- Vecteur de deux objets
124 function Cree_Vecteur(Obj1, Obj2, Obj3 : Mot) return Mot; -- Vecteur de trois objets
125 function Vecteur_Liste(Obj : Mot) return Mot; -- Transformation physique d'un vecteur en liste
126 procedure Id_Liste_Regles(Symb, Liste : Mot); -- Rattache la liste de regles LISTE au symbole SYMB
127
128
129 ---------------------------------------
130 -- Déclaration des expansions en ligne.
131 ---------------------------------------
132 -- pragma INLINE(ENTIER, SYMBOLE, ATOME, DOUBLET_V, DOUBLET_F, DOUBLET_L, DOUBLET, VARIABLE,
133 -- ENTIER_VAL, VARIABLE_RANG,
134 -- PREMIER, RESTE,
135 -- EGALITE_MOT,
136 -- CREE_ENTIER, CREE_DOUBLET_V, CREE_DOUBLET_F, CREE_DOUBLET_L);
137
138
139 private
140
141
142 ---------------------------------------------------------------
143 -- Déclaration des types possibles du contenu d'un mot mémoire.
144 -- ATTENTION !!! Ne pas changer l'ordre des types.
145 ---------------------------------------------------------------
146 type Contenu_Memoire is (Libre, -- Le mot est libre
147 Variable, -- Le mot contient un numéro de variable
148 Symbole, -- Le mot contient un indice faisant référence à la table des symboles
149 Entier, -- Le mot contient un entier
150 Doublet_V, -- Le mot contient une adresse pointant sur un doublet-vecteur
151 Doublet_F, -- Le mot contient une adresse pointant sur un doublet-fonction
152 Doublet_L); -- Le mot contient une adresse pointant sur un doublet-liste
153
154
155 --------------------------------
156 -- Description d'un mot mémoire.
157 --------------------------------
158 type Mot is record
159 T : Contenu_Memoire; -- Le type du mot mémoire
160 Val : Mot_Valeur; -- Le contenu du mot mémoire
161 end record;
162
163
164 end Objets_Prolog