Definition addr := nat.(* Le type des adresses *)
Definition Memo := list BV.(* Le type des memoires *)
Definition MemoSize := length (A:=BV).(* taille d'une memoire *)

(* Une memoire de taille donnee, initialisee avec un certain BV *)
Definition MemoEmpty (n : nat) (v : BV) : Memo := list_const BV n v.(* Une zone de memoire commencant a une addresse, de longueur donnee *)
Definition MemoZone : Memo -> addr -> nat -> Memo := sublist BV.Definition MemoRead : Memo -> addr -> Memo := elemlist BV.Definition MemoWrite : Memo -> addr -> BV -> Memo := replace BV.(* Adresse OK si elle est strictement inferieure a la taille de la memoire *)
Definition AddrOK (m : Memo) (a : addr) : Prop := a < MemoSize m.Definition MMemo (v : BV) : Memo := v :: nil.

(* Specifications: *)
Lemma read_write : forall (m : Memo) (a : addr) (v : BV), AddrOK m a -> MemoRead (MemoWrite m a v) a = MMemo v.