Taller. Programas Secuenciales

Anuncio
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
Descargar