summaryrefslogtreecommitdiff
path: root/tests/fstar-split/demo/Demo.fst
blob: ab7461575bbc83e739dc2aae91ccfe6e817e3692 (plain)
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
(** THIS FILE WAS AUTOMATICALLY GENERATED BY AENEAS *)
(** [demo] *)
module Demo
open Primitives

#set-options "--z3rlimit 50 --fuel 1 --ifuel 1"

(** [demo::choose]: forward function
    Source: 'src/demo.rs', lines 5:0-5:70 *)
let choose (t : Type0) (b : bool) (x : t) (y : t) : result t =
  if b then Return x else Return y

(** [demo::choose]: backward function 0
    Source: 'src/demo.rs', lines 5:0-5:70 *)
let choose_back
  (t : Type0) (b : bool) (x : t) (y : t) (ret : t) : result (t & t) =
  if b then Return (ret, y) else Return (x, ret)

(** [demo::mul2_add1]: forward function
    Source: 'src/demo.rs', lines 13:0-13:31 *)
let mul2_add1 (x : u32) : result u32 =
  let* i = u32_add x x in u32_add i 1

(** [demo::use_mul2_add1]: forward function
    Source: 'src/demo.rs', lines 17:0-17:43 *)
let use_mul2_add1 (x : u32) (y : u32) : result u32 =
  let* i = mul2_add1 x in u32_add i y

(** [demo::incr]: merged forward/backward function
    (there is a single backward function, and the forward function returns ())
    Source: 'src/demo.rs', lines 21:0-21:31 *)
let incr (x : u32) : result u32 =
  u32_add x 1

(** [demo::CList]
    Source: 'src/demo.rs', lines 27:0-27:17 *)
type cList_t (t : Type0) =
| CList_CCons : t -> cList_t t -> cList_t t
| CList_CNil : cList_t t

(** [demo::list_nth]: forward function
    Source: 'src/demo.rs', lines 32:0-32:56 *)
let rec list_nth (t : Type0) (n : nat) (l : cList_t t) (i : u32) : result t =
  if is_zero n
  then Fail OutOfFuel
  else
    let n1 = decrease n in
    begin match l with
    | CList_CCons x tl ->
      if i = 0 then Return x else let* i1 = u32_sub i 1 in list_nth t n1 tl i1
    | CList_CNil -> Fail Failure
    end

(** [demo::list_nth_mut]: forward function
    Source: 'src/demo.rs', lines 47:0-47:68 *)
let rec list_nth_mut
  (t : Type0) (n : nat) (l : cList_t t) (i : u32) : result t =
  if is_zero n
  then Fail OutOfFuel
  else
    let n1 = decrease n in
    begin match l with
    | CList_CCons x tl ->
      if i = 0
      then Return x
      else let* i1 = u32_sub i 1 in list_nth_mut t n1 tl i1
    | CList_CNil -> Fail Failure
    end

(** [demo::list_nth_mut]: backward function 0
    Source: 'src/demo.rs', lines 47:0-47:68 *)
let rec list_nth_mut_back
  (t : Type0) (n : nat) (l : cList_t t) (i : u32) (ret : t) :
  result (cList_t t)
  =
  if is_zero n
  then Fail OutOfFuel
  else
    let n1 = decrease n in
    begin match l with
    | CList_CCons x tl ->
      if i = 0
      then Return (CList_CCons ret tl)
      else
        let* i1 = u32_sub i 1 in
        let* tl1 = list_nth_mut_back t n1 tl i1 ret in
        Return (CList_CCons x tl1)
    | CList_CNil -> Fail Failure
    end

(** [demo::list_nth_mut1]: loop 0: forward function
    Source: 'src/demo.rs', lines 62:0-71:1 *)
let rec list_nth_mut1_loop
  (t : Type0) (n : nat) (l : cList_t t) (i : u32) : result t =
  if is_zero n
  then Fail OutOfFuel
  else
    let n1 = decrease n in
    begin match l with
    | CList_CCons x tl ->
      if i = 0
      then Return x
      else let* i1 = u32_sub i 1 in list_nth_mut1_loop t n1 tl i1
    | CList_CNil -> Fail Failure
    end

(** [demo::list_nth_mut1]: forward function
    Source: 'src/demo.rs', lines 62:0-62:77 *)
let list_nth_mut1 (t : Type0) (n : nat) (l : cList_t t) (i : u32) : result t =
  list_nth_mut1_loop t n l i

(** [demo::list_nth_mut1]: loop 0: backward function 0
    Source: 'src/demo.rs', lines 62:0-71:1 *)
let rec list_nth_mut1_loop_back
  (t : Type0) (n : nat) (l : cList_t t) (i : u32) (ret : t) :
  result (cList_t t)
  =
  if is_zero n
  then Fail OutOfFuel
  else
    let n1 = decrease n in
    begin match l with
    | CList_CCons x tl ->
      if i = 0
      then Return (CList_CCons ret tl)
      else
        let* i1 = u32_sub i 1 in
        let* tl1 = list_nth_mut1_loop_back t n1 tl i1 ret in
        Return (CList_CCons x tl1)
    | CList_CNil -> Fail Failure
    end

(** [demo::list_nth_mut1]: backward function 0
    Source: 'src/demo.rs', lines 62:0-62:77 *)
let list_nth_mut1_back
  (t : Type0) (n : nat) (l : cList_t t) (i : u32) (ret : t) :
  result (cList_t t)
  =
  list_nth_mut1_loop_back t n l i ret

(** [demo::i32_id]: forward function
    Source: 'src/demo.rs', lines 73:0-73:28 *)
let rec i32_id (n : nat) (i : i32) : result i32 =
  if is_zero n
  then Fail OutOfFuel
  else
    let n1 = decrease n in
    if i = 0
    then Return 0
    else let* i1 = i32_sub i 1 in let* i2 = i32_id n1 i1 in i32_add i2 1

(** Trait declaration: [demo::Counter]
    Source: 'src/demo.rs', lines 83:0-83:17 *)
noeq type counter_t (self : Type0) = {
  incr : self -> result usize;
  incr_back : self -> result self;
}

(** [demo::{usize}::incr]: forward function
    Source: 'src/demo.rs', lines 88:4-88:31 *)
let usize_incr (self : usize) : result usize =
  let* _ = usize_add self 1 in Return self

(** [demo::{usize}::incr]: backward function 0
    Source: 'src/demo.rs', lines 88:4-88:31 *)
let usize_incr_back (self : usize) : result usize =
  usize_add self 1

(** Trait implementation: [demo::{usize}]
    Source: 'src/demo.rs', lines 87:0-87:22 *)
let demo_CounterUsizeInst : counter_t usize = {
  incr = usize_incr;
  incr_back = usize_incr_back;
}

(** [demo::use_counter]: forward function
    Source: 'src/demo.rs', lines 95:0-95:59 *)
let use_counter
  (t : Type0) (counterTInst : counter_t t) (cnt : t) : result usize =
  counterTInst.incr cnt

(** [demo::use_counter]: backward function 0
    Source: 'src/demo.rs', lines 95:0-95:59 *)
let use_counter_back
  (t : Type0) (counterTInst : counter_t t) (cnt : t) : result t =
  counterTInst.incr_back cnt