Added upstream from http://ftp.icm.edu.pl/pub/loglan/
[loglan.git] / examples / process / philos.log
1 program PHILO;\r
2 \r
3 (*----------------------------------------------------------------*)\r
4 (*----------------------------------------------------------------*)\r
5 (*               PROGRAMME SIMULANT LE PROBLEME                   *)\r
6 (*              DES PHILOSOPHES ET DES SPAGHETTIS                 *)\r
7 (*----------------------------------------------------------------*)\r
8 (*----------------------------------------------------------------*)\r
9 \r
10 \r
11  UNIT ecran : IIUWGRAPH PROCESS (n:integer);\r
12  (*--------------------------------------------*)\r
13  (* - -     PROCESSUS SIMULANT L'ECRAN     - - *)\r
14  (*--------------------------------------------*)\r
15   VAR k :integer;\r
16 \r
17   (*---------------------------------------------------*)\r
18   (* PROCEDURE permettant d'utiliser le mode GRAPHIQUE *)\r
19   (*---------------------------------------------------*)\r
20   UNIT initgraph : PROCEDURE;\r
21    BEGIN\r
22      CALL GRON(1);\r
23    END initgraph;\r
24 \r
25   (*---------------------------------------------------*)\r
26   (* PROCEDURE permettant de fermer le mode GRAPHIQUE  *)\r
27   (*---------------------------------------------------*)\r
28   UNIT closegraph : PROCEDURE;\r
29    BEGIN\r
30      CALL GROFF;\r
31    END closegraph;\r
32 \r
33   (*----------------------------------------------------------------*)\r
34   (* AFFICHAGE en (x,y) d'un RECTANGLE de longueur l et de hauteur h *)\r
35   (*-----------------------------------------------------------------*)\r
36   UNIT rectangle : PROCEDURE(x,y,l,h : INTEGER);\r
37    BEGIN\r
38     CALL MOVE (x,y);\r
39     CALL DRAW (x+l,y);\r
40     CALL DRAW(x+l,y+h);\r
41     CALL DRAW(x,y+h);\r
42     CALL DRAW(x,y);\r
43    END rectangle;\r
44 \r
45 \r
46   (*--------------------------------------------------------------------*)\r
47   (* ECRITURE d'une CHAINE de caracteres sur l'ecran graphique en (x,y) *)\r
48   (*--------------------------------------------------------------------*)\r
49   UNIT ecrit_text : PROCEDURE(xy,x,y : INTEGER;str : string);\r
50    VAR ch : ARRAYOF CHARACTER,\r
51        lg,i : INTEGER;\r
52    BEGIN\r
53     call color (xy);\r
54     CALL move (x,y);\r
55     ch := UNPACK(str);\r
56     lg := UPPER(ch) - LOWER(ch) + 1;\r
57     FOR i := 1 TO lg DO\r
58       CALL HASCII(0);\r
59       CALL HASCII(ORD(ch(i)));\r
60     OD;\r
61    END;\r
62 \r
63   (*---------------------------------*)\r
64   (* LECTURE d'une touche au clavier *)\r
65   (*---------------------------------*)\r
66   UNIT inchar : FUNCTION : INTEGER;\r
67    VAR i : INTEGER;\r
68    BEGIN\r
69     DO\r
70       i := INKEY;\r
71       IF i =/= 0 THEN EXIT;\r
72       FI;\r
73     OD;\r
74     result := i;\r
75    END inchar;\r
76 \r
77 \r
78 \r
79   UNIT finir : PROCEDURE;\r
80    var car : integer;\r
81    BEGIN\r
82     k:=k+1;\r
83     IF k = 5\r
84       THEN call color(4);\r
85            CALL ecrit_text (12,500,320,"TOUCHE");\r
86            car:= inchar;\r
87            (* FERMETURE DU MODE GRAPHIQUE *)\r
88            CALL closegraph;\r
89            CALL endrun;\r
90     FI;\r
91    END finir;\r
92 \r
93   BEGIN\r
94     RETURN;\r
95     DO\r
96       ACCEPT initgraph,closegraph,rectangle,ecrit_text,inchar,finir;\r
97     OD;\r
98   END ecran;\r
99 \r
100 (*-------------------------------------------------------------------------*)\r
101 \r
102 UNIT philosophe:PROCESS(node,nr,x,y:integer,gardien:garde,fourl,\r
103                         fourr:fourchette,e:ecran);\r
104   (*-------------------------------------------------*)\r
105   (* - -     PROCESSUS SIMULANT UN PHILOSOPHE    - - *)\r
106   (*-------------------------------------------------*)\r
107 \r
108  var i,fin,car : integer, bol,bor:boolean;\r
109 \r
110   BEGIN\r
111    RETURN;\r
112    fin:=1;\r
113 \r
114    (* TANT QUE LE PHILOSOPHE N'EST PAS RENTRE 4 FOIS DANS LA SALLE *)\r
115    WHILE (fin<=4)\r
116     DO\r
117 \r
118      (* 1ER TEMPS IL PENSE *)\r
119      CALL e.ecrit_text (14,x,y,"PENS");\r
120      FOR i:=1 TO 80\r
121       DO\r
122       OD;\r
123 \r
124      (* 2 EME TEMPS IL DEMANDE AU GARDIEN L'AUTORISATION POUR RENTRER *)\r
125      CALL gardien.entree;\r
126      CALL e.ecrit_text (10,x,y,"ENTR");\r
127 \r
128      (* 3EME TEMPS IL PREND LA FOURCHETTE DE GAUCHE ET LA CELLE DE DROITE *)\r
129      WHILE ((NOT bol) OR (NOT bor))\r
130       DO\r
131        IF (not bol) THEN\r
132             CALL fourl.prendre(bol);\r
133             IF bol THEN CALL e.ecrit_text (11,x,y,"FGAU"); FI;\r
134        FI;\r
135        IF (not bor) THEN\r
136         CALL fourr.prendre(bor);\r
137         IF bor THEN CALL e.ecrit_text (11,x,y,"FDRO"); FI;\r
138        FI;\r
139       OD;\r
140 \r
141      (* 4EME TEMPS IL MANGE PENDANT UN TEMPS FINI *)\r
142      CALL e.ecrit_text (12,x,y,"MANG");\r
143 \r
144      FOR i:=1 TO 40\r
145       DO\r
146       OD;\r
147 \r
148      (* 5EME TEMPS IL DEPOSE LES FOURCHETTES *)\r
149      CALL fourl.poser(bol);\r
150      CALL fourr.poser(bor);\r
151      CALL e.ecrit_text (13,x,y,"LIBE");\r
152 \r
153      (* 6EME TEMPS IL SORT DE LA SALLE *)\r
154      CALL gardien.sortie;\r
155      CALL e.ecrit_text (14,x,y,"SORT");\r
156      fin:=fin+1;\r
157    OD;\r
158 \r
159    (* ENFIN IL VA SE COUCHER *)\r
160    CALL e.ecrit_text (9,x,y,"DORT");\r
161    CALL e.finir;\r
162   END philosophe;\r
163 \r
164 (*-------------------------------------------------------------------------*)\r
165 \r
166   UNIT garde : PROCESS(node : integer,level : integer);\r
167   (*-------------------------------------------------*)\r
168   (* - -     PROCESSUS SIMULANT LE GARDIEN       - - *)\r
169   (*-------------------------------------------------*)\r
170     UNIT entree : PROCEDURE;\r
171     (*-------------------------------------------*)\r
172     (* PROCEDURE permettant de gerer les entrees *)\r
173     (*        dans la SALLE A MANGER             *)\r
174     (*-------------------------------------------*)\r
175      BEGIN\r
176        IF level > 0 THEN\r
177             level := level - 1;\r
178             IF level = 0 THEN\r
179                return DISABLE entree;\r
180             FI;\r
181        FI;\r
182      END entree;\r
183 \r
184     UNIT sortie : PROCEDURE;\r
185     (*-------------------------------------------*)\r
186     (* PROCEDURE permettant de gerer les sorties *)\r
187     (*          de la SALLE A MANGER             *)\r
188     (*-------------------------------------------*)\r
189      BEGIN\r
190          level:=level+1;\r
191          return ENABLE entree;\r
192      END sortie;\r
193 \r
194     BEGIN\r
195      ENABLE entree,sortie;\r
196      RETURN;\r
197      DO\r
198 \r
199      OD;\r
200     END garde;\r
201 \r
202 (*-------------------------------------------------------------------------*)\r
203 \r
204   UNIT fourchette : PROCESS (node : integer);\r
205   (*-------------------------------------------------*)\r
206   (* - -     PROCESSUS SIMULANT UNE FOURCHETTE   - - *)\r
207   (*-------------------------------------------------*)\r
208 \r
209    var aux : boolean;\r
210 \r
211     UNIT prendre : PROCEDURE (output bo : boolean);\r
212     (*---------------------------------------------------*)\r
213     (* PROCEDURE retournant un booleen qui indique si la *)\r
214     (*     fourchette qui est demandee est disponible    *)\r
215     (*---------------------------------------------------*)\r
216      BEGIN\r
217       IF aux THEN\r
218         bo := true;\r
219         aux := false;\r
220        ELSE\r
221         bo:= false;\r
222       FI;\r
223      END prendre;\r
224 \r
225     UNIT poser : PROCEDURE (output b : boolean);\r
226     (*---------------------------------------------------*)\r
227     (* PROCEDURE permettant de rendre disponible  la     *)\r
228     (*                    fourchette                     *)\r
229     (*---------------------------------------------------*)\r
230      BEGIN\r
231       aux := true;\r
232       b:= false;\r
233      END poser;\r
234 \r
235     BEGIN\r
236      aux := true;\r
237      ENABLE prendre,poser;\r
238      RETURN;\r
239      DO\r
240 \r
241      OD;\r
242     END fourchette;\r
243 \r
244 \r
245 (*-------------------------------------------------------------------------*)\r
246 \r
247 \r
248    var\r
249    i,j:integer,                (* Variable de travail et Indice de tableau *)\r
250    gardien : garde,            (* Gardien de la salle a manger             *)\r
251    f : arrayof fourchette,     (* Tableau des cinq processus fourchettes   *)\r
252    f0:fourchette,              (* Variable intermediaire permettant de     *)\r
253                                (*     remplir le tableau precedent         *)\r
254    ph : arrayof philosophe,    (* Tableau des cinq processus philosophe    *)\r
255    ph0:philosophe,             (* Variable intermediaire permettant de     *)\r
256                                (*     remplir le tableau precedent         *)\r
257    e:ecran,                    (* Variable de type processus ECRAN         *)\r
258    car:integer;                (* Variable de travail pour une attente     *)\r
259                                (*     avant la suite de deroulement du     *)\r
260                                (*                 programme                *)\r
261 \r
262 \r
263 (*-------------------------------------------------------------------------*)\r
264 \r
265  BEGIN\r
266 \r
267     (* CREATION DU PROCESSUS ECRAN *)\r
268     e:=NEW ecran(0);\r
269 \r
270     (* PROCESSUS ECRAN RENDU ACTIF *)\r
271     RESUME (e);\r
272 \r
273     (* OUVERTURE DE L'ENVIRONEMENT GRAPHIQUE *)\r
274     CALL e.initgraph;\r
275 \r
276     (* EFFACEMENT DE L'ECRAN *)\r
277     CALL e.cls;\r
278 \r
279     (* AFFICHAGE DE LA PRESENTATION *)\r
280     CALL e.rectangle (1,1,635,348);\r
281     CALL e.rectangle (100,50,435,100);\r
282     CALL e.ecrit_text (15,160,95,"LES 5 PHILOSOPHES ET LES SPAGHETTIS");\r
283     CALL e.ecrit_text (15,140,200,"PROGRAMME REALISE PAR CHASTANET STEPHANIE");\r
284     CALL e.ecrit_text (15,160,300, "<TAPER SUR UNE TOUCHE POUR CONTINUER>");\r
285     car:=e.inchar;\r
286 \r
287     (* AFFICHAGE DE LA SALLE A MANGER ET DE LA DISPOSITION DES PHILOSOPHES *)\r
288     CALL e.cls;\r
289     CALL e.rectangle(1,1,600,348);\r
290     CALL e.ecrit_text(15,245,15,"LA SALLE A MANGER");\r
291     CALL e.CIRB(300,170,170,0,0,1,1,1,1);\r
292     CALL e.color(1);\r
293     CALL e.cirb(215,90,25,0,0,1,1,1,1);\r
294     CALL e.color(3);\r
295     CALL e.ecrit_text(15,160,70,"1");\r
296     CALL e.color(1);\r
297     CALL e.cirb(165,200,25,0,0,1,1,1,1);\r
298     CALL e.color(3);\r
299     CALL e.ecrit_text(15,110,200,"2");\r
300     CALL e.color(1);\r
301     CALL e.cirb(390,90,25,0,0,1,1,1,1);\r
302     CALL e.color(3);\r
303     CALL e.ecrit_text(15,430,70,"5");\r
304     CALL e.color(1);\r
305     CALL e.cirb(435,200,25,0,0,1,1,1,1);\r
306     CALL e.color(3);\r
307     CALL e.ecrit_text(15,470,200,"4");\r
308     CALL e.color(1);\r
309     CALL e.cirb(300,270,25,0,0,1,1,1,1);\r
310     CALL e.color(3);\r
311     CALL e.ecrit_text(15,295,300,"3");\r
312 \r
313     (* AFFICHAGE DU GARDIEN *)\r
314     CALL e.color(15);\r
315     CALL e.cirb(615,92,5,0,0,1,1,1,1);\r
316     CALL e.move (615,100);\r
317     CALL e.draw (615,125);\r
318     CALL e.move (610,110);\r
319     CALL e.draw (620,110);\r
320 \r
321     (* CREATION D'UN PROCESSUS GARDIEN *)\r
322     gardien := NEW garde(0,4);\r
323 \r
324     (* DECLARATION ET CREATION DU TABLEAU DES PROCESSUS PHILOSOPHES *)\r
325     ARRAY ph DIM (1:5);\r
326 \r
327     (* DECLARATION ET CREATION DU TABLEAU DES PROCESSUS FOURCHETTES *)\r
328     ARRAY f DIM (0:4);\r
329 \r
330     (* INITIALISATION DU TABLEAU DES PROCESSUS FOURCHETTES *)\r
331     FOR i:= 0 TO 4\r
332      DO\r
333 \r
334       (* CREATION D'UN PROCESSUS FOURCHETTE *)\r
335       f0 := NEW fourchette(0);\r
336       f(i) :=f0;\r
337 \r
338       (* PROCESSUS FOURCHETTE RENDU ACTIF *)\r
339       RESUME (f(i));\r
340      OD;\r
341 \r
342     (* PROCESSUS GARDIEN RENDU ACTIF *)\r
343     RESUME (gardien);\r
344 \r
345     (* POUR LES 5 PROCESSUS PHILOSOPHES, CREATION DU PROCESSUS *)\r
346     i:=1;\r
347     ph0 := NEW philosophe (0,1,120,70,gardien,f(i-1),f(i mod 5),e);\r
348     ph(1) := ph0;\r
349     i:=2;\r
350     ph0 := NEW philosophe (0,2,70,200,gardien,f(i-1),f(i mod 5),e);\r
351     ph(2) := ph0;\r
352     i:=3;\r
353     ph0 := NEW philosophe (0,3,290,320,gardien,f(i-1),f(i mod 5),e);\r
354     ph(3) := ph0;\r
355     i:=4;\r
356     ph0 := NEW philosophe (0,4,500,200,gardien,f(i-1),f(i mod 5),e);\r
357     ph(4) := ph0;\r
358     i:=5;\r
359     ph0 := NEW philosophe (0,5,460,70,gardien,f(i-1),f(i mod 5),e);\r
360     ph(5) := ph0;\r
361 \r
362     (* POUR CHAQUE PROCESSUS PHILOSOPHE DU TABLEAU *)\r
363     FOR i:=1 TO 5\r
364      DO\r
365       FOR j:=1 TO 700 DO  OD;\r
366 \r
367       (* PROCESSUS PHILOSOPHE RENDU ACTIF *)\r
368       RESUME (ph(i));\r
369      OD;\r
370 \r
371  END PHILO.\r
372 \1a