Diferencia entre revisiones de «Segundo parcial 24/11/2022 (IngSoft2)»

De Cuba-Wiki
Línea 51: Línea 51:


=== Ejercicio 3 ===
=== Ejercicio 3 ===
==== Una solución clásica al problema de deadlock de los filósofos es que cada filósofo pueda hacer un timeout y devolver su palillo si no consigue su segundo palillo. Modifique el FSP dado a continuación para modelar esta solución clásica. ====
<pre>
FORK = (get -> put -> FORK).
PHIL = (sitdown->left.get->right.get
        ->eat->left.put->right.put
        ->arise->PHIL).
||DINERS(N=5)=
              forall [i:0..N-1]
                    (phil[i]:PHIL ||
                      {phil[i].left,phil[((i-1)+N)%N].right}::FORK
              ).
</pre>
===== Resolución =====
<pre>
const T=10.
TIMER = (right.get->TIMER[N]),
TIMER[0] = (timeout->TIMER),
TIMER[i:1..N]=(left.get->TIMER | tick->TIMER[i-1])\{tick}.
PHIL = (sitdown->right.get->WAIT),
WAIT = (timeout->right.put->arise->PHIL
| left.get->eat->left.put->right.put->arise->PHIL).
FORK = (get -> put -> FORK).
const N = 5.
||DINERS=
forall [i:0..N-1](
  phil[i]:PHIL
|| phil[i]:TIMER
|| {phil[i].left,phil[((i-1)+N)%N].right}::FORK
).
</pre>
=== Ejercicio 4 ===
=== Ejercicio 4 ===
=== Ejercicio 5 ===
=== Ejercicio 5 ===
=== Ejercicio 6 ===
=== Ejercicio 6 ===

Revisión del 17:10 4 dic 2022

Ejercicio 1

a) Dibuje los LTS para AB y ABC

A = (a -> c -> A).
B = (b -> d -> B).

||AB = (A||B)\{c,d}.

C = (c -> C).

||ABC = (AB || C).
Resolución
LTS composición de A y B, con cuatro estados: 0,1,2 y 3. Las transiciones son: 0 a 1 con etiqueta b, 1 a 0 con tau, 1 a 2 con a, 2 a 1 con tau, 2 a 3 con tau, 3 a 2 con b, 0 a 3 con a, y 3 a 0 con tau.
LTS AB - ejercicio 1a 2parcial 2c2022 IngSoft2
LTS composición de AB y C. Igual al de AB, pero con una transición saliente extra por nodo, que sale del nodo y vuelve al mismo nodo con etiqueta c.
LTS ABC - ejercicio 1a 2parcial 2c2022 IngSoft2

b) Proponga un LTS que sea débilmente equivalente a AB pero con menos estados. Demuestre que son equivalentes

Resolución
LTS con un nodo, 0 con dos transiciones salientes hacia sí mismo, con etiquetas a y b.
LTS débilmente bisimilar a AB - ejercicio 1b 2parcial 2c2022 IngSoft2

Para demostrar que son débilmente bisimilaresbasta con dar la relación de bisimilitud: [(0,0), (1,0), (2,0), (3,0)].

(Puede ser difícil ver por qué valen (1,0), (2,0) y (3,0), dejo la justificación de (1,0) a partir de la definición formal, las otras dos son análogas:

Sea Q el LTS de un nodo, 0ab el estado 0 del LTS AB y 0q el estado 0 de Q:
- 1ab -a-> 2ab y  0q =a=> 0q y (2,0) esta en la relacion
-  0q -b-> 0q  y 1ab =b=> 1ab (porque 1 -tau-> 0 -b-> 1) y (1,0) esta en la relacion
-  0q -a-> 0q  y 1ab =a=> 2ab y (2,0) esta en la relacion

)

Ejercicio 2

En el siguiente ejemplo, el proceso TWOCOIN satisface la propiedad de profreso TAILS? Explique.

TWOCOIN = (pick ->COIN | pick ->TRICK).
TRICK = (toss -> heads -> TRICK |
         toss -> heads -> TWOCOIN).
COIN = (toss -> heads -> COIN |
        toss -> tails -> COIN).

progress TAILS = {tails}.
Resolución

La única forma de que TAILS nunca se cumpla es que siempre que estemos en el estado TWOCOIN se elija el camino a TRICK o elijamos la moneda TRICK una vez y de ahí siempre hagamos toss con esa misma moneda. Pero bajo fair choice, sabemos que cuando un estado es visitado infinitas veces, todas sus transiciones salientes también lo son. En las situaciones que mencioné antes, estaríamos visitando TWOCOIN y/o TRICK infinitas veces, por lo que eventualmente se seleccionará la moneda justa (COIN, que contiene tails) y se usará de ahí en más, cumpliendo la propiedad TAILS.

Ejercicio 3

Una solución clásica al problema de deadlock de los filósofos es que cada filósofo pueda hacer un timeout y devolver su palillo si no consigue su segundo palillo. Modifique el FSP dado a continuación para modelar esta solución clásica.

FORK = (get -> put -> FORK).
PHIL = (sitdown->left.get->right.get
        ->eat->left.put->right.put
        ->arise->PHIL).
||DINERS(N=5)= 
               forall [i:0..N-1] 
                    (phil[i]:PHIL ||
                       {phil[i].left,phil[((i-1)+N)%N].right}::FORK
               ).
Resolución
const T=10.
TIMER = (right.get->TIMER[N]),
TIMER[0] = (timeout->TIMER),
TIMER[i:1..N]=(left.get->TIMER | tick->TIMER[i-1])\{tick}.

PHIL = (sitdown->right.get->WAIT),
WAIT = (timeout->right.put->arise->PHIL
		| left.get->eat->left.put->right.put->arise->PHIL).

FORK = (get -> put -> FORK).

const N = 5.
||DINERS=
	forall [i:0..N-1](
	   phil[i]:PHIL 
	|| phil[i]:TIMER
	|| {phil[i].left,phil[((i-1)+N)%N].right}::FORK
	).

Ejercicio 4

Ejercicio 5

Ejercicio 6