DataMuseum.dk

Presents historical artifacts from the history of:

Rational R1000/400 Tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about Rational R1000/400 Tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download
Index: ┃ R T

⟦a265e8c98⟧ TextFile

    Length: 10912 (0x2aa0)
    Types: TextFile
    Names: »ROBOT_ADA«

Derivation

└─⟦a7d1ea751⟧ Bits:30000550 8mm tape, Rational 1000, !users!projects 94_04_11
    └─ ⟦129cab021⟧ »DATA« 
        └─⟦this⟧ 
└─⟦f64eaa120⟧ Bits:30000752 8mm tape, Rational 1000, !projects 93 02 16
    └─ ⟦6f12a12be⟧ »DATA« 
        └─⟦this⟧ 
└─⟦2f6cfab89⟧ Bits:30000547 8mm tape, Rational 1000, !projects 94-01-04
    └─ ⟦d65440be7⟧ »DATA« 
        └─⟦this⟧ 

TextFile


with expertSystem; use  expertSystem;
package Brique is
   subtype tTaille  is natural;
   type    tCouleur is (rose, grise, blanche);
   type    tLieu    is (tas, pince, boite);
   subtype tCase    is positive;
   type    object   is private;
   
   function   lesBriques                       return collection.object;
   function   surTas           (r : reference) return boolean;
   function   dansPince        (r : reference) return boolean;
   function   laPlusGrandeDuTas(r : reference) return boolean;
   function   taille           (r : reference) return tTaille;
   procedure  creer;
   procedure  modifierLieu     (r : reference ; l : tLieu);
   procedure  modifierBoite    (r : reference ; c : tCase);

   private
      type object is record
         taille   : tTaille  :=1;
         couleur  : tCouleur :=rose;
         lieu     : tLieu    :=tas;
         boite    : tCase;
      end record;
end Brique;


with expertSystem ; use expertSystem;
package body Brique is

   package Behavior is new classBehavior(object,"BRIQUES   ");

   function lesBriques return collection.object is 
   begin
  	return Behavior.allInstances;
   end lesBriques;

   function surTas(r : reference) return boolean is
   begin
      return Behavior.get(r).lieu = tas;
   end surTas;

   function dansPince(r : reference) return boolean is
   begin
      return Behavior.get(r).lieu = pince;
   end dansPince;

   function briquesSurTas is new collection.restrict(surTas);

   function plusGrande(r, any : reference) return boolean is
   begin
      return Behavior.get(r).taille > Behavior.get(any).taille;
   end plusGrande;

   function laPlusGrande is new collection.theMost(plusGrande);

   function laPlusGrandeDuTas(r : reference) return boolean is
   begin
      return Behavior.get(r).taille =
        Behavior.get(laPlusGrande(briquesSurTas(Behavior.instances))).taille;
   end laPlusGrandeDuTas;

   function taille(r : reference) return tTaille is
   begin
      return Behavior.get(r).taille;
   end taille;

   procedure creer is
   begin
      for i in 10..30 loop
          behavior.allocate(object'(tTaille(i),rose,tas,tCase(1)));
      end loop;
      put_line(" ");
      put(" Nb briques : ");
      put(Behavior.cardinality);
      put_line("  ");
   end creer;

   procedure modifierLieu(r : reference ; l : tLieu) is
   uneBrique : object;
   begin
      uneBrique := Behavior.get(r);
      uneBrique.lieu := l;
      Behavior.set(r,uneBrique);
   end modifierLieu;

   procedure modifierBoite(r : reference ; c : tCase) is
   uneBrique : object;
   begin
      uneBrique := Behavior.get(r);
      uneBrique.boite := c;
      Behavior.set(r,uneBrique);
   end modifierBoite;
end Brique;


with expertSystem ; use expertSystem;
package Robot is

   type    object is private;
   subtype tNom   is string(1..10);
   type    tTache is (prendre, deposer);
   subtype tCase  is positive;

   function lesRobots                    return collection.object;
   function derniereBoite                return tCase;
   function nom          (r : reference) return tNom;
   function numeroBoite  (r : reference) return tCase;
   function peutPrendre  (r : reference) return boolean;
   function peutDeposer  (r : reference) return boolean;
   function tientBrique  (r : reference) return boolean;

   procedure creer;
   procedure modifierPince(r : reference ; b : boolean);
   procedure modifierTache(r : reference ; a : tTache);
   procedure modifierBoite(r : reference ; c : tCase);
   procedure seSuicide    (r : reference);

   private
      NumeroCourant    : tCase :=1;
      type object is record
          nom          : tNom;
          boite        : tCase;
          tache        : tTache;
          pinceOccupee : boolean :=FALSE;
      end record;
end Robot;


with expertSystem ; use expertSystem;
package body Robot is

   package Behavior is new classBehavior(object,"ROBOTS    ");

   function lesRobots return collection.object is
   begin
      return Behavior.instances;
   end lesRobots;

   function peutPrendre(r : reference) return boolean is
   begin
      return Behavior.get(r).tache = prendre;
   end peutPrendre;

   function peutDeposer(r : reference) return boolean is
   begin
      return Behavior.get(r).tache = deposer;
   end peutDeposer;

   function tientBrique(r : reference) return boolean is
   begin
      return Behavior.get(r).pinceOccupee;
   end tientBrique;

   function nom(r : reference) return tNom is
   begin
      return Behavior.get(r).nom;
   end nom;

   function numeroBoite(r : reference) return tCase is
   begin
      return Behavior.get(r).boite;
   end numeroBoite;

   function derniereBoite return tCase is
   begin
      NumeroCourant := NumeroCourant+1;
      return NumeroCourant-1;
   end derniereBoite;

   procedure creer is
   begin
      behavior.allocate(object'("Robot No 1",1,prendre,FALSE));
      behavior.allocate(object'("Robot No 2",1,prendre,FALSE));
      put(" Nb robots : ");
      put(Behavior.cardinality);
      put_line(" ");
   end creer;

   procedure modifierPince(r : reference ; b : boolean) is
   unRobot : object;
   begin
      unRobot := Behavior.get(r);
      unRobot.pinceOccupee := b;
      Behavior.set(r,unRobot);
   end modifierPince;

   procedure modifierTache(r : reference ; a : tTache) is
   unRobot : object;
   begin
      unRobot := Behavior.get(r);
      unRobot.tache := a;
      Behavior.set(r,unRobot);
   end modifierTache;

   procedure modifierBoite(r : reference ; c : tCase) is
   unRobot : object;
   begin
      unRobot := Behavior.get(r);
      unRobot.boite := c;
      Behavior.set(r,unRobot);
   end modifierBoite;

   procedure seSuicide(r : reference) is
   begin
      Behavior.dispose(r);
   end seSuicide;

end Robot;


-------------------------------------------------------------------------------
--                      DESCRIPTION  DES  REGLES                             --
-------------------------------------------------------------------------------

with expertSystem ; use expertSystem;
with Robot,Brique ; use Robot,Brique;
procedure travailler is

package robotEtBrique is
   procedure miseEnBoite;
end robotEtBrique;

package body robotEtBrique is
   
   function peutMettreEnBoite return boolean is
   begin
       regleSaisir:
          declare
             RB                : tuple.object;
             uneBrique, unRobot: reference;
   
             function match(R, B : reference) return 
             boolean is
             begin 
                return peutPrendre(R)      		and then 
                       not tientBrique(R) 		and then 
                       surTas(B)            		and then
                       laPlusGrandeDuTas(B);
            end match;         

            function robotSaisir is new tupleCollection.join2(match);
            begin
               RB := tupleCollection.first(
                     robotSaisir(lesRobots,lesBriques));

               if tuple.isNotNull(RB) then
                  unRobot   := tuple.first(RB);
                  uneBrique := tuple.second(RB);
                  Robot.modifierPince(unRobot,TRUE);
                  Brique.modifierLieu (uneBrique,pince);

                  put("Le ") ; put(Robot.nom(unRobot));
                  put(" prend la plus grande brique (taille=");
                  put(integer(Brique.taille(uneBrique)));
                  put_line(") du tas dans sa pince ");

                  return TRUE;
               end if;
          end regleSaisir;

          regleTenir:
            declare
               RB      : tuple.object;
               unRobot : reference;
      
            function match(R, B: reference) return 
            boolean is
            begin 
               return peutPrendre(R) 			and then
                      tientBrique(R) 			and then
                      dansPince(B);
            end match;
         
            function robotTenir is new tupleCollection.join2(match);

         begin
            RB := tupleCollection.first(robotTenir(lesRobots,lesBriques));

            if tuple.isNotNull(RB) then
               unRobot := tuple.first(RB);
               Robot.modifierTache(unRobot,deposer);

               put("Le "); put(Robot.nom(unRobot));
               put_line(" va deposer la brique ");

               return TRUE;
            end if;
         end regleTenir;

         regleCaser:
            declare
               RB                 : tuple.object;
               uneBrique, unRobot : reference;
        
               function match(R, B: reference) return 
               boolean is
               begin 
                  return peutDeposer(R) 		and then
                         dansPince(B);
               end match;         

               function robotCaser is new tupleCollection.join2(match);

         begin
            RB := tupleCollection.first(robotCaser(lesRobots,lesBriques));
            if tuple.isNotNull(RB)    then
               unRobot   := tuple.first(RB);
               uneBrique := tuple.second(RB);
               Brique.modifierLieu(uneBrique,boite);
               Robot.modifierTache(unRobot,prendre);
               Robot.modifierBoite(unRobot,Robot.derniereBoite);
               Brique.modifierBoite(uneBrique,Robot.numeroBoite(unRobot));

               put("Le "); put(Robot.nom(unRobot));
               put(" depose la brique dans la case");
               put(integer(Robot.numeroBoite(unRobot))); put_line("");

               Robot.modifierPince(unRobot,FALSE);
               return TRUE;
            end if;
         end regleCaser;

         regleArreter:
            declare
               RB      : tuple.object;
               unRobot : reference;

               function match(R, B: reference) return 
               boolean is
               begin 
                  return peutPrendre(R)			and then
                         not tientBrique(R)  		and then
                         not surTas(B);
               end match;         

               function robotArreter is new tupleCollection.join2(match);

         begin
            RB := tupleCollection.first(robotArreter(lesRobots,lesBriques));

            if not tuple.isNull(RB) then
               unRobot := tuple.first(RB);

               put("Le "); put(Robot.nom(unRobot));
               put_line(" se suicide (plus de briques)");

               Robot.seSuicide(unRobot);
               return TRUE;
            end if;
         end regleArreter;
      return FALSE;
   end peutMettreEnBoite;

   procedure mettreEnBoite is
   begin
      loop
         exit when not peutMettreEnBoite;
      end loop;
   end mettreEnBoite;

   procedure miseEnBoite is
   begin
      Robot.creer;
      Brique.creer;
      loop
         mettreEnBoite;
         -- autres contextes a traiter
         exit;
      end loop;
   end miseEnBoite;

end robotEtBrique;


begin
   robotEtBrique.miseEnBoite;
end travailler;