theory Demo8 imports Main begin -- "splitting case: manually" lemma "(case n of 0 \ x | Suc n' \ x) = x" -- "apply simp" apply (simp split: nat.splits) done -- "splitting if: automatic in conclusion" lemma "\ P; Q \ \ (if x then A else B) = z" apply simp oops lemma "\ (if x then A else B) = z; Q \ \ P" apply (simp split: split_if_asm) oops thm conj_cong lemma "A \ (A \ B)" -- " apply simp" apply (simp cong: conj_cong) oops thm if_cong lemma "\ (if x then x \ z else B) = z; Q \ \ P" -- " apply simp" apply (simp cong: if_cong) oops thm add_ac thm mult_ac lemma fixes f :: "'a \ 'a \ 'a" (infix "\" 70) assumes A: "\x y z. (x \ y) \ z = x \ (y \ z)" assumes C: "\x y. x \ y = y \ x" assumes AC: "\x y z. x \ (y \ z) = y \ (x \ z)" shows "(z \ x) \ (y \ v) = something" apply (simp only: C) apply (simp only: A C) apply (simp only: AC) oops text {* when all else fails: tracing the simplifier Isabelle/Isar -> Settings -> Trace Simplifier, then Proof-General -> Buffers -> Trace *} lemma "A \ (A \ B)" -- " apply simp" apply (simp cong: conj_cong) oops -- "single stepping: subst" thm add_commute lemma "a + b = x + (y::nat)" apply (subst add_commute) back -- "since Isabelle2005 also: apply (subst (asm) some_thm)" oops -- -------------------------------------------- section "More Isar" text {* . = by assumption, .. = by rule *} lemma "\ A; B \ \ B \ A" proof assume "A" and "B" show "A" . show "B" . qed lemma "\ A; B \ \ B \ A" proof - assume "A" and "B" show "B \ A" .. qed text {* backward/forward *} lemma "A \ B \ B \ A" proof assume AB: "A \ B" from AB show "B \ A" proof assume "A" "B" show "B \ A" .. qed qed text{* fix *} lemma assumes P: "\x. P x" shows "\x. P (f x)" proof fix a from P show "P (f a)" .. qed text{* Proof text can only refer to global constants, free variables in the lemma, and local names introduced via fix or obtain. *} lemma assumes Pf: "\x. P (f x)" shows "\y. P y" proof - from Pf show ?thesis proof fix x assume "P (f x)" show ?thesis .. qed qed text {* obtain *} lemma assumes Pf: "\x. P (f x)" shows "\y. P y" proof - from Pf obtain x where "P(f x)" .. thus "\y. P y" .. qed lemma assumes ex: "\x. \y. P x y" shows "\y. \x. P x y" proof fix y from ex obtain x where "\y. P x y" .. hence "P x y" .. thus "\x. P x y" .. qed lemma assumes A: "\x y. P x y \ Q x y" shows "\x y. P x y \ Q x y" proof - from A obtain x y where P: "P x y" and Q: "Q x y" by blast thus ?thesis by blast qed lemma "\x. P x \ (\x. P x)" oops text {* moreover *} thm mono_def monoI lemma assumes mono_f: "mono (f::int\int)" and mono_g: "mono (g::int\int)" shows "mono (\i. f i + g i)" proof fix i and j :: "int" assume A: "i \ j" from A mono_f have "f i \ f j" by (simp add: mono_def) moreover from A mono_g have "g i \ g j" by (simp add: mono_def) ultimately show "f i + g i \ f j + g j" by auto qed end