# HG changeset patch # User berghofe # Date 1051518822 -7200 # Node ID 562fd03b266de9666dfebcfb670cba209651a056 # Parent 21615e44ba886cfb1ecca7f9a2c92b45f75346b9 Converted main proofs to Isar. diff -r 21615e44ba88 -r 562fd03b266d src/HOL/Extraction/Higman.thy --- a/src/HOL/Extraction/Higman.thy Mon Apr 28 09:58:12 2003 +0200 +++ b/src/HOL/Extraction/Higman.thy Mon Apr 28 10:33:42 2003 +0200 @@ -63,7 +63,7 @@ inductive bar intros bar1 [CPure.intro]: "ws \ good \ ws \ bar" - bar2 [CPure.intro]: "(\w. w # ws \ bar) \ ws \ bar" + bar2 [CPure.intro]: "(\w. w # ws \ bar) \ ws \ bar" theorem prop1: "([] # ws) \ bar" by rules @@ -127,67 +127,6 @@ apply rules+ done -theorem letter_cases: - "(a::letter) \ b \ (x = a \ P) \ (x = b \ P) \ P" - apply (case_tac a) - apply (case_tac b) - apply (case_tac x, simp, simp) - apply (case_tac x, simp, simp) - apply (case_tac b) - apply (case_tac x, simp, simp) - apply (case_tac x, simp, simp) - done - -theorem prop2: - "xs \ bar \ \ys. ys \ bar \ - (\a b zs. a \ b \ (xs, zs) \ T a \ (ys, zs) \ T b \ zs \ bar)" - apply (erule bar.induct) - apply (rule allI impI)+ - apply (rule bar1) - apply (rule lemma3) - apply assumption+ - apply (rule allI, rule impI) - apply (erule bar.induct) - apply (rule allI impI)+ - apply (rule bar1) - apply (rule lemma3, assumption, assumption) - apply (rule allI impI)+ - apply (rule bar2) - apply (rule allI) - apply (induct_tac w) - apply (rule prop1) - apply (rule_tac x=aa in letter_cases, assumption) - apply hypsubst - apply (erule_tac x=list in allE) - apply (erule conjE) - apply (erule_tac x=wsa in allE, erule impE) - apply (rule bar2) - apply rules - apply (erule allE, erule allE, erule_tac x="(a # list) # zs" in allE, - erule impE, assumption) - apply (erule impE) - apply (rule T1) - apply assumption - apply (erule mp) - apply (rule T2) - apply (erule not_sym) - apply assumption - apply hypsubst - apply (rotate_tac 1) - apply (erule_tac x=list in allE) - apply (erule conjE) - apply (erule allE, erule allE, erule_tac x="(b # list) # zs" in allE, - erule impE) - apply assumption - apply (erule impE) - apply (rule T2) - apply assumption - apply assumption - apply (erule mp) - apply (rule T1) - apply assumption - done - theorem lemma4 [rule_format]: "(ws, zs) \ R a \ ws \ [] \ (ws, zs) \ T a" apply (erule R.induct) apply rules @@ -208,10 +147,17 @@ apply simp done -theorem R_nil: "([], zs) \ R a \ zs = []" - by (erule R.elims, simp+) +lemma letter_neq: "(a::letter) \ b \ c \ a \ c = b" + apply (case_tac a) + apply (case_tac b) + apply (case_tac c, simp, simp) + apply (case_tac c, simp, simp) + apply (case_tac b) + apply (case_tac c, simp, simp) + apply (case_tac c, simp, simp) + done -theorem letter_eq_dec: "(a::letter) = b \ a \ b" +lemma letter_eq_dec: "(a::letter) = b \ a \ b" apply (case_tac a) apply (case_tac b) apply simp @@ -221,50 +167,92 @@ apply simp done -theorem prop3: "xs \ bar \ \zs. (xs, zs) \ R a \ zs \ bar" - apply (erule bar.induct) - apply (rule allI impI)+ - apply (rule bar1) - apply (rule lemma2) - apply assumption+ - apply (rule allI impI)+ - apply (case_tac ws) - apply simp - apply (drule R_nil) - apply simp_all - apply rules - apply (rule bar2) - apply (rule allI) - apply (induct_tac w) - apply (rule prop1) - apply (rule_tac a1=aaa and b1=a in disjE [OF letter_eq_dec]) - apply rules - apply (rule_tac xs="aa # list" and ys="lista # zs" and zs="(aaa # lista) # zs" - and b=aaa in prop2 [rule_format]) - apply (rule bar2) - apply rules - apply assumption - apply (erule not_sym) - apply (rule T2) - apply (erule not_sym) - apply (erule lemma4) - apply simp - apply (rule T0) - apply assumption+ - done +theorem prop2: + assumes ab: "a \ b" and bar: "xs \ bar" + shows "\ys zs. ys \ bar \ (xs, zs) \ T a \ (ys, zs) \ T b \ zs \ bar" using bar +proof induct + fix xs zs assume "xs \ good" and "(xs, zs) \ T a" + show "zs \ bar" by (rule bar1) (rule lemma3) +next + fix xs ys + assume I: "\w ys zs. ys \ bar \ (w # xs, zs) \ T a \ (ys, zs) \ T b \ zs \ bar" + assume "ys \ bar" + thus "\zs. (xs, zs) \ T a \ (ys, zs) \ T b \ zs \ bar" + proof induct + fix ys zs assume "ys \ good" and "(ys, zs) \ T b" + show "zs \ bar" by (rule bar1) (rule lemma3) + next + fix ys zs assume I': "\w zs. (xs, zs) \ T a \ (w # ys, zs) \ T b \ zs \ bar" + and ys: "\w. w # ys \ bar" and Ta: "(xs, zs) \ T a" and Tb: "(ys, zs) \ T b" + show "zs \ bar" + proof (rule bar2) + fix w + show "w # zs \ bar" + proof (cases w) + case Nil + thus ?thesis by simp (rule prop1) + next + case (Cons c cs) + from letter_eq_dec show ?thesis + proof + assume ca: "c = a" + from ab have "(a # cs) # zs \ bar" by (rules intro: I ys Ta Tb)+ + thus ?thesis by (simp add: Cons ca) + next + assume "c \ a" + with ab have cb: "c = b" by (rule letter_neq) + from ab have "(b # cs) # zs \ bar" by (rules intro: I' Ta Tb)+ + thus ?thesis by (simp add: Cons cb) + qed + qed + qed + qed +qed -theorem prop5: "[w] \ bar" - apply (induct_tac w) - apply (rule prop1) - apply (rule prop3 [rule_format]) - apply rules+ - done +theorem prop3: + assumes bar: "xs \ bar" + shows "\zs. xs \ [] \ (xs, zs) \ R a \ zs \ bar" using bar +proof induct + fix xs zs + assume "xs \ good" and "(xs, zs) \ R a" + show "zs \ bar" by (rule bar1) (rule lemma2) +next + fix xs zs + assume I: "\w zs. w # xs \ [] \ (w # xs, zs) \ R a \ zs \ bar" + and xsb: "\w. w # xs \ bar" and xsn: "xs \ []" and R: "(xs, zs) \ R a" + show "zs \ bar" + proof (rule bar2) + fix w + show "w # zs \ bar" + proof (induct w) + case Nil + show ?case by (rule prop1) + next + case (Cons c cs) + from letter_eq_dec show ?case + proof + assume "c = a" + thus ?thesis by (rules intro: I [simplified] R) + next + from R xsn have T: "(xs, zs) \ T a" by (rule lemma4) + assume "c \ a" + thus ?thesis by (rules intro: prop2 Cons xsb xsn R T) + qed + qed + qed +qed theorem higman: "[] \ bar" - apply (rule bar2) - apply (rule allI) - apply (rule prop5) - done +proof (rule bar2) + fix w + show "[w] \ bar" + proof (induct w) + show "[[]] \ bar" by (rule prop1) + next + fix c cs assume "[cs] \ bar" + thus "[c # cs] \ bar" by (rule prop3) (simp, rules) + qed +qed consts is_prefix :: "'a list \ (nat \ 'a) \ bool" @@ -274,22 +262,20 @@ "is_prefix (x # xs) f = (x = f (length xs) \ is_prefix xs f)" theorem good_prefix_lemma: - "ws \ bar \ is_prefix ws f \ (\vs. is_prefix vs f \ vs \ good)" - apply (erule bar.induct) - apply rules - apply (rule impI) - apply (erule_tac x="f (length ws)" in allE) - apply (erule conjE) - apply (erule impE) - apply simp - apply assumption - done + assumes bar: "ws \ bar" + shows "is_prefix ws f \ \vs. is_prefix vs f \ vs \ good" using bar +proof induct + case bar1 + thus ?case by rules +next + case (bar2 ws) + have "is_prefix (f (length ws) # ws) f" by simp + thus ?case by (rules intro: bar2) +qed theorem good_prefix: "\vs. is_prefix vs f \ vs \ good" - apply (insert higman) - apply (drule good_prefix_lemma) - apply simp - done + using higman + by (rule good_prefix_lemma) simp+ subsection {* Extracting the program *} @@ -306,8 +292,6 @@ @{thm [display] good_prefix_lemma_def [no_vars]} Program extracted from the proof of @{text higman}: @{thm [display] higman_def [no_vars]} - Program extracted from the proof of @{text prop5}: - @{thm [display] prop5_def [no_vars]} Program extracted from the proof of @{text prop1}: @{thm [display] prop1_def [no_vars]} Program extracted from the proof of @{text prop2}: