Академический Документы
Профессиональный Документы
Культура Документы
de los elementos de la tabla son todas ellas positivas y la suma de todos sus
elementos es cero. El problema a resolver se especifica del modo siguiente:
El algoritmo que derives habrá de contar con una única composición itera-
tiva.
t[1] = 4 ≥ 0
t[1] + t[2] = 6 ≥ 0
t[1] + t[2] + t[3] = 0 ≥ 0
t[1] + t[2] + t[3] + t[4] = 3 ≥ 0
t[1] + t[2] + t[3] + t[4] + t[5] = 0 ≥ 0
Tenemos que:
1
t[1] + t[2] + t[3] + t[4] + t[5] = 4 6= 0
Si tomamos la P P {P ost ≡ t = T ∧ b =
postcondición de la especificación
((∀ i : 1 ≤ i ≤ N : ( j : 1 ≤ j ≤ i : t[j]) ≥ 0) ∧ ( P j : 1 ≤ j ≤ N : t[j]) = 0)},
tenemos que evaluar primero1Psi ∀ i : 1 ≤ i ≤ N : ( j : 1 ≤ j ≤ i : t[j]) ≥ 0
es cierto o no y segundo si ( j : 1 ≤ j ≤ N : t[j]) = 0 es cierto o no. Ası́,
podremos evaluar el valor de b que nos P indica si la tabla es gaspariforme.
Para resolver ∀ i : 1 ≤ i ≤ N : ( j : 1 ≤ j ≤ i : t[j]) ≥ 0 tenemos que
plantear una búsqueda para lo cual aplicamos la propiedad de equivalencia
∀ i : . . . : S ≡ ¬(∃ i : . . . : ¬S). Al aplicar esta propiedad a nuestro problema
queda lo siguiente: P
¬(∃i : 1 ≤ i ≤ N : ( j : 1 ≤ j ≤ i : t[j]) < 0)
Ya podemos aplicar el esquema de búsqueda al (∃ i : . . .):
• Definimos una variable de búsqueda a la que llamamos x de tipo entero
• El espacio de búsqueda, de 1 a N en la tabla t
• Sentido, creciente, de 1 a N .
Tenemos el siguiente esquema:
2
• La condición de continuación anterior: x < N ∧ ¬A(t, x); quedará como:
(x < N ) ∧ ¬(z < 0), esto es (x < N ) ∧ (z ≥ 0)
P
• Inicialización. Si x = 1 entonces z = ( j : 1 ≤ j ≤ x : t[j]) = t[1] luego
se necesita la inicialización z := t[1]
• Restablecer. Tenemos que se cumple {Inv 0 ∧ B ≡P t = T ∧ ∀ i: 1 ≤ i <
x : ¬A(t, i) ∧ 1 ≤ x ≤ N ∧ (x < N ∧ z ≥ 0) ∧ z = j : 1 ≤ j ≤ x : t[j]}
y hay que ver como restablecer el invariante al realizar el avancePde x, es
decir (Inv 0 )xx+1 . Sustituyendo, tenemos que (Inv 0 )xx+1 ≡ . . . z = j: 1 ≤
j ≤ (x+1) : t[j] Si denotamos como zant al valor de z en {Inv 0 ∧ B} y como
znueva al valor de z con el avance de x, tenemos que znueva ← zant +t[x+1].
Todo lo demás se cumple porque el esquema de búsqueda tipo es correcto.
3
algoritmo gaspariforme;
t: tabla [1..N ] de entero;
b: booleano;
{P re ≡ t = T }
var x,z: entero fvar
x := 1;
z := t[1];
{Inv 0 ≡ t = P
T ∧ ∀ i : 1 ≤ i < x : ¬(A(t, i) < 0) ∧ 1 ≤ x ≤ N ∧
∧z = j : 1 ≤ j ≤ x : t[j]}
{cota ≡ N − x}
mientras x < N ∧ z ≥ 0 hacer
z := z + t[x + 1];
x := x + 1
fmientras;
{Inv 0 ∧ ((z < 0) ∨ (x = N ))}
b := (z = 0) P
{P ost ≡ t = TP∧ b = ((∀ i : 1 ≤ i ≤ N : ( j : 1 ≤ j ≤ i : t[j]) ≥ 0)∧
∧( j : 1 ≤ j ≤ N : t[j]) = 0)}
falgoritmo;