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