paulson@15094: (* Title : Fact.thy paulson@12196: Author : Jacques D. Fleuriot paulson@12196: Copyright : 1998 University of Cambridge paulson@15094: Conversion to Isar and new proofs by Lawrence C Paulson, 2004 paulson@12196: *) paulson@12196: paulson@15094: header{*Factorial Function*} paulson@15094: nipkow@15131: theory Fact huffman@30073: imports Main nipkow@15131: begin paulson@15094: paulson@15094: consts fact :: "nat => nat" paulson@15094: primrec wenzelm@19765: fact_0: "fact 0 = 1" wenzelm@19765: fact_Suc: "fact (Suc n) = (Suc n) * fact n" paulson@15094: paulson@15094: paulson@15094: lemma fact_gt_zero [simp]: "0 < fact n" nipkow@25134: by (induct n) auto paulson@15094: paulson@15094: lemma fact_not_eq_zero [simp]: "fact n \ 0" nipkow@25162: by simp paulson@15094: chaieb@29693: lemma of_nat_fact_not_zero [simp]: "of_nat (fact n) \ (0::'a::semiring_char_0)" nipkow@25134: by auto paulson@15094: chaieb@29693: class ordered_semiring_1 = ordered_semiring + semiring_1 chaieb@29693: class ordered_semiring_1_strict = ordered_semiring_strict + semiring_1 paulson@15094: chaieb@29693: lemma of_nat_fact_gt_zero [simp]: "(0::'a::{ordered_semidom}) < of_nat(fact n)" by auto chaieb@29693: chaieb@29693: lemma of_nat_fact_ge_zero [simp]: "(0::'a::ordered_semidom) \ of_nat(fact n)" nipkow@25134: by simp paulson@15094: paulson@15094: lemma fact_ge_one [simp]: "1 \ fact n" nipkow@25134: by (induct n) auto paulson@12196: paulson@15094: lemma fact_mono: "m \ n ==> fact m \ fact n" nipkow@25134: apply (drule le_imp_less_or_eq) nipkow@25134: apply (auto dest!: less_imp_Suc_add) nipkow@25134: apply (induct_tac k, auto) nipkow@25134: done paulson@15094: paulson@15094: text{*Note that @{term "fact 0 = fact 1"}*} paulson@15094: lemma fact_less_mono: "[| 0 < m; m < n |] ==> fact m < fact n" nipkow@25134: apply (drule_tac m = m in less_imp_Suc_add, auto) nipkow@25134: apply (induct_tac k, auto) nipkow@25134: done paulson@15094: chaieb@29693: lemma inv_of_nat_fact_gt_zero [simp]: "(0::'a::ordered_field) < inverse (of_nat (fact n))" nipkow@25134: by (auto simp add: positive_imp_inverse_positive) paulson@15094: chaieb@29693: lemma inv_of_nat_fact_ge_zero [simp]: "(0::'a::ordered_field) \ inverse (of_nat (fact n))" nipkow@25134: by (auto intro: order_less_imp_le) paulson@15094: paulson@15094: lemma fact_diff_Suc [rule_format]: nipkow@25134: "n < Suc m ==> fact (Suc m - n) = (Suc m - n) * fact (m - n)" nipkow@25134: apply (induct n arbitrary: m) nipkow@25134: apply auto huffman@30082: apply (drule_tac x = "m - Suc 0" in meta_spec, auto) nipkow@25134: done paulson@15094: chaieb@29693: lemma fact_num0: "fact 0 = 1" nipkow@25134: by auto paulson@15094: paulson@15094: lemma fact_num_eq_if: "fact m = (if m=0 then 1 else m * fact (m - 1))" nipkow@25134: by (cases m) auto paulson@15094: paulson@15094: lemma fact_add_num_eq_if: nipkow@25134: "fact (m + n) = (if m + n = 0 then 1 else (m + n) * fact (m + n - 1))" nipkow@25134: by (cases "m + n") auto paulson@15094: paulson@15094: lemma fact_add_num_eq_if2: nipkow@25134: "fact (m + n) = (if m = 0 then fact n else (m + n) * fact ((m - 1) + n))" nipkow@25134: by (cases m) auto paulson@12196: nipkow@15131: end