Taller. Programas Secuenciales Carlos Olarte 29 de marzo de 2012 El Problema Una estrella famosa es alguien a quien todos conocen (menos ella misma), pero que no conoce a nadie (o pretende no conocer a nadie). Suponga que tiene n personas y una estructura de datos apropiada con la información de quién conoce a quién. Tenga en cuenta que si p1 conoce a p2, no necesariamente p2 conoce a p1. Se trata de desarrollar formalmente un programa que decida si entre esas n personas hay o no hay una estrella famosa. Especificación Pre: axm1 : n ∈ N1 axm2 : know ∈ 1 .. n × 1 .. n → {0 , 1 } Pos: ans = 1 ⇔ ∃x·(x ∈ 1 .. n∧ (∀y·(y ∈ 1 .. n \ {x}⇒ know(y 7→ x) = 1 know(x 7→ y) = 0))) CONTEXT CelebrityC1 CONSTANTS n know AXIOMS axm1 : n ∈ N1 axm2 : know ∈ 1 .. n × 1 .. n → {0 , 1 } END MACHINE SEES CelebrityM1 CelebrityC1 VARIABLES ans INVARIANTS inv1 : ans ∈ {0 , 1 } EVENTS Initialisation begin act1 : ans := 0 end Event final1 = b when grd1 : ∃x ·(x ∈ 1 .. n ∧ (∀y ·(y ∈ (1 .. n \ {x }) ⇒ know (y 7→ x ) = 1 ))) then act1 : ans := 1 end Event final2 = b when grd1 : ¬(∃x ·(x ∈ 1 .. n ∧ (∀y ·(y ∈ (1 .. n \ {x }) ⇒ know (y 7→ x ) = 1 )))) then act1 : ans := 0 end Event progress = b Status anticipated begin skip end END El Proceso Recorrer la matriz de arriba a abajo y de izquierda a derecha. Dos Variables: i (filas), j (columnas) Éxito: i = n y (j = i ∨ (know(i 7→ j) = 1 ∧ know(j 7→ i) = 0 )) Fracaso: j = n y se encontró un 0 en las columnas o un 1 en las filas cuando i 6= j. Avance: i < n y j = i o hay un uno en las columnas y un cero en las filas. Invariante inv2 : i ∈ 1 .. n inv3 : j ∈ 1 .. n inv4 : ∀k ·(k ∈ 1 .. j − 1 ⇒ ∃y ·(y ∈ (1 .. n \ {k }) ∧ (know (y 7→ k ) = 0 ∨ know (k 7→ y ) = 1 ))) inv5 : ∀k ·(k ∈ (1 .. i − 1 ) \ {j } ⇒ (know (k 7→ j ) = 1 ∧ know (j 7→ k ) = 0 )) Variant n2 − ((j − 1) × n + i) MACHINE CelebrityR1 ref CelebrityM1 sees CelebrityC1 EVENTS Initialisation begin act2 : i , j := 1 , 1 end Event final1 extends final1 = b when grd2 : i = n ∧ (j = i ∨ know (i 7→ j ) = 1 ) then act1 : ans := 1 end Event final2 extends final2 = b when grd2 : j = n ∧ i < n ∧ know (i 7→ j ) = 0 then act1 : ans := 0 end Event progress1 extends progress = b Status anticipated when grd1 : i < n ∧ (know (i 7→ j ) = 1 ∨ i = j ) then act1 : i := i + 1 end Event progress2 extends progress = b Status anticipated when grd1 : j < n ∧ i ≤ n ∧ i 6= j ∧ know (i 7→ j ) = 0 then act1 : i , j := 1 , j + 1 end END Proofs (progress1/inv5/INV) 1. Considere la prueba de la conjunción (no su simplificación). 2. Caso k ∈ 1..i − 1 \ {j}. Deberı́a ser sencillo por las hipótesis. Recuerde seleccionar solamente las hipótesis que necesita. 3. Caso k = i (note que k = i no aparece como hipótesis pero se puede deducir. Seleccione las hipótesis adecuadas para que P 0 pruebe este subgoal). 4. Tenemos una disyunción como hipótesis: a) Caso k(i 7→ j) = 1 ∧ k(k 7→ i) = 0: Trivial. b) Caso i = j: Trivial (note que las hipótesis son contradictorias!) Proofs (progress2/inv4/INV) 1. Caso (k ∈ 1..j − 1): Deberı́a ser sencillo por las hipótesis (seleccione las adecuadas para que p0 pruebe el subgoal). 2. Caso (k = j). Note que k = j no aparece como hipótesis pero se puede deducir. Seleccione las hipótesis adecuadas para que P 0 pruebe este subgoal. Seleccione las hipótesis adecuadas. Haga una prueba por casos en la disyunción de la hipótesis. P 1 termina el trabajo. Meseta en una secuencia Asuma una secuencia ordenada y no vacı́a s. Una meseta en s es una porción contigua que tiene todos los elementos iguales, e.g., s= 1 5 5 5 7 7 8 9 9 La longitud de una meseta es el número de elementos en ella. Para la meseta del ejemplo, la longitud es igual a 3. Calcule la longitud de la meseta más grande de la secuencia