finish Frama-C homework

This commit is contained in:
Yorick Barbanneau 2023-05-09 21:48:51 +02:00
parent 97a81f159a
commit 0bbf6ffde1
8 changed files with 142 additions and 24 deletions

View file

@ -9,7 +9,7 @@ int max_dist(int *tab, unsigned int n)
/*@
loop assigns i, max, min;
loop invariant I1: \at(i, LoopEntry) <= i <= n;
loop invariant I2: min <= max;
loop invariant I2: INT_MIN /2 <= min <= max <= INT_MAX/2;
loop invariant I3: \forall integer j; (\at(i, LoopEntry) <= j < i ==> max >= tab[j] >= min);
loop invariant I4: \exists integer j; ( 0 < j < i ==> max == tab[j]);
loop invariant I5: \exists integer j; ( 0 < j < i ==> min == tab[j]);
@ -23,5 +23,9 @@ int max_dist(int *tab, unsigned int n)
max = tab[i];
i++;
}
//@ assert (INT_MIN / 2) <= min;
//@ assert min <= (INT_MAX / 2);
//@ assert (INT_MIN / 2) <= max;
//@ assert max <= (INT_MAX / 2);
return max - min;
}

View file

@ -2,9 +2,12 @@
#include "abs.h"
/*@
requires 0 < n < UINT_MAX;
requires 0 < n <= UINT_MAX;
requires \valid_read(tab+(0..n-1));
requires \forall integer i; 0 <= i < n ==> INT_MIN / 2 <= tab[i] <= INT_MAX/2;
terminates \true;
ensures \forall integer a,b; 0 <= a < b < n ==> \result >= abs(tab[a]-tab[b]);
ensures \exists integer i,j; 0 < i < j < n ==> \result == abs(tab[i]-tab[j]);
assigns \nothing;
*/
int max_dist(int *tab, unsigned int n);

View file

@ -3,10 +3,21 @@ int min_dist(int *tab, unsigned int n)
{
int min = abs(tab[0] - tab[1]);
unsigned int i = 0;
/*@
loop invariant I1: \at(i, LoopEntry) <= i < n - 1;
loop invariant I2: \exists integer k; (k == n - 1 ==> \at(min, LoopCurrent) >= min);
loop assigns i, min;
loop variant n - i;
*/
while (i < n - 1)
{
int min_i = abs(tab[i] - tab[i + 1]);
unsigned int j = i + 2;
/*@
loop invariant J1: \at(j, LoopEntry) <= j < n;
loop assigns i, j , min, min_i;
loop variant n - j;
*/
while (j < n)
{
int d = abs(tab[i] - tab[j]);
@ -19,4 +30,4 @@ int min_dist(int *tab, unsigned int n)
i++;
}
return min;
}
}

View file

@ -1,6 +1,12 @@
#include <limits.h>
#include "abs-cor.h"
#include "abs.h"
/*@ ensures \forall integer i; 0 <= i < n ==> (\forall integer j; i < j < n ==> \result <= abs(tab[i]-tab[j]));
/*@
requires 1 < n <= UINT_MAX;
requires \valid_read(tab+(0..n-1));
requires \forall integer i; 0 <= i < n ==> (INT_MIN / 2 <= tab[i] <= INT_MAX/2);
terminates \true;
assigns \nothing;
ensures \forall integer i; 0 <= i < n ==> (\forall integer j; i < j < n ==> \result <= abs(tab[i]-tab[j]));
*/
int min_dist(int *tab, unsigned int n);
int min_dist(int *tab, unsigned int n);

View file

@ -0,0 +1,31 @@
#include <limits.h>
#include "abs.h"
/*@
requires 0 < n < INT_MAX;
requires \valid_read(tab+(0..n-1));
requires \forall integer a,b; 0 <= a < b < n ==> tab[a] - tab[b] <= INT_MAX;
ensures \forall integer a,b; 0 <= a < b < n ==> \result >= abs(tab[a]-tab[b]);
*/
int max_dist ( int *tab, int n)
{
int max = tab[0];
int min = tab[0];
unsigned int i = 1;
/*@
loop assigns i, max, min;
loop invariant I1: \at(i, LoopEntry) <= i <= n;
loop invariant I2: min <= max;
loop invariant I3: \forall integer j; (\at(i, LoopEntry) <= j < i ==> max >= tab[j] >= min);
loop variant n - i;
*/
while ( i < n)
{
if ( tab[i] > max) max = tab[i];
if ( tab[i] < min) min = tab[i];
i++;
}
//@ assert INT_MIN <= max <= INT_MAX;
//@ assert INT_MIN <= min <= INT_MAX;
return max - min;
}