/* une diée de ce qui était attendu à la 2ème session 2003 ...
1- Preuves :
2- Prolog :
porte(a,b). porte(b,e). porte(b,c). porte(d,e). porte(c,d). porte(e,f). porte(g,e). telephone(g). aller(X,Y , T) :- aller(X,Y , [] , T). aller(X,X , T,[X|T]). % attention le chemin est " à l'envers " aller(X,Y , L,T) :- porte(X,Z) , not member(Z , L) , not member(Y,L) , aller(Z,Y , [X|L] , T). aller(X,Y , L,T) :- porte(Z,X) , not member(Z , L) , not member(Y,L) , aller(Z,Y , [X|L] , T). ?- aller(a , X , CHE) , telephone(X). %pas de réponse et négation NON sure ?- telephone(X) , aller(a , X , CHE). X = g CHE = [g, e, b, a] ; X = g CHE = [g, e, d, c, b, a] ; No
3-HOARE :
{ 'A' x : ((x>=1 & x =< n) -> (t(x) = bleu v t(x) = rouge) )} ;
pr := n ; i := 1 ;
while i =< pr
invariant { 'A' x : ((x>=1 & x < i) -> t(x) = bleu) &
'A' x : ((x>pr & x =< n) -> t(x) = rouge) & i=<pr+1 & pr=<n }
variant {pr - i+1}
do
if t(i) = bleu
then i:= i+1
else /* t(i) = rouge */ t := t(i) ; t(i) := t(pr) ; t(pr) := t ; pr := pr-1 ;
end
end ;
%post-assertion :
{ 'A' x : ((x>=1 & x =< pr) -> t(x) = bleu) &
'A' x : ((x>pr & x =< n) -> t(x) = rouge) &
0 =< pr & pr =<n}
|
| A prouver : {P}; while B do S end ; {Q}
P= 'A' x : ((x>=1 & x =< n) -> (t(x) = bleu v t(x) = rouge) ) & i=1 & pr=n
Q= 'A' x : ((x>=1 & x =< pr) -> t(x) = bleu) &
I ='A' x : ((x>=1 & x < i) -> t(x) = bleu) & B = i =< pr V = pr-i+1 |
(i)- P -> I : vrai par défaut (il n'existe pas x : x>=1 & x < 1 ni x : x>n & x =< n) |
(ii)- {I & B} ; S ; {I}
S instruction " if " donc 2 vérifications
(a) t(i)=bleu
{'A' x : ((x>=1 & x < i) -> t(x) = bleu) & 'A' x : ((x>pr & x =< n) -> t(x) = rouge) &
i=<pr+1 & pr=<n & i<pr}
-> trivial car t(i)=bleu
{'A' x : ((x>=1 & x < i+1) -> t(x) = bleu) & 'A' x : ((x>pr & x =< n) -> t(x) = rouge) &
i=<pr+1 & pr=<n}
i :=i+1 ;
{'A' x : ((x>=1 & x < i) -> t(x) = bleu) & 'A' x : ((x>pr & x =< n) -> t(x) = rouge) &
i=<p+1 & pr=<n}
(aa) t(i)=rouge
{'A' x : ((x>=1 & x < i) -> t(x) = bleu) & 'A' x : ((x>pr & x =< n) -> t(x) = rouge) &
i=<pr+1 & pr=<n & i=<pr}
-> trivial
{'A' x : ((x>=1 & x < i) -> t(x) = bleu) & 'A' x : ((x> pr & x =< n) -> t(x) = rouge) & i=< pr & pr-1 =<n & t(i)=rouge}
t := t(i) ;
t(i) n'a pas de propriété particulière dans la formule donc rien de nouveau:
{'A' x : ((x>=1 & x < i) -> t(x) = bleu) & 'A' x : ((x> pr & x =< n) -> t(x) = rouge) & i=< pr & pr-1 =<n & t=rouge}
t(i) := t(pr) ;
{'A' x : ((x>=1 & x < i) -> t(x) = bleu) & 'A' x : ((x> pr & x =< n) -> t(x) = rouge) & i=< pr & pr-1 =<n & t=rouge}
t(pr) := t ;
montrer la propriété de t(pr) : {'A' x : ((x>=1 & x < i) -> t(x) = bleu) & 'A' x : ((x> pr & x =< n) -> t(x) = rouge) & i=< pr & pr-1 =<n & t(pr)=rouge}
{'A' x : ((x>=1 & x < i) -> t(x) = bleu) & 'A' x : ((x> pr-1 & x =< n) -> t(x) = rouge) &
i=< (pr-1)+1 & pr-1 =<n}
pr := pr-1 ;
{'A' x : ((x>=1 & x < i) -> t(x) = bleu) & 'A' x : ((x>pr & x =< n) -> t(x) = rouge) &
i=<pr+1 & pr=<n}
|
(iii) I & ~B -> Q
{'A' x : ((x>=1 & x < i) -> t(x) = bleu) & 'A' x : ((x>pr & x =< n) -> t(x) = rouge) &
i=<pr+1 & pr=<n & i>pr} (-> i=pr+1)
-> donc i>pr et t(i) = rouge !!!
'A' x : ((x>=1 & x =< pr) -> t(x) = bleu) & 'A' x : ((x>pr & x =< n) -> t(x) = rouge) &
0 =< pr & pr =<n
|
(iv) : 'A' x : ((x>=1 & x < i) -> t(x) = bleu) & 'A' x : ((x>pr & x =< n) -> t(x) = rouge) & i=<pr+1 & pr=<n & i=<pr -> pr-i +1> 0 trivial |
(v) en fait : V1 := pr-i ; if t(i)=bleu then i := i+1 else pr:= pr-1end ; {pr-i<V1}
(a) cas t(i)=bleu
{pr-i<pr-i+1} // toujours vraie
V1 := pr-i +1
{pr-(i+1)+1<V1}
i := i+1
{pr-i<V1}
(b) cas t(i)=rouge
{ pr-i)<pr-i+1} // toujours vraie
V1 := pr-i +1
{pr-1 -i+1<V1}
pr := pr-1
{pr-i+1<V1}
|