|
|
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: S T
Length: 9503 (0x251f)
Types: TextFile
Names: »SE4_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⟧
-- Christophe MARCHAL : SYSTEME EXPERT QUI REMPLI DES BOITES AVEC DES BRIQUES
-- EN PERDANT LE MINIMUM DE PLACE PUIS CALCULANT LA
-- FACTORIELLE DE 7 ENSUITE ( 2 contextes)
-- VERSION FINALE POLY-PAQUETAGE
-- fichier se4.ada pour version 4 de FADA
with expertSystem; use expertSystem;
package Boites is
type object is record
taille : natural :=1;
remplie : boolean :=FALSE;
end record;
package behavior is new classBehavior(object, "BOXES ");
cBoite : collection.object;
function LesBoites return collection.object ;
function taille(aRef : reference) return natural;
procedure occuper(aRef : reference);
procedure liberer(aRef : reference);
procedure enRoute;
end Boites;
package body Boites is
function BoiteConvient(aRef : reference) return boolean is
begin
return (behavior.get(aRef).remplie = FALSE and
behavior.get(aRef).taille >=50 and
behavior.get(aRef).taille <=200);
end BoiteConvient;
function LesBoites000 is new collection.restrict(BoiteConvient);
function LesBoites return collection.object is
begin
return (LesBoites000(behavior.instances));
end LesBoites;
function taille(aRef : reference) return natural is
begin
return(behavior.get(aRef).taille);
end taille;
procedure occuper(aRef : reference) is
uneBoite : object;
begin
put("Taille de la boite: ");
uneBoite:=behavior.get(aRef);
put(uneBoite.taille);
put_line(" ");
uneBoite.remplie := TRUE;
behavior.set(aRef,UneBoite);
end occuper;
procedure liberer(aRef : reference) is
uneBoite : object;
begin
uneBoite:=behavior.get(aRef);
uneBoite.remplie := FALSE;
behavior.set(aRef,UneBoite);
end liberer;
procedure enRoute is
uneBoite : object;
begin
put_line("Creation de boites vides de differentes tailles");
for i in 7..56 loop
uneBoite.taille := i*6;
behavior.allocate(uneBoite);
end loop;
end enRoute;
end Boites;
with expertSystem; use expertSystem;
package Briques is
type tCouleur is (rose, grise, blanche);
type object is record
taille : natural := 1;
couleur : tCouleur := rose;
emballee : boolean := FALSE;
end record;
package behavior is new classBehavior(object,"BRICK ");
cBrique : collection.object;
function LesBriques return collection.object ;
function taille(aRef : reference) return natural;
procedure emballer(aRef : reference);
procedure enRoute;
end Briques;
package body Briques is
function BriqueConvient(aRef : reference) return boolean is
begin
return (behavior.get(aRef).emballee = FALSE and
behavior.get(aRef).taille >=50 and
behavior.get(aRef).taille <=200);
end BriqueConvient;
function LesBriques000 is new collection.restrict(BriqueConvient);
function LesBriques return collection.object is
begin
return ( LesBriques000(behavior.instances) ) ;
end LesBriques;
function taille(aRef : reference) return natural is
begin
return(behavior.get(aRef).taille);
end taille;
procedure emballer(aRef : reference) is
uneBrique : object;
begin
put("Taille de la brique : ");
uneBrique:=behavior.get(aRef);
put(uneBrique.taille);
put_line(" ");
uneBrique.emballee := TRUE;
behavior.set(aRef,uneBrique);
end emballer;
procedure enRoute is
uneBrique : object;
begin
put_line("Creation de briques de differentes tailles");
put_line("Association au mieux selon la taille...");
for i in 10..30 loop
uneBrique.taille := i*5;
behavior.allocate(uneBrique);
end loop;
end enRoute;
end Briques;
with expertSystem; use expertSystem;
package Nombres is
type object is record
but : natural :=1;
courant : natural :=1;
resultat : natural :=1;
end record;
resInter : natural:=1;
unNombre : object;
refNombreCourant : reference;
function leResultat(c: collection.object) return reference;
function butAtteint return boolean;
procedure continuer;
procedure calculerFact;
procedure afficherFact;
procedure enRoute;
end Nombres;
package body Nombres is
package behavior is new classBehavior(object,"NUMBERS ");
procedure mult(r:reference) is
unNombre : object;
begin
-- effet de bord : resInter augmente
unNombre:=behavior.get(r);
resInter:=resInter * unNombre.courant;
unNombre.resultat:=resInter;
behavior.set(r,unNombre);
end mult;
function dernier(laMeilleure, uneAutre: reference) return boolean is
begin
return ( behavior.get(laMeilleure).resultat
>
behavior.get(uneAutre).resultat) ;
end dernier;
function leResultat000 is new collection.theMost(dernier);
function leResultat(c: collection.object) return reference is
begin
return ( leResultat000(c) );
end leResultat;
-- partage de unNombre entre butAtteint et continuer
function butAtteint return boolean is
begin
unNombre:=behavior.get(refNombreCourant);
return (unNombre.courant = unNombre.but);
end butAtteint;
procedure continuer is
begin
unNombre.courant := unNombre.courant + 1;
refNombreCourant := behavior.allocate(unNombre);
end continuer;
procedure calculFact is new collection.forAll(mult);
procedure calculerFact is
begin
calculFact( behavior.instances );
end calculerFact;
procedure afficherFact is
begin
put_line(" ");
put("Resultat factoriel: ");
refNombreCourant:=leResultat( behavior.instances );
put(behavior.get(refNombreCourant).resultat);
put_line(" ");
end afficherFact;
procedure enRoute is
begin
unNombre.but:=7;
resInter:=1;
refNombreCourant:=behavior.allocate(unNombre);
put_line(" ");
put(" Calcul de factorielle de : ");
put(unNombre.but);
put_line(" ... ");
end enRoute;
end Nombres;
with expertSystem; use expertSystem;
with Briques,Boites,Nombres;
use Briques,Boites,Nombres;
package systExpertSe4 is
procedure enRoute;
function continue return boolean;
end systExpertSe4;
package body systExpertSe4 is
-- les variables internes :
type tContexte is (contexte0, contexte1, contexte2);
contexte: tContexte := contexte0;
-- les variables de l'application :
couples : tupleCollection.object;
coupleIdeal : tuple .object;
-- les fonctions necessaires pour les regles intra-fait :
function caEntre(r1,r2:reference) return boolean is
begin
return (Boites .taille(r1) >
Briques.taille(r2) );
end caEntre;
function apparier is new tupleCollection.join2(caEntre);
function ecartMinimal(leMeilleur, unAutre: tuple.object) return boolean is
begin
return Boites. taille(tuple.first( leMeilleur)) -
Briques.taille(tuple.second(leMeilleur))
<
Boites .taille(tuple.first( unAutre)) -
Briques.taille(tuple.second(unAutre));
end ecartMinimal;
function leMeilleurCouple is new tupleCollection.theMost(ecartMinimal);
-- regles a utiliser dans le contexte 0 :
function regle0 return boolean is
begin
-- domaine d'application des regles 0:
-- si il existe des couples (brique, boite) dans les ensembles de boites et de
-- briques qui sont libres tel que la brique rentre dans la boite alors choisir
-- le couple le mieux adapte (le moins de place perdue) et mettre la brique
-- dans la boite
-- preparation de la condition
-- 1ere restriction : cherche les boites libres
-- cherche les briques libres
-- SI EXISTE BOITES <BO> LIBRES ...
cBoite := LesBoites;
-- SI EXISTE BRIQUES <BR> LIBRES ...
cBrique := LesBriques;
-- on essaye d'apparier 2 a 2
-- SI BOITE <BO> CONVIENT PHYSIQUEMENT AVEC BRIQUE <BR> ...
couples := apparier(cBoite , cBrique,2000);
-- evaluation de la condition :
-- (REGLE 0-A)
-- SI IL NE RESTE PLUS DE PAIRES <BO>,<BR> ALORS CHANGEMENT DE CONTEXTE
if tupleCollection.isNull(couples) then
contexte:=contexte1;
return( TRUE ) ;
end if;
-- REGLE 0-B
-- SI IL Y A DES PAIRES <BO>,<BR> ALORS CHERCHER LA MEILLEUR DE CES PAIRES ...
if not tupleCollection.isNull(couples) then
coupleIdeal := leMeilleurCouple(couples);
-- ET ATTRIBUER L'UN A L'AUTRE ...
put_line(" MEILLEUR COUPLE ACTUEL ");
occuper(tuple.first(coupleIdeal));
emballer(tuple.second(coupleIdeal));
return(TRUE);
end if;
-- REGLE 0-C ...
-- etc ... autres regles du contexte 0
return (FALSE); -- fin des regles de REGLE0
end regle0;
function regle1 return boolean is
begin
-- prepa conditions
-- REGLE 1-A
-- SI BUT NON ATTEINT ALORS CONTINUER VERS LE BUT
if not butAtteint then
continuer;
return ( TRUE );
end if;
-- REGLE 1-B
-- SI BUT ATTEINT ALORS CALCULER LES RESULTATS GLOBAUX PUIS AFFICHER CELUI
-- QUI ETAIT RECHERCHE
if butAtteint then
calculerFact;
afficherFact;
return ( FALSE ); -- fini
end if;
-- REGLE 1-C ...
return (FALSE); -- fin des regles de REGLE 1
end regle1;
-- MISE EN ROUTE DU MOTEUR DU S-E
procedure enRoute is
begin
-- creation des objets : REGLE 0
Boites .enRoute;
Briques.enRoute;
-- creation des objets : REGLE 1
Nombres.enRoute;
end enRoute;
-- ENTRETIENT DU MOTEUR DU S-E
function continue return boolean is
resu : boolean;
begin
case contexte is
when contexte0 => resu:=regle0;
when contexte1 => resu:=regle1;
when others => resu:=FALSE;
end case;
return(resu);
end continue;
end systExpertSe4;
with systExpertSe4;
procedure emballer is
begin
systExpertSe4.enRoute;
loop
exit when not systExpertSe4.continue;
end loop;
end emballer;