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\<^sub>' {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>x v' v Q. P (x \<hookrightarrow> v' \<and>* (x \<hookrightarrow> v \<longrightarrow>* Q) \<and>* $ 1) (x ::= N v) Q"   and "\<And>x Q a. P (\<lambda>s. \<exists>xa. ((\<lambda>s. \<exists>xa. (x \<hookrightarrow> xa) s) \<and>* (x \<hookrightarrow> xa \<longrightarrow>* Q) \<and>* $ 1) s \<and> ((\<lambda>s. True) \<and>* (\<lambda>(ps, n). vars a \<subseteq> dom ps \<and> paval a ps = xa)) s) (x ::= a) Q"   and "\<And>Pa b c\<^sub>1 Q c\<^sub>2. \<lbrakk>\<turnstile>\<^sub>3\<^sub>' {\<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\<^sub>' {\<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\<^sub>' {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\<^sub>' {Pa} C\<^sub>1 { Q}; P Pa C\<^sub>1 Q; \<turnstile>\<^sub>3\<^sub>' {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\<^sub>' {\<lambda>(s, n). Pa (s, n) \<and> lmaps_to_axpr b True s} C { (\<lambda>(s, n). Pa (s, n) \<and> vars b \<subseteq> dom s) \<and>* $ 1}; P (\<lambda>(s, n). Pa (s, n) \<and> lmaps_to_axpr b True s) C ((\<lambda>(s, n). Pa (s, n) \<and> vars b \<subseteq> dom s) \<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' k Q'. \<lbrakk>\<turnstile>\<^sub>3\<^sub>' {Pa} c { Q}; P Pa c Q; \<And>s n. P' (s, n) \<Longrightarrow> Pa (s, k * n); \<And>s n. Q (s, n) \<Longrightarrow> Q' (s, n div k); 0 < k\<rbrakk> \<Longrightarrow> P P' c Q'"   and "\<And>Pa m C Q n. \<lbrakk>\<turnstile>\<^sub>3\<^sub>' {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>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\<^sub>' {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\<^sub>' {Q} c { R}; Pa \<Longrightarrow> P Q c R\<rbrakk> \<Longrightarrow> P (\<up> Pa \<and>* Q) c R" shows "P x1 x2 x3"