Theory QuotRem

Up to index of Isabelle/HOL/Extraction

theory QuotRem
imports Util
begin

(*  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 + rr  b