diff options
author | Son Ho | 2023-01-05 23:11:26 +0100 |
---|---|---|
committer | Son HO | 2023-02-03 11:21:46 +0100 |
commit | efba91b5cc65d83c3f4d8a0d282eeda520abe82a (patch) | |
tree | 9af8c05626e89bf0f5abc94ff443b3f8194d6903 /tests/fstar | |
parent | ace526e4d32d17ab73bcc2cdb3726cddcae8b1c4 (diff) |
Add more loop examples and fix issues
Diffstat (limited to '')
-rw-r--r-- | tests/fstar/misc/Loops.Clauses.Template.fst | 18 | ||||
-rw-r--r-- | tests/fstar/misc/Loops.Clauses.fst | 20 | ||||
-rw-r--r-- | tests/fstar/misc/Loops.Funs.fst | 138 |
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) : |