Definition get_val_equiv s s' : Prop :=
  forall k, get_val k s = get_val k s'.

(* Specifications: *)
Lemma poram_lift_change_post {X Y} (Pre Post Post' : state -> state -> Prop) {P : X -> Y -> Prop} (m : Poram X) (m' : Poram Y) : (forall s s', well_formed s -> well_formed s' -> Post s s' -> Post' s s') -> poram_lift2 Pre Post P m m' -> poram_lift2 Pre Post' P m m'.
Lemma get_val_equiv_state_equiv : forall s s', well_formed s -> well_formed s' -> get_val_equiv s s' -> state_equiv s s'.
Lemma blk_in_state_imp_kv_rel s k v: blk_in_state k v s -> kv_rel k v s.
Lemma undef_imp_kv_rel s k : undef k s -> kv_rel k 0 s.
Lemma state_equiv_get_val_equiv : forall s s', well_formed s -> well_formed s' -> state_equiv s s' -> get_val_equiv s s'.
Lemma read_wf k : poram_lift triv triv triv (read k).
Lemma read_pres_state k v k' : poram_lift (blk_in_state k v) (blk_in_state k v) triv (read k').
Lemma read_undef k k' : poram_lift (undef k) (undef k) triv (read k').
Lemma read_undef_0 k : poram_lift (undef k) triv (eq 0) (read k).
Lemma read_pres_kv k v k' : poram_lift (kv_rel k v) (kv_rel k v) triv (read k').
Lemma read_state_val k v : poram_lift (blk_in_state k v) triv (eq v) (read k).
Lemma read_val k v : poram_lift (kv_rel k v) triv (eq v) (read k).
Lemma read_val_kv k v : poram_lift (kv_rel k v) (kv_rel k v) (eq v) (read k).
Lemma write_wf k v : poram_lift triv triv triv (write k v).
Lemma write_undef k k' v : k <> k' -> poram_lift (undef k') (undef k') triv (write k v).
Lemma state_plift_pre {S X} (Pre Pre' Post : S -> Prop) (P : X -> Prop) (m : StateT S dist X) : (forall s, Pre' s -> Pre s) -> state_plift Pre Post P m -> state_plift Pre' Post P m.
Lemma write_state_val_eq k v : poram_lift triv (blk_in_state k v) triv (write k v).
Lemma write_val_eq k v : poram_lift triv (kv_rel k v) triv (write k v).
Lemma write_state_val_neq k v k' v' : k <> k' -> poram_lift (blk_in_state k' v') (blk_in_state k' v') triv (write k v).
Lemma write_val_neq k v k' v' : k <> k' -> poram_lift (kv_rel k' v') (kv_rel k' v') triv (write k v).
Lemma poram_lift_change_post {X Y} (Pre Post Post' : state -> state -> Prop) {P : X -> Y -> Prop} (m : Poram X) (m' : Poram Y) : (forall s s', well_formed s -> well_formed s' -> Post s s' -> Post' s s') -> poram_lift2 Pre Post P m m' -> poram_lift2 Pre Post' P m m'.
Lemma get_val_equiv_state_equiv : forall s s', well_formed s -> well_formed s' -> get_val_equiv s s' -> state_equiv s s'.
Lemma blk_in_state_imp_kv_rel s k v: blk_in_state k v s -> kv_rel k v s.
Lemma undef_imp_kv_rel s k : undef k s -> kv_rel k 0 s.
Lemma state_equiv_get_val_equiv : forall s s', well_formed s -> well_formed s' -> state_equiv s s' -> get_val_equiv s s'.
Lemma read_wf k : poram_lift triv triv triv (read k).
Lemma read_pres_state k v k' : poram_lift (blk_in_state k v) (blk_in_state k v) triv (read k').
Lemma read_undef k k' : poram_lift (undef k) (undef k) triv (read k').
Lemma read_undef_0 k : poram_lift (undef k) triv (eq 0) (read k).
Lemma read_pres_kv k v k' : poram_lift (kv_rel k v) (kv_rel k v) triv (read k').
Lemma read_state_val k v : poram_lift (blk_in_state k v) triv (eq v) (read k).
Lemma read_val k v : poram_lift (kv_rel k v) triv (eq v) (read k).
Lemma read_val_kv k v : poram_lift (kv_rel k v) (kv_rel k v) (eq v) (read k).
Lemma write_wf k v : poram_lift triv triv triv (write k v).
Lemma write_undef k k' v : k <> k' -> poram_lift (undef k') (undef k') triv (write k v).
Lemma state_plift_pre {S X} (Pre Pre' Post : S -> Prop) (P : X -> Prop) (m : StateT S dist X) : (forall s, Pre' s -> Pre s) -> state_plift Pre Post P m -> state_plift Pre' Post P m.
Lemma write_state_val_eq k v : poram_lift triv (blk_in_state k v) triv (write k v).
Lemma write_val_eq k v : poram_lift triv (kv_rel k v) triv (write k v).
Lemma write_state_val_neq k v k' v' : k <> k' -> poram_lift (blk_in_state k' v') (blk_in_state k' v') triv (write k v).
Lemma write_val_neq k v k' v' : k <> k' -> poram_lift (kv_rel k' v') (kv_rel k' v') triv (write k v).