summaryrefslogtreecommitdiff
path: root/tests/fstar/hashmap_main/HashmapMain.Properties.fst
diff options
context:
space:
mode:
authorGuillaume Boisseau2024-05-24 17:10:02 +0200
committerGitHub2024-05-24 17:10:02 +0200
commit4971b7edf4538144df735f9fa5327fe4d0e2e003 (patch)
tree979ed531f66c3b0040fa5714fa70db606ca786c0 /tests/fstar/hashmap_main/HashmapMain.Properties.fst
parentfbfa0e13ab56ee847e891fa7d798d2eb226b6794 (diff)
parent3adbe18d36df3767e98f30b760ccd9c6ace640ad (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.fst48
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 = ()