Section InterpAsmProperties.
Context {E': Type -> Type}.
Notation E := (Reg +' Memory +' E').
(** This interpreter is compatible with the equivalence-up-to-tau. *)
Global Instance eutt_interp_asm {R}:
Proper (@eutt E R R eq ==> eq ==> eq ==> @eutt E' (prod memory (prod registers R)) (prod _ (prod _ R)) eq) interp_asm.

(** [interp_asm] commutes with [bind]. *)
Lemma interp_asm_bind: forall {R S} (t: itree E R) (k: R -> itree _ S) (regs : registers) (mem: memory),
@eutt E' _ _ eq (interp_asm (ITree.bind t k) mem regs)
(ITree.bind (interp_asm t mem regs) (fun '(mem', (regs', x)) => interp_asm (k x) mem' regs')).