diff options
author | Guillaume Boisseau | 2024-05-24 17:10:02 +0200 |
---|---|---|
committer | GitHub | 2024-05-24 17:10:02 +0200 |
commit | 4971b7edf4538144df735f9fa5327fe4d0e2e003 (patch) | |
tree | 979ed531f66c3b0040fa5714fa70db606ca786c0 /tests/fstar/hashmap_main/HashmapMain.Properties.fst | |
parent | fbfa0e13ab56ee847e891fa7d798d2eb226b6794 (diff) | |
parent | 3adbe18d36df3767e98f30b760ccd9c6ace640ad (diff) |
Merge pull request #206 from AeneasVerif/subdir
Diffstat (limited to 'tests/fstar/hashmap_main/HashmapMain.Properties.fst')
-rw-r--r-- | tests/fstar/hashmap_main/HashmapMain.Properties.fst | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/tests/fstar/hashmap_main/HashmapMain.Properties.fst b/tests/fstar/hashmap_main/HashmapMain.Properties.fst new file mode 100644 index 00000000..beb3dc2c --- /dev/null +++ b/tests/fstar/hashmap_main/HashmapMain.Properties.fst @@ -0,0 +1,48 @@ +(** Properties about the hashmap written on disk *) +module HashmapMain.Properties +open Primitives +open HashmapMain.Funs + +#set-options "--z3rlimit 50 --fuel 0 --ifuel 1" + +/// Below, we focus on the functions to read from disk/write to disk to showcase +/// how such reasoning which mixes opaque functions together with a state-error +/// monad can be performed. + +(*** Hypotheses *) + +/// [state_v] gives us the hash map currently stored on disk +assume +val state_v : state -> hashmap_HashMap_t u64 + +/// [serialize] updates the hash map stored on disk +assume +val serialize_lem (hm : hashmap_HashMap_t u64) (st : state) : Lemma ( + match hashmap_utils_serialize hm st with + | Fail _ -> True + | Ok (st', ()) -> state_v st' == hm) + [SMTPat (hashmap_utils_serialize hm st)] + +/// [deserialize] gives us the hash map stored on disk, without updating it +assume +val deserialize_lem (st : state) : Lemma ( + match hashmap_utils_deserialize st with + | Fail _ -> True + | Ok (st', hm) -> hm == state_v st /\ st' == st) + [SMTPat (hashmap_utils_deserialize st)] + +(*** Lemmas *) + +/// The obvious lemma about [insert_on_disk]: the updated hash map stored on disk +/// is exactly the hash map produced from inserting the binding ([key], [value]) +/// in the hash map previously stored on disk. +val insert_on_disk_lem (key : usize) (value : u64) (st : state) : Lemma ( + match insert_on_disk key value st with + | Fail _ -> True + | Ok (st', ()) -> + let hm = state_v st in + match hashmap_HashMap_insert u64 hm key value with + | Fail _ -> False + | Ok hm' -> hm' == state_v st') + +let insert_on_disk_lem key value st = () |