summaryrefslogtreecommitdiff
path: root/tests/fstar/demo/Demo.fst
blob: d13d2ba32ac353f47bfbe4c0a97d1cb5739b8413 (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
(** THIS FILE WAS AUTOMATICALLY GENERATED BY AENEAS *)
(** [demo] *)
module Demo
open Primitives

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

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

(** [demo::mul2_add1]:
    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]:
    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]:
    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]:
    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]:
    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 & (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
        let back_'a = fun ret -> Return (CList_CCons ret tl) in
        Return (x, back_'a)
      else
        let* i1 = u32_sub i 1 in
        let* (x1, list_nth_mut_back) = list_nth_mut t n1 tl i1 in
        let back_'a =
          fun ret ->
            let* tl1 = list_nth_mut_back ret in Return (CList_CCons x tl1) in
        Return (x1, back_'a)
    | CList_CNil -> Fail Failure
    end

(** [demo::list_nth_mut1]: loop 0:
    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 & (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
        let back_'a = fun ret -> Return (CList_CCons ret tl) in
        Return (x, back_'a)
      else
        let* i1 = u32_sub i 1 in
        let* (x1, back_'a) = list_nth_mut1_loop t n1 tl i1 in
        let back_'a1 =
          fun ret -> let* tl1 = back_'a ret in Return (CList_CCons x tl1) in
        Return (x1, back_'a1)
    | CList_CNil -> Fail Failure
    end

(** [demo::list_nth_mut1]:
    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 & (t -> result (cList_t t)))
  =
  let* (x, back_'a) = list_nth_mut1_loop t n l i in Return (x, back_'a)

(** [demo::i32_id]:
    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 & self); }

(** [demo::{(demo::Counter for usize)}::incr]:
    Source: 'src/demo.rs', lines 88:4-88:31 *)
let counterUsize_incr (self : usize) : result (usize & usize) =
  let* self1 = usize_add self 1 in Return (self, self1)

(** Trait implementation: [demo::{(demo::Counter for usize)}]
    Source: 'src/demo.rs', lines 87:0-87:22 *)
let counterUsize : counter_t usize = { incr = counterUsize_incr; }

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