1- Preuves :
Soit montrer : [ 'A' x : (p(x) -> 'E' y : 'A'
z : (p(z) -> gt(x,y,z)))] |- 'A' x : (p(x) -> 'A' z : (p(z) -> 'E'
y : gt(x,y,z)))
2- Prolog :
/* à gauche en minuscules , à droite en Majuscule */ mM([] , []). mM([Xm|Lm] , [XM|LM]) :- lmM(Xm , XM) , !, mM(Lm , LM). mM([X|Lm] , [X|LM]) :- mM(Lm , LM).
3-logique de Hoare :
{ n>0}
i := 0 ;
{i==0 & n>0}
while ~(i =n)
invariant {'A' x :
((x>=0 & x < i ) -> inv(x) =tab(n-x-1)) & i<=n}
variant {n - i}
do
(
inv[i]= tab[n-i-1];
i := i+1;
)
end ;
{'A' x : ((x>=0 & x < n) -> inv(x) =tab(n-x-1))
}
I : {'A' x : ((x>=0 & x < i ) -> inv(x) =tab(n-x-1)) & i<=n} & B : i != n
trivial : i+1<=n -> i<=n
{'A' x : ((x>=0 & x < i ) -> inv(x) ==tab(n-x-1)) & i+1<=n }
{'A' x : ((x>=0 & x < i ) -> inv(x) ==tab(n-x-1)) & i+1<=n & tab[n-i-1]==tab(n-i-1)}
inv[i]= tab[n-i-1];
{'A' x : ((x>=0 & x < i ) -> inv(x) ==tab(n-x-1)) & i+1<=n & inv(i) ==tab(n-i-1)}
{'A' x : ((x>=0 & x < i +1) -> inv(x) ==tab(n-x-1)) & i+1<=n}
i := i+1;
I : {'A' x : ((x>=0 & x < i ) -> inv(x) =tab(n-x-1)) & i<=n}
I : ('A' x : ((x>=0 & x < i ) -> inv(x) =tab(n-x-1)) & i<=n) & ~B : i==n -> 'A' x : ((x>=0 & x < n) -> inv(x) =tab(n-x-1)) triviale
La correction partielle est vérifiée
{n-i-1<n-i} : toujours vérifiée
V1:= n-i;
{n-i-1<V1}
i := i+1;
{n-i<V1}
package java.util; public class Vector extends AbstractList implements List, Cloneable, java.io.Serializable { //@ invariant \typeof(elementData) == \type(Object[]) /*@ invariant (\forall int i; (0<=i && i<elementCount) ==> (\typeof(elementData[i]) <: elementType || elementData[i]==null)) */ /*@ invariant (\forall int i; (0<=i && i<elementCount) ==> (!containsNull ==> elementData[i]!=null)) */ /*@ invariant (\forall Vector v; v==null || v==this || v.elementData!=elementData) */ protected /*@non_null*/ Object elementData[]; //@ invariant 0 <= elementCount && elementCount <= elementData.length ; /*@spec_public*/ protected int elementCount; protected int capacityIncrement; private static final long serialVersionUID = -2767605614048989439L; */ //@ requires initialCapacity >= 0 ; //@ ensures this.elementCount == 0 public Vector(int initialCapacity, int capacityIncrement) { super(); if (initialCapacity < 0) throw new IllegalArgumentException("Illegal Capacity: " + initialCapacity); this.elementData = new Object[initialCapacity]; this.capacityIncrement = capacityIncrement; //@ set elementType = \type(Object) //@ set containsNull = true } //@ requires initialCapacity >= 0 ; //@ ensures this.elementCount == 0 public Vector(int initialCapacity) { this(initialCapacity, 0); } //@ ensures this.elementCount == 0 public Vector() { this(10); } //@ ensures this.elementType == c.elementType //@ ensures this.containsNull == c.containsNull public Vector(/*@non_null*/ Collection c) { this((c.size()*110)/100); // Allow 10% room for growth //@ assume c.elementType <: \type(Object) //@ set elementType = c.elementType //@ set containsNull = c.containsNull Iterator i = c.iterator(); while (i.hasNext()) elementData[elementCount++] = i.next(); //@ nowarn IndexTooBig } ... //@ ensures \result != null //@ ensures \result!=null //@ ensures \result.elementType == elementType //@ ensures \result.returnsNull == containsNull public Enumeration elements() { return new Enumeration() { int count = 0; public boolean hasMoreElements() { return count < elementCount; } public Object nextElement() { synchronized (Vector.this) { if (count < elementCount) { return elementData[count++]; } } throw new NoSuchElementException("Vector Enumeration"); } }; } ... //@ requires 0 <= index ; //@ requires index < elementCount ; //@ ensures \typeof(\result) <: elementType || \result==null //@ ensures !containsNull ==> \result!=null public synchronized Object elementAt(int index) { if (index >= elementCount) { throw new ArrayIndexOutOfBoundsException(index + " >= " + elementCount); } try { return elementData[index]; } catch (ArrayIndexOutOfBoundsException e) { throw new ArrayIndexOutOfBoundsException(index + " < 0"); } } ... //@ requires \typeof(obj) <: elementType //@ requires containsNull || obj!=null //@ modifies elementCount //@ ensures elementCount == \old(elementCount)+1 public synchronized void addElement(Object obj) { modCount++; ensureCapacityHelper(elementCount + 1); elementData[elementCount++] = obj; } ... }