Especificación: Descripción del problema que queremos resolver.
Algoritmo: Descripción de la solución escrita por humanos.
Programa: Descripción de la solución para ser ejecutada en una computadora.
proc nombre(parámetros){
Pre {P}
Post {Q}
}
Nombre: nombre que le damos al problema. Será resuelto por una función homónima.
Predicados: precondición y postcondición del procedimeinto.
proc sqrt(in x : R, out result : R) {
Pre {x >= 0}
Post {result * result = x and result >= 0}
}
Parámetros: lista de parámetros separadas por comas, donde cada parámetro especifica:
<aside>
💡 Cuando no tenemos precondiciones escribimos Pre {True}
</aside>
Si el usuario suministra datos que hacen verdadera la precondición entonces el programa $P$ termina en una cantidad finita de pasos retornando un valor que hace verdadera la postcondición.
<aside>
💡 Todos los parámetros con atributo in
(es decir, inclusive inout
) están inicializados.
</aside>
in
: Si se llama al procedimiento con el argumento c
para un parámetro de este tipo, antes de iniciar la ejecución se copia el valor c
al parámetro en cuestión.
out
: Al finalizar la ejecución del procedimiento se copia el valor al parámetro pasado. No se inicializan (no podemos mencionarlos en la precondición).
inout
: Es a la vez de entrada y de salida. La ejecución del procedimiento modifica el valor del parámetro.
proc incremento(in a : Z, out result : Z) {
Pre {True}
Post {result = a + 1}
}
proc incremento(inout a : Z){
Pre {a = A_0}
Post {a = A_0 + 1}
}
$A_0$ es una metavariable, representa el valor inicial de a
y lo usamos para relacionar en la postcondición el valor de salida de a
con su valor inicial.
Consiste en dar una postcondición más restrictiva que lo que se necesita, o bien dar una precondición más laxa.
Limita los posibles algoritmos que resuelven el problema.
Consiste en dar una precondición más restrictiva que lo realmente necesario, o bien una postcondición más débil que la que podríamos dar.
Deja afuera datos de entrada válidos o ignora condiciones necesarias para la salida.
Un tipo de datos es un conjunto de valores provisto de una serie de operaciones que involucran a esos valores.
Para hablar de un elemento de un tipo $T$ en nuestro lenguaje escribimos un término o expresión
Todos los tipos tiene un elemento distinguido: $\perp$ (bottom) ó Indef que representa ningún valor.