diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/coq/misc/Loops.v | 136 | ||||
-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 |
4 files changed, 312 insertions, 0 deletions
diff --git a/tests/coq/misc/Loops.v b/tests/coq/misc/Loops.v index 4fc68e1c..ec8fa39c 100644 --- a/tests/coq/misc/Loops.v +++ b/tests/coq/misc/Loops.v @@ -62,6 +62,29 @@ Definition sum_with_shared_borrows_fwd (n : nat) (max : u32) : result u32 := sum_with_shared_borrows_loop_fwd n max (0%u32) (0%u32) . +(** [loops::clear] *) +Definition clear_loop_fwd_back + (n : nat) (v : vec u32) (i : usize) : result (vec u32) := + match n with + | O => Fail_ OutOfFuel + | S n0 => + let i0 := vec_len u32 v in + if i s< i0 + then ( + i1 <- usize_add i 1%usize; + v0 <- vec_index_mut_back u32 v i (0%u32); + v1 <- clear_loop_fwd n0 v0 i1; + let _ := v1 in + Return v0) + else Return v + end +. + +(** [loops::clear] *) +Definition clear_fwd_back (n : nat) (v : vec u32) : result (vec u32) := + v0 <- clear_loop_fwd n v (0%usize); let _ := v0 in Return v +. + (** [loops::List] *) Inductive List_t (T : Type) := | ListCons : T -> List_t T -> List_t T @@ -71,6 +94,25 @@ Inductive List_t (T : Type) := Arguments ListCons {T} _ _. Arguments ListNil {T}. +(** [loops::list_mem] *) +Fixpoint list_mem_loop_fwd + (n : nat) (i : u32) (ls : List_t u32) : result bool := + match n with + | O => Fail_ OutOfFuel + | S n0 => + match ls with + | ListCons y tl => + if y s= i then Return true else list_mem_loop_fwd n0 i tl + | ListNil => Return false + end + end +. + +(** [loops::list_mem] *) +Definition list_mem_fwd (n : nat) (x : u32) (ls : List_t u32) : result bool := + list_mem_loop_fwd n x ls +. + (** [loops::list_nth_mut_loop] *) Fixpoint list_nth_mut_loop_loop_fwd (T : Type) (n : nat) (ls : List_t T) (i : u32) : result T := @@ -144,6 +186,100 @@ Definition list_nth_shared_loop_fwd list_nth_shared_loop_loop_fwd T n ls i . +(** [loops::id_mut] *) +Definition id_mut_fwd (T : Type) (ls : List_t T) : result (List_t T) := + Return ls +. + +(** [loops::id_mut] *) +Definition id_mut_back + (T : Type) (ls : List_t T) (ret : List_t T) : result (List_t T) := + Return ret +. + +(** [loops::id_shared] *) +Definition id_shared_fwd (T : Type) (ls : List_t T) : result (List_t T) := + Return ls +. + +(** [loops::list_nth_mut_loop_with_id] *) +Fixpoint list_nth_mut_loop_with_id_loop_fwd + (T : Type) (n : nat) (i : u32) (ls : List_t T) : result T := + match n with + | O => Fail_ OutOfFuel + | S n0 => + match ls with + | ListCons x tl => + if i s= 0%u32 + then Return x + else ( + i0 <- u32_sub i 1%u32; list_nth_mut_loop_with_id_loop_fwd T n0 i0 tl) + | ListNil => Fail_ Failure + end + end +. + +(** [loops::list_nth_mut_loop_with_id] *) +Definition list_nth_mut_loop_with_id_fwd + (T : Type) (n : nat) (ls : List_t T) (i : u32) : result T := + ls0 <- id_mut_fwd T ls; list_nth_mut_loop_with_id_loop_fwd T n i ls0 +. + +(** [loops::list_nth_mut_loop_with_id] *) +Fixpoint list_nth_mut_loop_with_id_loop_back + (T : Type) (n : nat) (i : u32) (ls : List_t T) (ret : T) : + result (List_t T) + := + match n with + | O => Fail_ OutOfFuel + | S n0 => + match ls with + | ListCons x tl => + if i s= 0%u32 + then Return (ListCons ret tl) + else ( + i0 <- u32_sub i 1%u32; + l <- list_nth_mut_loop_with_id_loop_back T n0 i0 tl ret; + Return (ListCons x l)) + | ListNil => Fail_ Failure + end + end +. + +(** [loops::list_nth_mut_loop_with_id] *) +Definition list_nth_mut_loop_with_id_back + (T : Type) (n : nat) (ls : List_t T) (i : u32) (ret : T) : + result (List_t T) + := + ls0 <- id_mut_fwd T ls; + l <- list_nth_mut_loop_with_id_loop_back T n i ls0 ret; + id_mut_back T ls l +. + +(** [loops::list_nth_shared_loop_with_id] *) +Fixpoint list_nth_shared_loop_with_id_loop_fwd + (T : Type) (n : nat) (l : List_t T) (i : u32) (ls : List_t T) : result T := + match n with + | O => Fail_ OutOfFuel + | S n0 => + match ls with + | ListCons x tl => + if i s= 0%u32 + then Return x + else ( + i0 <- u32_sub i 1%u32; + list_nth_shared_loop_with_id_loop_fwd T n0 l i0 tl) + | ListNil => Fail_ Failure + end + end +. + +(** [loops::list_nth_shared_loop_with_id] *) +Definition list_nth_shared_loop_with_id_fwd + (T : Type) (n : nat) (ls : List_t T) (i : u32) : result T := + ls0 <- id_shared_fwd T ls; list_nth_shared_loop_with_id_loop_fwd T n ls i ls0 +. + (** [loops::list_nth_mut_loop_pair] *) Fixpoint list_nth_mut_loop_pair_loop_fwd (T : Type) (n : nat) (l : List_t T) (l0 : List_t T) (i : u32) : 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) : |