induct: fixes x1 :: "(char list \<Rightarrow> int option) \<times> nat \<Rightarrow> bool"   and x2 :: "com"   and x3 :: "(char list \<Rightarrow> int option) \<times> nat \<Rightarrow> bool"   and P :: "((char list \<Rightarrow> int option) \<times> nat \<Rightarrow> bool) \<Rightarrow> com \<Rightarrow> ((char list \<Rightarrow> int option) \<times> nat \<Rightarrow> bool) \<Rightarrow> bool" assumes "\<turnstile>\<^sub>3 {x1} x2 { x3}"   and "P ($ 1) SKIP ($ 0)"   and "\<And>x a v. P (lmaps_to_expr_x x a v \<and>* $ 1) (x ::= a) ((\<lambda>(s, c). dom s = vars a - {x} \<and> c = 0) \<and>* x \<hookrightarrow> v)"   and "\<And>Pa b c\<^sub>1 Q c\<^sub>2. \<lbrakk>\<turnstile>\<^sub>3 {\<lambda>(s, n). Pa (s, n) \<and> lmaps_to_axpr b True s} c\<^sub>1 { Q}; P (\<lambda>(s, n). Pa (s, n) \<and> lmaps_to_axpr b True s) c\<^sub>1 Q; \<turnstile>\<^sub>3 {\<lambda>(s, n). Pa (s, n) \<and> lmaps_to_axpr b False s} c\<^sub>2 { Q}; P (\<lambda>(s, n). Pa (s, n) \<and> lmaps_to_axpr b False s) c\<^sub>2 Q\<rbrakk> \<Longrightarrow> P ((\<lambda>(s, n). Pa (s, n) \<and> vars b \<subseteq> dom s) \<and>* $ 1) (IF b THEN c\<^sub>1 ELSE c\<^sub>2) Q"   and "\<And>Pa C Q F. \<lbrakk>\<turnstile>\<^sub>3 {Pa} C { Q}; P Pa C Q\<rbrakk> \<Longrightarrow> P (Pa \<and>* F) C (Q \<and>* F)"   and "\<And>Pa C\<^sub>1 Q C\<^sub>2 R. \<lbrakk>\<turnstile>\<^sub>3 {Pa} C\<^sub>1 { Q}; P Pa C\<^sub>1 Q; \<turnstile>\<^sub>3 {Q} C\<^sub>2 { R}; P Q C\<^sub>2 R\<rbrakk> \<Longrightarrow> P Pa (C\<^sub>1;; C\<^sub>2) R"   and "\<And>Pa b C. \<lbrakk>\<turnstile>\<^sub>3 {\<lambda>(s, n). Pa (s, n) \<and> lmaps_to_axpr b True s} C { Pa \<and>* $ 1}; P (\<lambda>(s, n). Pa (s, n) \<and> lmaps_to_axpr b True s) C (Pa \<and>* $ 1)\<rbrakk> \<Longrightarrow> P ((\<lambda>(s, n). Pa (s, n) \<and> vars b \<subseteq> dom s) \<and>* $ 1) (WHILE b DO C) (\<lambda>(s, n). Pa (s, n) \<and> lmaps_to_axpr b False s)"   and "\<And>Pa c Q P' Q'. \<lbrakk>\<turnstile>\<^sub>3 {Pa} c { Q}; P Pa c Q; \<And>s. P' s \<Longrightarrow> Pa s; \<And>s. Q s \<Longrightarrow> Q' s\<rbrakk> \<Longrightarrow> P P' c Q'"   and "\<And>Pa m C Q n. \<lbrakk>\<turnstile>\<^sub>3 {Pa \<and>* $ m} C { Q \<and>* $ n}; P (Pa \<and>* $ m) C (Q \<and>* $ n); n \<le> m\<rbrakk> \<Longrightarrow> P (Pa \<and>* $ (m - n)) C Q"   and "\<And>Pa C Q R. \<lbrakk>\<turnstile>\<^sub>3 {Pa} C { Q}; P Pa C Q; \<And>ps ps'. ps = ps' on UNIV - lvars C \<Longrightarrow> R ps = R ps'\<rbrakk> \<Longrightarrow> P (\<lambda>(ps, n). Pa (ps, n) \<and> R ps) C (\<lambda>(ps, n). Q (ps, n) \<and> R ps)"   and "\<And>x ds v. P ($ 1 \<and>* x \<hookrightarrow> ds) (x ::= N v) (x \<hookrightarrow> v)"   and "\<And>Pa a v x Q'. \<lbrakk>symeval Pa a v; \<turnstile>\<^sub>3 {Pa} x ::= N v { Q'}; P Pa (x ::= N v) Q'\<rbrakk> \<Longrightarrow> P Pa (x ::= a) Q'"   and "\<And>x a Q. P ((\<lambda>(ps, t). x \<in> dom ps \<and> vars a \<subseteq> dom ps \<and> Q (ps(x \<mapsto> paval a ps), t)) \<and>* $ 1) (x ::= a) Q"   and "\<And>c Q. P (\<lambda>(ps, n). False) c Q"   and "\<And>Pa Q c R. \<lbrakk>Pa \<Longrightarrow> \<turnstile>\<^sub>3 {Q} c { R}; Pa \<Longrightarrow> P Q c R\<rbrakk> \<Longrightarrow> P (\<up> Pa \<and>* Q) c R" shows "P x1 x2 x3"