¿Cuál es la diferencia entre la corrección total y la corrección parcial?


Respuesta 1:

Una especificación de corrección total es también una especificación de corrección parcial. La corrección parcial es más débil porque necesita la ayuda adicional de 'S termina' para llegar a la conclusión: R se mantiene en el estado final.

Para una especificación de corrección parcial {Q} S {R}, puede obtener la siguiente información: Dado un estado inicial que satisface Q, S puede terminar o no. Si S termina, después de la ejecución de S, alcanzará un estado final que satisface a R. Si no, R es inútil ya que no hay un estado final.

Por ejemplo:

{x == 10}
mientras que (y! = 0):
    y = y - 1
x = 0
{x == 0}

Es una especificación de corrección parcial. Si y se inicializa con algún número igual o mayor que 0, S terminará y después de eso x es 0. Mientras que y comienza con un número negativo, S se repetirá para siempre y como no termina, no alcanzará un estado ' después de la ejecución de S '.

De hecho, R puede ser cualquier cosa si S es un punto muerto. Por ejemplo, para cualquier Q y R:

{Q}
while (verdadero):
    y = y - 1
{R}

siempre es una especificación de corrección parcial.

Si Q no es lo suficientemente fuerte, no puede garantizar la terminación de S, y mucho menos razonar sobre el estado después de la ejecución de S. En este caso, puede agregar manualmente una condición: S termina. Con Q y eso, el razonamiento puede continuar.

Para la especificación de corrección total {Q} S {R}, Q es lo suficientemente fuerte como para garantizar la terminación de S, por lo que puede concluir que S terminará y el estado final satisface a R.

Por ejemplo:

{x == 10}
mientras que (x! = 0):
    x = x - 1
{x == 0}

Es una especificación de corrección total.

Por cierto: no estoy seguro de si la respuesta es correcta porque la pregunta está etiquetada con corrección política. Si bien la definición en la pregunta se ve exactamente igual que en Ciencias de la Computación.