Exercícios de Verificação de Programas
Estes exercícios foram copiados e/ou inspirados nas seguintes obras:
- Lógica e Aritmética de Augusto Franco de Oliveira.
- forallχ de P. D. Magnus.
- Logic in Computer Science de Michael Huth e Mark Ryan.
- Artificial Intelligence, A Modern Approach de Stuart Russell e Peter Norvig.
- Mathematics for Computer Science: Course Textbook de Eric Lehman, F Thomson Leighton e Albert R Meyer.
Instruções Extra
Exercício 1 Em que circunstâncias a instrução if G {A} else {B}
não termina?
Exercício 2 Uma instrução comum que não está presente na nossa linguagem de programação é o for
, que pode ser usado para somar termos de uma sucessão como no exemplo seguinte:
#![allow(unused)] fn main() { s = 0; for i = 0; i <= max; i = i + 1 { s = s + 2 * i; } }
Depois de executar a cópia
s = 0
inicial, a instruçãofor
executa primeiroi = 0
, depois o corpos = s + 2 * i
seguido do incrementoi = i + 1
repetidamente até quei <= max
fique falso.
Explique como a instrução for
pode ser definida na linguagem inicial.
Estado
Exercício 3 Para cada estado tal que e , determine, justificando, quais da seguintes relações são válidas:
- .
- .
- .
- .
- .
- .
Provas
Exercício 4 Use as regras adequadas para provar:
- .
- .
- onde
P3
é
#![allow(unused)] fn main() { a = 1; y = x; y = y - a; }
Exercício 5 Escreva programas tais que os triplos seguintes sejam válidos e, de seguida, faça as respetivas demonstrações.
- .
- .
Verificação de Programas
Exercício 6 Prove a validade de
onde é o menor de e e P
é o programa
#![allow(unused)] fn main() { if x > y { z = y; } else { z = x; } }
Exercício 7 Prove a validade de
onde é o menor de e e P
é o programa
#![allow(unused)] fn main() { if x <= y { z = x; } else { z = y; } }
Exercício 8 Para cada uma das especificações seguintes escreva um programa adequado e prove que está correto:
- .
- .
Exercício 9 A função caraterística da relação é
Por exemplo, e .
Prove a validade de
onde Xpos
é o programa
#![allow(unused)] fn main() { if x > 0 { y = 1; } else { y = 0; } }
e
Exercício 10 Prove a validade de
onde Copy1
é o programa
#![allow(unused)] fn main() { a = x; y = 0; while a != 0 { y = y + 1; a = a - 1; } }
Exercício 11 Prove a validade de
onde Multi1
é o programa
#![allow(unused)] fn main() { a = 0; z = 0; while a != y { z = z + x; a = a + 1; } }
Exercício 12 Prove a validade de
onde Multi2
é o programa
#![allow(unused)] fn main() { z = 0; while y != 0 { z = z + x; y = y - 1; } }
Exercício 13 Prove a validade de
onde Copy2
é o programa
#![allow(unused)] fn main() { y = 0; while y != x { y = y + 1; } }
Exercício 14 É suposto o programa Div
calcular o dividendo dos inteiros e ; isto é, o único inteiro tal que existe um inteiro (o resto) tal que e .
Por exemplo, se e então porque , com .
Prove que
sendo Div
o programa
#![allow(unused)] fn main() { r = x; d = 0; while r >= y { r = r - y; d = d + 1; } }
Exercício 15 Prove a validade de
onde é o menor de e e Minup
é o programa
#![allow(unused)] fn main() { z = 0; while z < y and z < x { z = z + 1; } }
Exercício 16 Modifique o exercício anterior de forma a calcular o máximo de . Use a seguinte igualdade aritmética:
Exercício 17 Complete o programa seguinte, e demonstre a sua validade, de forma a calcular o máximo de .
#![allow(unused)] fn main() { ? ? x; while ? ? y { z = z + 1; } }
Exercício 18 Prove a validade de
onde Downfac
é o programa
#![allow(unused)] fn main() { a = x; y = 1; while a > 0 { y = y * a; a = a - 1; } }
Exercício 19 Prove a validade de
onde Somat1
é o programa
#![allow(unused)] fn main() { i = 0; y = 0; while i <= x { i = i + 1; y = y + i; } }
sabendo que
Exercício 20 Prove a validade de
onde Somat2
é o programa
#![allow(unused)] fn main() { y = 0; while x > 0 { y = y + x; x = x - 1; } }
usando as igualdades aritméticas do exercício anterior.