Definition pfun := X -> option Y.Definition pfun_eq (f1 f2 : pfun) := forall s, (f1 s) = (f2 s).Global Instance EquivalencePfun : Equivalence pfun_eq.Definition emptyFun : pfun := fun _ => None.Definition pfun_update (f : pfun) (x : X) (y : Y) :=
    fun z => if x ?[ eq ] z then Some y else f z.Definition pfun_in (f : pfun) (x : X) : Prop := exists y, f x = Some y.

(* Specifications: *)
Lemma update_shadow (f : pfun) (x : X) (y1 y2 : Y) : pfun_eq (pfun_update (pfun_update f x y1) x y2) (pfun_update f x y2).
Lemma update_lookup (f : pfun) (x : X) (y : Y) : (pfun_update f x y) x = Some y.
Lemma update_lookup_neq (f : pfun) (x z : X) (y : Y) (H: x <> z) : (pfun_update f x y) z = f z.
Lemma update_commute (f : X -> option Y) (x1 x2 : X) (y1 y2 : Y) (H : x1 <> x2) : pfun_eq (pfun_update (pfun_update f x1 y1) x2 y2) (pfun_update (pfun_update f x2 y2) x1 y1).