(* Title: HOL/Extraction/QuotRem.thy ID: $Id: QuotRem.thy,v 1.13 2007/11/13 09:55:08 berghofe Exp $ Author: Stefan Berghofer, TU Muenchen *) header {* Quotient and remainder *} theory QuotRem imports Util begin text {* Derivation of quotient and remainder using program extraction. *} theorem division: "∃r q. a = Suc b * q + r ∧ r ≤ b" proof (induct a) case 0 have "0 = Suc b * 0 + 0 ∧ 0 ≤ b" by simp thus ?case by iprover next case (Suc a) then obtain r q where I: "a = Suc b * q + r" and "r ≤ b" by iprover from nat_eq_dec show ?case proof assume "r = b" with I have "Suc a = Suc b * (Suc q) + 0 ∧ 0 ≤ b" by simp thus ?case by iprover next assume "r ≠ b" with `r ≤ b` have "r < b" by (simp add: order_less_le) with I have "Suc a = Suc b * q + (Suc r) ∧ (Suc r) ≤ b" by simp thus ?case by iprover qed qed extract division text {* The program extracted from the above proof looks as follows @{thm [display] division_def [no_vars]} The corresponding correctness theorem is @{thm [display] division_correctness [no_vars]} *} code_module Div contains test = "division 9 2" export_code division in SML end
theorem division:
∃r q. a = Suc b * q + r ∧ r ≤ b