summaryrefslogtreecommitdiff
path: root/tests/fstar
diff options
context:
space:
mode:
authorSon Ho2023-01-05 23:11:26 +0100
committerSon HO2023-02-03 11:21:46 +0100
commitefba91b5cc65d83c3f4d8a0d282eeda520abe82a (patch)
tree9af8c05626e89bf0f5abc94ff443b3f8194d6903 /tests/fstar
parentace526e4d32d17ab73bcc2cdb3726cddcae8b1c4 (diff)
Add more loop examples and fix issues
Diffstat (limited to '')
-rw-r--r--tests/fstar/misc/Loops.Clauses.Template.fst18
-rw-r--r--tests/fstar/misc/Loops.Clauses.fst20
-rw-r--r--tests/fstar/misc/Loops.Funs.fst138
3 files changed, 176 insertions, 0 deletions
diff --git a/tests/fstar/misc/Loops.Clauses.Template.fst b/tests/fstar/misc/Loops.Clauses.Template.fst
index cd29ca13..98d0a8ad 100644
--- a/tests/fstar/misc/Loops.Clauses.Template.fst
+++ b/tests/fstar/misc/Loops.Clauses.Template.fst
@@ -19,6 +19,12 @@ unfold
let sum_with_shared_borrows_decreases (max : u32) (i : u32) (s : u32) : nat =
admit ()
+(** [loops::clear]: decreases clause *)
+unfold let clear_decreases (v : vec u32) (i : usize) : nat = admit ()
+
+(** [loops::list_mem]: decreases clause *)
+unfold let list_mem_decreases (i : u32) (ls : list_t u32) : nat = admit ()
+
(** [loops::list_nth_mut_loop]: decreases clause *)
unfold
let list_nth_mut_loop_decreases (t : Type0) (ls : list_t t) (i : u32) : nat =
@@ -30,6 +36,18 @@ let list_nth_shared_loop_decreases (t : Type0) (ls : list_t t) (i : u32) : nat
=
admit ()
+(** [loops::list_nth_mut_loop_with_id]: decreases clause *)
+unfold
+let list_nth_mut_loop_with_id_decreases (t : Type0) (i : u32) (ls : list_t t) :
+ nat =
+ admit ()
+
+(** [loops::list_nth_shared_loop_with_id]: decreases clause *)
+unfold
+let list_nth_shared_loop_with_id_decreases (t : Type0) (l : list_t t)
+ (i : u32) (ls : list_t t) : nat =
+ admit ()
+
(** [loops::list_nth_mut_loop_pair]: decreases clause *)
unfold
let list_nth_mut_loop_pair_decreases (t : Type0) (l : list_t t) (l0 : list_t t)
diff --git a/tests/fstar/misc/Loops.Clauses.fst b/tests/fstar/misc/Loops.Clauses.fst
index 9cf5db1f..e673d4ff 100644
--- a/tests/fstar/misc/Loops.Clauses.fst
+++ b/tests/fstar/misc/Loops.Clauses.fst
@@ -19,6 +19,14 @@ unfold
let sum_with_shared_borrows_decreases (max : u32) (i : u32) (s : u32) : nat =
if max >= i then max - i else 0
+(** [loops::clear]: decreases clause *)
+unfold let clear_decreases (v : vec u32) (i : usize) : nat =
+ if i <= List.Tot.length v then List.Tot.length v - i else 0
+
+(** [loops::list_mem]: decreases clause *)
+unfold let list_mem_decreases (i : u32) (ls : list_t u32) : list_t u32 =
+ ls
+
(** [loops::list_nth_mut_loop]: decreases clause *)
unfold
let list_nth_mut_loop_decreases (t : Type0) (ls : list_t t) (i : u32) : nat =
@@ -29,6 +37,18 @@ unfold
let list_nth_shared_loop_decreases (t : Type0) (ls : list_t t) (i : u32) : list_t t =
ls
+(** [loops::list_nth_mut_loop_with_id]: decreases clause *)
+unfold
+let list_nth_mut_loop_with_id_decreases (t : Type0) (i : u32) (ls : list_t t) :
+ list_t t =
+ ls
+
+(** [loops::list_nth_shared_loop_with_id]: decreases clause *)
+unfold
+let list_nth_shared_loop_with_id_decreases (t : Type0) (l : list_t t)
+ (i : u32) (ls : list_t t) : list_t t =
+ ls
+
(** [loops::list_nth_mut_loop_pair]: decreases clause *)
unfold
let list_nth_mut_loop_pair_decreases (t : Type0) (l : list_t t) (l0 : list_t t)
diff --git a/tests/fstar/misc/Loops.Funs.fst b/tests/fstar/misc/Loops.Funs.fst
index ee8e95d2..d19e9328 100644
--- a/tests/fstar/misc/Loops.Funs.fst
+++ b/tests/fstar/misc/Loops.Funs.fst
@@ -69,6 +69,49 @@ let rec sum_with_shared_borrows_loop_fwd
let sum_with_shared_borrows_fwd (max : u32) : result u32 =
sum_with_shared_borrows_loop_fwd max 0 0
+(** [loops::clear] *)
+let clear_loop_fwd_back
+ (v : vec u32) (i : usize) :
+ Tot (result (vec u32)) (decreases (clear_decreases v i))
+ =
+ let i0 = vec_len u32 v in
+ if i < i0
+ then
+ begin match usize_add i 1 with
+ | Fail e -> Fail e
+ | Return i1 ->
+ begin match vec_index_mut_back u32 v i 0 with
+ | Fail e -> Fail e
+ | Return v0 ->
+ begin match clear_loop_fwd v0 i1 with
+ | Fail e -> Fail e
+ | Return _ -> Return v0
+ end
+ end
+ end
+ else Return v
+
+(** [loops::clear] *)
+let clear_fwd_back (v : vec u32) : result (vec u32) =
+ begin match clear_loop_fwd v 0 with
+ | Fail e -> Fail e
+ | Return _ -> Return v
+ end
+
+(** [loops::list_mem] *)
+let rec list_mem_loop_fwd
+ (i : u32) (ls : list_t u32) :
+ Tot (result bool) (decreases (list_mem_decreases i ls))
+ =
+ begin match ls with
+ | ListCons y tl -> if y = i then Return true else list_mem_loop_fwd i tl
+ | ListNil -> Return false
+ end
+
+(** [loops::list_mem] *)
+let list_mem_fwd (x : u32) (ls : list_t u32) : result bool =
+ list_mem_loop_fwd x ls
+
(** [loops::list_nth_mut_loop] *)
let rec list_nth_mut_loop_loop_fwd
(t : Type0) (ls : list_t t) (i : u32) :
@@ -137,6 +180,101 @@ let rec list_nth_shared_loop_loop_fwd
let list_nth_shared_loop_fwd (t : Type0) (ls : list_t t) (i : u32) : result t =
list_nth_shared_loop_loop_fwd t ls i
+(** [loops::id_mut] *)
+let id_mut_fwd (t : Type0) (ls : list_t t) : result (list_t t) = Return ls
+
+(** [loops::id_mut] *)
+let id_mut_back
+ (t : Type0) (ls : list_t t) (ret : list_t t) : result (list_t t) =
+ Return ret
+
+(** [loops::id_shared] *)
+let id_shared_fwd (t : Type0) (ls : list_t t) : result (list_t t) = Return ls
+
+(** [loops::list_nth_mut_loop_with_id] *)
+let rec list_nth_mut_loop_with_id_loop_fwd
+ (t : Type0) (i : u32) (ls : list_t t) :
+ Tot (result t) (decreases (list_nth_mut_loop_with_id_decreases t i ls))
+ =
+ begin match ls with
+ | ListCons x tl ->
+ if i = 0
+ then Return x
+ else
+ begin match u32_sub i 1 with
+ | Fail e -> Fail e
+ | Return i0 -> list_nth_mut_loop_with_id_loop_fwd t i0 tl
+ end
+ | ListNil -> Fail Failure
+ end
+
+(** [loops::list_nth_mut_loop_with_id] *)
+let list_nth_mut_loop_with_id_fwd
+ (t : Type0) (ls : list_t t) (i : u32) : result t =
+ begin match id_mut_fwd t ls with
+ | Fail e -> Fail e
+ | Return ls0 -> list_nth_mut_loop_with_id_loop_fwd t i ls0
+ end
+
+(** [loops::list_nth_mut_loop_with_id] *)
+let rec list_nth_mut_loop_with_id_loop_back
+ (t : Type0) (i : u32) (ls : list_t t) (ret : t) :
+ Tot (result (list_t t))
+ (decreases (list_nth_mut_loop_with_id_decreases t i ls))
+ =
+ begin match ls with
+ | ListCons x tl ->
+ if i = 0
+ then Return (ListCons ret tl)
+ else
+ begin match u32_sub i 1 with
+ | Fail e -> Fail e
+ | Return i0 ->
+ begin match list_nth_mut_loop_with_id_loop_back t i0 tl ret with
+ | Fail e -> Fail e
+ | Return l -> Return (ListCons x l)
+ end
+ end
+ | ListNil -> Fail Failure
+ end
+
+(** [loops::list_nth_mut_loop_with_id] *)
+let list_nth_mut_loop_with_id_back
+ (t : Type0) (ls : list_t t) (i : u32) (ret : t) : result (list_t t) =
+ begin match id_mut_fwd t ls with
+ | Fail e -> Fail e
+ | Return ls0 ->
+ begin match list_nth_mut_loop_with_id_loop_back t i ls0 ret with
+ | Fail e -> Fail e
+ | Return l -> id_mut_back t ls l
+ end
+ end
+
+(** [loops::list_nth_shared_loop_with_id] *)
+let rec list_nth_shared_loop_with_id_loop_fwd
+ (t : Type0) (l : list_t t) (i : u32) (ls : list_t t) :
+ Tot (result t) (decreases (list_nth_shared_loop_with_id_decreases t l i ls))
+ =
+ begin match ls with
+ | ListCons x tl ->
+ if i = 0
+ then Return x
+ else
+ begin match u32_sub i 1 with
+ | Fail e -> Fail e
+ | Return i0 -> list_nth_shared_loop_with_id_loop_fwd t l i0 tl
+ end
+ | ListNil -> Fail Failure
+ end
+
+(** [loops::list_nth_shared_loop_with_id] *)
+let list_nth_shared_loop_with_id_fwd
+ (t : Type0) (ls : list_t t) (i : u32) : result t =
+ begin match id_shared_fwd t ls with
+ | Fail e -> Fail e
+ | Return ls0 -> list_nth_shared_loop_with_id_loop_fwd t ls i ls0
+ end
+
(** [loops::list_nth_mut_loop_pair] *)
let rec list_nth_mut_loop_pair_loop_fwd
(t : Type0) (l : list_t t) (l0 : list_t t) (i : u32) :