induct: fixes P :: "tm \<Rightarrow> tm \<Rightarrow> bool"   and a0 :: "tm"   and a1 :: "tm" assumes "\<And>n1 c1 r1 n2 c2 r2. \<lbrakk>\<And>x. \<lbrakk>n1 = n2; x = c1 +\<^sub>p c2; x = 0\<^sub>p\<rbrakk> \<Longrightarrow> P r1 r2; \<And>x. \<lbrakk>n1 = n2; x = c1 +\<^sub>p c2; x \<noteq> 0\<^sub>p\<rbrakk> \<Longrightarrow> P r1 r2; \<lbrakk>n1 \<noteq> n2; n1 \<le> n2\<rbrakk> \<Longrightarrow> P r1 (CNP n2 c2 r2); \<lbrakk>n1 \<noteq> n2; \<not> n1 \<le> n2\<rbrakk> \<Longrightarrow> P (CNP n1 c1 r1) r2\<rbrakk> \<Longrightarrow> P (CNP n1 c1 r1) (CNP n2 c2 r2)"   and "\<And>n1 c1 r1 v. P r1 (CP v) \<Longrightarrow> P (CNP n1 c1 r1) (CP v)"   and "\<And>n1 c1 r1 v. P r1 (tm.Bound v) \<Longrightarrow> P (CNP n1 c1 r1) (tm.Bound v)"   and "\<And>n1 c1 r1 v va. P r1 (tm.Add v va) \<Longrightarrow> P (CNP n1 c1 r1) (tm.Add v va)"   and "\<And>n1 c1 r1 v va. P r1 (tm.Mul v va) \<Longrightarrow> P (CNP n1 c1 r1) (tm.Mul v va)"   and "\<And>n1 c1 r1 v. P r1 (tm.Neg v) \<Longrightarrow> P (CNP n1 c1 r1) (tm.Neg v)"   and "\<And>n1 c1 r1 v va. P r1 (tm.Sub v va) \<Longrightarrow> P (CNP n1 c1 r1) (tm.Sub v va)"   and "\<And>v n2 c2 r2. P (CP v) r2 \<Longrightarrow> P (CP v) (CNP n2 c2 r2)"   and "\<And>v n2 c2 r2. P (tm.Bound v) r2 \<Longrightarrow> P (tm.Bound v) (CNP n2 c2 r2)"   and "\<And>v va n2 c2 r2. P (tm.Add v va) r2 \<Longrightarrow> P (tm.Add v va) (CNP n2 c2 r2)"   and "\<And>v va n2 c2 r2. P (tm.Mul v va) r2 \<Longrightarrow> P (tm.Mul v va) (CNP n2 c2 r2)"   and "\<And>v n2 c2 r2. P (tm.Neg v) r2 \<Longrightarrow> P (tm.Neg v) (CNP n2 c2 r2)"   and "\<And>v va n2 c2 r2. P (tm.Sub v va) r2 \<Longrightarrow> P (tm.Sub v va) (CNP n2 c2 r2)"   and "\<And>b1 b2. P (CP b1) (CP b2)"   and "\<And>v va. P (CP v) (tm.Bound va)"   and "\<And>v va vb. P (CP v) (tm.Add va vb)"   and "\<And>v va vb. P (CP v) (tm.Mul va vb)"   and "\<And>v va. P (CP v) (tm.Neg va)"   and "\<And>v va vb. P (CP v) (tm.Sub va vb)"   and "\<And>v va. P (tm.Bound v) (CP va)"   and "\<And>v va. P (tm.Bound v) (tm.Bound va)"   and "\<And>v va vb. P (tm.Bound v) (tm.Add va vb)"   and "\<And>v va vb. P (tm.Bound v) (tm.Mul va vb)"   and "\<And>v va. P (tm.Bound v) (tm.Neg va)"   and "\<And>v va vb. P (tm.Bound v) (tm.Sub va vb)"   and "\<And>v va vb. P (tm.Add v va) (CP vb)"   and "\<And>v va vb. P (tm.Add v va) (tm.Bound vb)"   and "\<And>v va vb vc. P (tm.Add v va) (tm.Add vb vc)"   and "\<And>v va vb vc. P (tm.Add v va) (tm.Mul vb vc)"   and "\<And>v va vb. P (tm.Add v va) (tm.Neg vb)"   and "\<And>v va vb vc. P (tm.Add v va) (tm.Sub vb vc)"   and "\<And>v va vb. P (tm.Mul v va) (CP vb)"   and "\<And>v va vb. P (tm.Mul v va) (tm.Bound vb)"   and "\<And>v va vb vc. P (tm.Mul v va) (tm.Add vb vc)"   and "\<And>v va vb vc. P (tm.Mul v va) (tm.Mul vb vc)"   and "\<And>v va vb. P (tm.Mul v va) (tm.Neg vb)"   and "\<And>v va vb vc. P (tm.Mul v va) (tm.Sub vb vc)"   and "\<And>v va. P (tm.Neg v) (CP va)"   and "\<And>v va. P (tm.Neg v) (tm.Bound va)"   and "\<And>v va vb. P (tm.Neg v) (tm.Add va vb)"   and "\<And>v va vb. P (tm.Neg v) (tm.Mul va vb)"   and "\<And>v va. P (tm.Neg v) (tm.Neg va)"   and "\<And>v va vb. P (tm.Neg v) (tm.Sub va vb)"   and "\<And>v va vb. P (tm.Sub v va) (CP vb)"   and "\<And>v va vb. P (tm.Sub v va) (tm.Bound vb)"   and "\<And>v va vb vc. P (tm.Sub v va) (tm.Add vb vc)"   and "\<And>v va vb vc. P (tm.Sub v va) (tm.Mul vb vc)"   and "\<And>v va vb. P (tm.Sub v va) (tm.Neg vb)"   and "\<And>v va vb vc. P (tm.Sub v va) (tm.Sub vb vc)"   and "\<And>va v. P (tm.Bound va) (CP v)"   and "\<And>va vb v. P (tm.Add va vb) (CP v)"   and "\<And>va vb v. P (tm.Mul va vb) (CP v)"   and "\<And>va v. P (tm.Neg va) (CP v)"   and "\<And>va vb v. P (tm.Sub va vb) (CP v)"   and "\<And>va v. P (CP va) (tm.Bound v)"   and "\<And>va v. P (tm.Bound va) (tm.Bound v)"   and "\<And>va vb v. P (tm.Add va vb) (tm.Bound v)"   and "\<And>va vb v. P (tm.Mul va vb) (tm.Bound v)"   and "\<And>va v. P (tm.Neg va) (tm.Bound v)"   and "\<And>va vb v. P (tm.Sub va vb) (tm.Bound v)"   and "\<And>vb v va. P (CP vb) (tm.Add v va)"   and "\<And>vb v va. P (tm.Bound vb) (tm.Add v va)"   and "\<And>vb vc v va. P (tm.Add vb vc) (tm.Add v va)"   and "\<And>vb vc v va. P (tm.Mul vb vc) (tm.Add v va)"   and "\<And>vb v va. P (tm.Neg vb) (tm.Add v va)"   and "\<And>vb vc v va. P (tm.Sub vb vc) (tm.Add v va)"   and "\<And>vb v va. P (CP vb) (tm.Mul v va)"   and "\<And>vb v va. P (tm.Bound vb) (tm.Mul v va)"   and "\<And>vb vc v va. P (tm.Add vb vc) (tm.Mul v va)"   and "\<And>vb vc v va. P (tm.Mul vb vc) (tm.Mul v va)"   and "\<And>vb v va. P (tm.Neg vb) (tm.Mul v va)"   and "\<And>vb vc v va. P (tm.Sub vb vc) (tm.Mul v va)"   and "\<And>va v. P (CP va) (tm.Neg v)"   and "\<And>va v. P (tm.Bound va) (tm.Neg v)"   and "\<And>va vb v. P (tm.Add va vb) (tm.Neg v)"   and "\<And>va vb v. P (tm.Mul va vb) (tm.Neg v)"   and "\<And>va v. P (tm.Neg va) (tm.Neg v)"   and "\<And>va vb v. P (tm.Sub va vb) (tm.Neg v)"   and "\<And>vb v va. P (CP vb) (tm.Sub v va)"   and "\<And>vb v va. P (tm.Bound vb) (tm.Sub v va)"   and "\<And>vb vc v va. P (tm.Add vb vc) (tm.Sub v va)"   and "\<And>vb vc v va. P (tm.Mul vb vc) (tm.Sub v va)"   and "\<And>vb v va. P (tm.Neg vb) (tm.Sub v va)"   and "\<And>vb vc v va. P (tm.Sub vb vc) (tm.Sub v va)" shows "P a0 a1"