automation_structures/connectives/
counter.rs1use vstd::prelude::*;
4
5verus! {
6
7pub open spec fn nonnegative(value: int) -> bool {
9 0 <= value
10}
11
12pub open spec fn positive(value: int) -> bool {
14 &&& nonnegative(value)
15 &&& value > 0
16}
17
18pub open spec fn increment(pre: int, post: int) -> bool {
20 post == pre + 1
21}
22
23pub proof fn stalled_increment_rejected(pre: int)
25 ensures !increment(pre, pre),
26{
27}
28
29pub open spec fn stutter(pre: int, post: int) -> bool {
31 post == pre
32}
33
34pub open spec fn decrement_if(pre: int, post: int, selected: bool) -> bool {
36 post == pre - if selected { 1int } else { 0int }
37}
38
39pub open spec fn guarded_decrement_if(pre: int, post: int, selected: bool) -> bool {
41 &&& nonnegative(pre)
42 &&& decrement_if(pre, post, selected)
43 &&& nonnegative(post)
44 &&& (selected ==> 0 < pre)
45}
46
47#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
49pub struct Counter {
50 pub value: u64,
52}
53
54impl Counter {
55 pub open spec fn value_spec(&self) -> nat {
57 self.value as nat
58 }
59
60 pub fn new(value: u64) -> (counter: Self)
62 ensures counter.value_spec() == value as nat,
63 {
64 Self { value }
65 }
66
67 pub fn value(&self) -> (value: u64)
69 ensures value as nat == self.value_spec(),
70 {
71 self.value
72 }
73
74 #[must_use]
76 pub fn try_increment(&mut self) -> (accepted: bool)
77 ensures
78 accepted == (old(self).value_spec() < u64::MAX as nat),
79 accepted ==> final(self).value_spec() == old(self).value_spec() + 1,
80 !accepted ==> final(self).value_spec() == old(self).value_spec(),
81 {
82 if self.value == u64::MAX {
83 return false;
84 }
85 self.value = self.value + 1;
86 true
87 }
88
89 #[must_use]
91 pub fn try_decrement(&mut self) -> (accepted: bool)
92 ensures
93 accepted == (old(self).value_spec() > 0),
94 accepted ==> final(self).value_spec() + 1 == old(self).value_spec(),
95 !accepted ==> final(self).value_spec() == old(self).value_spec(),
96 {
97 if self.value == 0 {
98 return false;
99 }
100 self.value = self.value - 1;
101 true
102 }
103}
104
105}