summaryrefslogtreecommitdiff
path: root/tests/fstar-split/hashmap_on_disk/HashmapMain.Properties.fst
diff options
context:
space:
mode:
authorSon Ho2023-12-22 23:23:30 +0100
committerSon Ho2023-12-22 23:23:30 +0100
commita0c58326c43a7a8026b3d4c158017bf126180e90 (patch)
tree504577e3014997388a0e9c736998df877d1c1674 /tests/fstar-split/hashmap_on_disk/HashmapMain.Properties.fst
parent9a8e43df626400aacdfcb9d2cf2eec38d71d2d73 (diff)
Regenerate the test files and add the fstar-split tests
Diffstat (limited to 'tests/fstar-split/hashmap_on_disk/HashmapMain.Properties.fst')
-rw-r--r--tests/fstar-split/hashmap_on_disk/HashmapMain.Properties.fst48
1 files changed, 48 insertions, 0 deletions
diff --git a/tests/fstar-split/hashmap_on_disk/HashmapMain.Properties.fst b/tests/fstar-split/hashmap_on_disk/HashmapMain.Properties.fst
new file mode 100644
index 00000000..358df29e
--- /dev/null
+++ b/tests/fstar-split/hashmap_on_disk/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
+ | Return (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
+ | Return (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
+ | Return (st', ()) ->
+ let hm = state_v st in
+ match hashmap_HashMap_insert u64 hm key value with
+ | Fail _ -> False
+ | Return hm' -> hm' == state_v st')
+
+let insert_on_disk_lem key value st = ()