|  | DataMuseum.dkPresents historical artifacts from the history of: Rational R1000/400 Tapes | 
This is an automatic "excavation" of a thematic subset of
 See our Wiki for more about Rational R1000/400 Tapes Excavated with: AutoArchaeologist - Free & Open Source Software. | 
top - metrics - downloadIndex: R T
    Length: 10912 (0x2aa0)
    Types: TextFile
    Names: »ROBOT_ADA«
└─⟦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⟧ 
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;