-
Notifications
You must be signed in to change notification settings - Fork 24
/
Copy pathsimple-spec.k
56 lines (52 loc) · 1.55 KB
/
simple-spec.k
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
requires "kwasm-lemmas.md"
module SIMPLE-SPEC
imports KWASM-LEMMAS
// forall X Y : Nat, X = Y -> X - Y = 0
claim
<instrs>
ITYPE:IValType . const X ~>
ITYPE:IValType . const Y ~>
ITYPE:IValType . sub
=> .
...
</instrs>
<valstack> S => < ITYPE > 0 : S </valstack>
requires #inUnsignedRange(ITYPE, X) andBool X ==Int Y
// forall X Y : Nat, X <= max X Y && Y <= max X Y
claim
<instrs>
ITYPE:IValType . const X ~>
ITYPE:IValType . const Y ~>
ITYPE:IValType . ge_u ~>
#if([ITYPE:IValType .ValTypes], ITYPE:IValType.const X, ITYPE:IValType.const Y, _)
=> .
...
</instrs>
<valstack> S => < ITYPE > ?MAX : S </valstack>
requires
#inUnsignedRange(ITYPE, X) andBool
#inUnsignedRange(ITYPE, Y)
ensures
#inUnsignedRange(ITYPE, ?MAX) andBool
X <=Int ?MAX andBool
Y <=Int ?MAX
// forall X Y : Nat, even X -> even Y -> even (X + Y)
claim
<instrs>
ITYPE:IValType . const X:Int ~>
ITYPE:IValType . const Y:Int ~>
ITYPE . add => .
...
</instrs>
<valstack> S:ValStack => < ITYPE > Z : S </valstack>
requires
0 <=Int X andBool
0 <=Int Y andBool
0 <=Int Z andBool
Z ==Int (X +Int Y) andBool
Z <Int #pow(ITYPE) andBool
X modInt 2 ==Int 0 andBool
Y modInt 2 ==Int 0
ensures
Z modInt 2 ==Int 0
endmodule