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.