File: matrix_mult.why

package info (click to toggle)
why 2.26%2Bdfsg-2%2Bsqueeze1
  • links: PTS, VCS
  • area: main
  • in suites: squeeze
  • size: 19,796 kB
  • ctags: 19,175
  • sloc: ml: 115,078; java: 9,253; ansic: 4,757; makefile: 1,350; sh: 485; lisp: 3
file content (36 lines) | stat: -rw-r--r-- 897 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

logic m,n,p : int

type matrix

logic get : matrix, int, int -> int

parameter c : matrix ref

logic ab : int,int -> int


let test () =
  { 0 < m and 0 < n and 0 < p }
  let i = ref 0 in
  while !i < m do 
    { invariant i <= m and
      forall i',j':int. 
        0 <= i' < i -> 0 <= j' < p -> get(c,i',j') = ab(i',j') }
    L2:
    let j = ref 0 in
    while !j < p do 
      { invariant 0 <= j <= p and
  (forall j':int. 0 <= j' < j -> get(c,i,j') = ab(i,j')) and
  (forall i',j':int. 0 <= i' < i -> 0 <= j' < p 
	-> get(c,i',j') = get(c@L2,i',j')) }
      [ {} unit writes c 
        { get(c,i,j) = ab(i,j) and
  (forall j':int. 0 <= j' < j -> get(c,i,j') = ab(i,j')) and
  (forall i',j':int. 0 <= i' < i -> 0 <= j' < p -> get(c,i',j') = ab(i',j')) }
      ];
      j := !j + 1
    done;
    i := !i + 1
  done
  { forall i',j':int. 0 <= i' < m -> 0 <= j' < p -> get(c,i',j') = ab(i',j') }