finish Frama-C homework
This commit is contained in:
parent
97a81f159a
commit
0bbf6ffde1
8 changed files with 142 additions and 24 deletions
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
31
content/conception_formelle/99-DM_framac/code/test.c
Normal file
31
content/conception_formelle/99-DM_framac/code/test.c
Normal 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;
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue