NFP 120 Spécification logique et validation des programmes

Transcription

NFP 120 Spécification logique et validation des programmes
NFP 120
Spécification logique et validation des programmes
séquentiels
Examen du 7 septembre 2010
Documents autorisés. Calculettes, ordinateurs, portables interdits. Le barême est donné à titre
indicatif.
Exercice 1 (2 points)
Prouvez, en utilisant les tables de vérité, que :
a ∧ c → b, ¬ b → a, c ⊢ b
Exercice 2 (4 points)
Question 1
On considère la base suivante:
a.
c.
b :- a, e.
d :- a, b.
d :- f.
f :- a, g.
g :- c.
e :- b.
Donnez sa sémantique en chaînage avant (en donnant les étapes du calcul)
Question 2
On considère le programme proplog neg :
a :- h, d.
d :- b.
c :- not e.
b :- f.
b :- not c.
h :- not e.
Donnez le résultat de la requête en expliquant le calcul :
?- a.
Exercice 3 (4 points)
Montrer avec les tableaux sémantiques que
a ∧ c → b, ¬ b → a, c ⊢ b
Montrer avec les séquents que
w → z, z ∧ w → u, ¬ u ⊢ ¬ w
Montrer avec les tableaux sémantiques que :
∃y chat(y), ∀ x (chat(x) → aMoustache(x)), ∀ x (chat(x) → animal(x)) ⊢
¬ x (animal(x) → ¬ aMoustache(x))
Exercice 4 (4 points)
Écrire un prédicat prolog qui dise si un entier est compris au moins n fois dans une liste.
Le prédicat aura la forme
comprisN(X, Nb, L).
où X est l'entier, Nb est le nombre de fois minimum qu'il doit apparaître, et L est la liste.
On devra par exemple avoir :
?- comprisN(4, 2, [3, 5, 4, 7, 4, 9, 4]).
yes.
Car 4 est compris au moins 2 fois dans la liste [3, 5, 4, 7, 4, 9, 4].
Exercice 5 (3 points)
Soit le prédicat prolog suivant :
naturel(s(X)) :- naturel(X).
naturel(0).
Expliquer l'exécution et donnez éventuellement le résultat des requêtes suivantes :
?- naturel(0).
?- naturel(s(s(s(0)))).
?- naturel(Y).
Exercice 6 (3 points)
On considère l'algorithme suivant, qui teste si toutes les valeurs d'un tableau sont comprises entre a
et b.
i:= 0
dans:= true
// Précondition: {i=0 ∧ dans = true}
tant que (i < t.length et dans == true) faire
si (t[i] <= a) ou (t[i] >= b) alors
dans = faux
fin si
i= i + 1
fin tant que
L'invariant de la boucle a la forme :
(i <= t.length ∧ ((dans ∧(∀ j 0<=j< i → a < t[j] < b )) ∨ (¬ dans ∧ A_DETERMINER)))
Question 1 :
Complétez l'invariant en donnant la valeur correcte pour le prédicat « A_DETERMINER ».
Question 2 :
Démontrer que la formule que vous obtenez est bien un invariant.
Question 3 :
Donner la post-condition correspondante.