Require Import ZArith. Require Import String. Open Scope Z. Ltac instexist H P := elim H;clear H;intro P;intro H. Inductive iarith : Type := Const : Z -> iarith | Var : string -> iarith | Plus : iarith -> iarith -> iarith | Minus : iarith -> iarith -> iarith | Times : iarith -> iarith -> iarith. Definition store : Set := string -> Z. Fixpoint eval_arith (s:store) (a:iarith) : Z := match a with Const n => n | Var v => s v | Plus a1 a2 => (eval_arith s a1)+(eval_arith s a2) | Minus a1 a2 => (eval_arith s a1)-(eval_arith s a2) | Times a1 a2 => (eval_arith s a1)*(eval_arith s a2) end. Definition Divides (x y : Z) : Prop := exists q:Z, y=x*q. Fixpoint adivides (m:Z) (a:iarith) : Prop := match a with Const n => Divides m n | Var _ => True | Plus a1 a2 | Minus a1 a2 | Times a1 a2 => (adivides m a1) /\ (adivides m a2) end. Definition sdivides (m:Z) (s:store) : Prop := forall (v:string) (n:Z), (s v)=n -> Divides m n. Theorem mytheorem: forall (m:Z) (a:iarith) (s:store), (sdivides m s) -> (adivides m a) -> (Divides m (eval_arith s a)). Proof. (* Complete the proof here. *)