| author | traytel | 
| Thu, 31 Mar 2016 21:19:45 +0200 | |
| changeset 62778 | f0e8ed202ce5 | 
| parent 62078 | 76399b8fde4d | 
| child 63185 | 08369e33c185 | 
| permissions | -rw-r--r-- | 
| 60248 
f7e4294216d2
updated Eisbach, using version fb741500f533 of its Bitbucket repository;
 wenzelm parents: 
60209diff
changeset | 1 | (* Title: HOL/Eisbach/Tests.thy | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 2 | Author: Daniel Matichuk, NICTA/UNSW | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 3 | *) | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 4 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 5 | section \<open>Miscellaneous Eisbach tests\<close> | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 6 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 7 | theory Tests | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 8 | imports Main Eisbach_Tools | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 9 | begin | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 10 | |
| 60209 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 11 | |
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 12 | subsection \<open>Named Theorems Tests\<close> | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 13 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 14 | named_theorems foo | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 15 | |
| 60209 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 16 | method foo declares foo = (rule foo) | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 17 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 18 | lemma | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 19 | assumes A [foo]: A | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 20 | shows A | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 21 | apply foo | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 22 | done | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 23 | |
| 61912 
ad710de5c576
more standard nesting of sub-language: Parse.text allows atomic entities without quotes;
 wenzelm parents: 
61813diff
changeset | 24 | method abs_used for P = (match (P) in "\<lambda>a. ?Q" \<Rightarrow> fail \<bar> _ \<Rightarrow> -) | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 25 | |
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 26 | |
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 27 | subsection \<open>Match Tests\<close> | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 28 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 29 | notepad | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 30 | begin | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 31 | have dup: "\<And>A. A \<Longrightarrow> A \<Longrightarrow> A" by simp | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 32 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 33 | fix A y | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 34 | have "(\<And>x. A x) \<Longrightarrow> A y" | 
| 60209 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 35 | apply (rule dup, match premises in Y: "\<And>B. P B" for P \<Rightarrow> \<open>match (P) in A \<Rightarrow> \<open>print_fact Y, rule Y\<close>\<close>) | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 36 | apply (rule dup, match premises in Y: "\<And>B :: 'a. P B" for P \<Rightarrow> \<open>match (P) in A \<Rightarrow> \<open>print_fact Y, rule Y\<close>\<close>) | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 37 | apply (rule dup, match premises in Y: "\<And>B :: 'a. P B" for P \<Rightarrow> \<open>match conclusion in "P y" for y \<Rightarrow> \<open>print_fact Y, print_term y, rule Y[where B=y]\<close>\<close>) | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 38 | apply (rule dup, match premises in Y: "\<And>B :: 'a. P B" for P \<Rightarrow> \<open>match conclusion in "P z" for z \<Rightarrow> \<open>print_fact Y, print_term y, rule Y[where B=z]\<close>\<close>) | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 39 | apply (rule dup, match conclusion in "P y" for P \<Rightarrow> \<open>match premises in Y: "\<And>z. P z" \<Rightarrow> \<open>print_fact Y, rule Y[where z=y]\<close>\<close>) | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 40 | apply (match premises in Y: "\<And>z :: 'a. P z" for P \<Rightarrow> \<open>match conclusion in "P y" \<Rightarrow> \<open>print_fact Y, rule Y[where z=y]\<close>\<close>) | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 41 | done | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 42 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 43 | assume X: "\<And>x. A x" "A y" | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 44 | have "A y" | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 45 | apply (match X in Y:"\<And>B. A B" and Y':"B ?x" for B \<Rightarrow> \<open>print_fact Y[where B=y], print_term B\<close>) | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 46 | apply (match X in Y:"B ?x" and Y':"B ?x" for B \<Rightarrow> \<open>print_fact Y, print_term B\<close>) | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 47 | apply (match X in Y:"B x" and Y':"B x" for B x \<Rightarrow> \<open>print_fact Y, print_term B, print_term x\<close>) | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 48 | apply (insert X) | 
| 60209 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 49 | apply (match premises in Y:"\<And>B. A B" and Y':"B y" for B and y :: 'a \<Rightarrow> \<open>print_fact Y[where B=y], print_term B\<close>) | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 50 | apply (match premises in Y:"B ?x" and Y':"B ?x" for B \<Rightarrow> \<open>print_fact Y, print_term B\<close>) | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 51 | apply (match premises in Y:"B x" and Y':"B x" for B x \<Rightarrow> \<open>print_fact Y, print_term B\<close>) | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 52 | apply (match conclusion in "P x" and "P y" for P x \<Rightarrow> \<open>print_term P, print_term x\<close>) | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 53 | apply assumption | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 54 | done | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 55 | |
| 60209 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 56 |   {
 | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 57 | fix B x y | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 58 | assume X: "\<And>x y. B x x y" | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 59 | have "B x x y" | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 60 | by (match X in Y:"\<And>y. B y y z" for z \<Rightarrow> \<open>rule Y[where y=x]\<close>) | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 61 | |
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 62 | fix A B | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 63 | have "(\<And>x y. A (B x) y) \<Longrightarrow> A (B x) y" | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 64 | by (match premises in Y: "\<And>xx. ?H (B xx)" \<Rightarrow> \<open>rule Y\<close>) | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 65 | } | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 66 | |
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 67 | (* match focusing retains prems *) | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 68 | fix B x | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 69 | have "(\<And>x. A x) \<Longrightarrow> (\<And>z. B z) \<Longrightarrow> A y \<Longrightarrow> B x" | 
| 60209 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 70 | apply (match premises in Y: "\<And>z :: 'a. A z" \<Rightarrow> \<open>match premises in Y': "\<And>z :: 'b. B z" \<Rightarrow> \<open>print_fact Y, print_fact Y', rule Y'[where z=x]\<close>\<close>) | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 71 | done | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 72 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 73 | (*Attributes *) | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 74 | fix C | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 75 | have "(\<And>x :: 'a. A x) \<Longrightarrow> (\<And>z. B z) \<Longrightarrow> A y \<Longrightarrow> B x \<and> B x \<and> A y" | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 76 | apply (intro conjI) | 
| 61912 
ad710de5c576
more standard nesting of sub-language: Parse.text allows atomic entities without quotes;
 wenzelm parents: 
61813diff
changeset | 77 | apply (match premises in Y: "\<And>z :: 'a. A z" and Y'[intro]:"\<And>z :: 'b. B z" \<Rightarrow> fastforce) | 
| 
ad710de5c576
more standard nesting of sub-language: Parse.text allows atomic entities without quotes;
 wenzelm parents: 
61813diff
changeset | 78 | apply (match premises in Y: "\<And>z :: 'a. A z" \<Rightarrow> \<open>match premises in Y'[intro]:"\<And>z :: 'b. B z" \<Rightarrow> fastforce\<close>) | 
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 79 | apply (match premises in Y[thin]: "\<And>z :: 'a. A z" \<Rightarrow> \<open>(match premises in Y':"\<And>z :: 'a. A z" \<Rightarrow> \<open>print_fact Y,fail\<close> \<bar> _ \<Rightarrow> \<open>print_fact Y\<close>)\<close>) | 
| 61912 
ad710de5c576
more standard nesting of sub-language: Parse.text allows atomic entities without quotes;
 wenzelm parents: 
61813diff
changeset | 80 | (*apply (match premises in Y: "\<And>z :: 'b. B z" \<Rightarrow> \<open>(match premises in Y'[thin]:"\<And>z :: 'b. B z" \<Rightarrow> \<open>(match premises in Y':"\<And>z :: 'a. A z" \<Rightarrow> fail \<bar> Y': _ \<Rightarrow> -)\<close>)\<close>)*) | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 81 | apply assumption | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 82 | done | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 83 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 84 | fix A B C D | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 85 | have "\<And>uu'' uu''' uu uu'. (\<And>x :: 'a. A uu' x) \<Longrightarrow> D uu y \<Longrightarrow> (\<And>z. B uu z) \<Longrightarrow> C uu y \<Longrightarrow> (\<And>z y. C uu z) \<Longrightarrow> B uu x \<and> B uu x \<and> C uu y" | 
| 60209 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 86 | apply (match premises in Y[thin]: "\<And>z :: 'a. A ?zz' z" and | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 87 | Y'[thin]: "\<And>rr :: 'b. B ?zz rr" \<Rightarrow> | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 88 | \<open>print_fact Y, print_fact Y', intro conjI, rule Y', insert Y', insert Y'[where rr=x]\<close>) | 
| 60209 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 89 | apply (match premises in Y:"B ?u ?x" \<Rightarrow> \<open>rule Y\<close>) | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 90 | apply (insert TrueI) | 
| 60209 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 91 | apply (match premises in Y'[thin]: "\<And>ff. B uu ff" for uu \<Rightarrow> \<open>insert Y', drule meta_spec[where x=x]\<close>) | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 92 | apply assumption | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 93 | done | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 94 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 95 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 96 | (* Multi-matches. As many facts as match are bound. *) | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 97 | fix A B C x | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 98 | have "(\<And>x :: 'a. A x) \<Longrightarrow> (\<And>y :: 'a. B y) \<Longrightarrow> C y \<Longrightarrow> (A x \<and> B y \<and> C y)" | 
| 60209 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 99 | apply (match premises in Y[thin]: "\<And>z :: 'a. ?A z" (multi) \<Rightarrow> \<open>intro conjI, (rule Y)+\<close>) | 
| 61912 
ad710de5c576
more standard nesting of sub-language: Parse.text allows atomic entities without quotes;
 wenzelm parents: 
61813diff
changeset | 100 | apply (match premises in Y[thin]: "\<And>z :: 'a. ?A z" (multi) \<Rightarrow> fail \<bar> "C y" \<Rightarrow> -) (* multi-match must bind something *) | 
| 60209 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 101 | apply (match premises in Y: "C y" \<Rightarrow> \<open>rule Y\<close>) | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 102 | done | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 103 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 104 | fix A B C x | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 105 | have "(\<And>x :: 'a. A x) \<Longrightarrow> (\<And>y :: 'a. B y) \<Longrightarrow> C y \<Longrightarrow> (A x \<and> B y \<and> C y)" | 
| 60209 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 106 | apply (match premises in Y[thin]: "\<And>z. ?A z" (multi) \<Rightarrow> \<open>intro conjI, (rule Y)+\<close>) | 
| 61912 
ad710de5c576
more standard nesting of sub-language: Parse.text allows atomic entities without quotes;
 wenzelm parents: 
61813diff
changeset | 107 | apply (match premises in Y[thin]: "\<And>z. ?A z" (multi) \<Rightarrow> fail \<bar> "C y" \<Rightarrow> -) (* multi-match must bind something *) | 
| 60209 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 108 | apply (match premises in Y: "C y" \<Rightarrow> \<open>rule Y\<close>) | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 109 | done | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 110 | |
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 111 | fix A B C P Q and x :: 'a and y :: 'a | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 112 | have "(\<And>x y :: 'a. A x y \<and> Q) \<Longrightarrow> (\<And>a b. B (a :: 'a) (b :: 'a) \<and> Q) \<Longrightarrow> (\<And>x y. C (x :: 'a) (y :: 'a) \<and> P) \<Longrightarrow> A y x \<and> B y x" | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 113 | by (match premises in Y: "\<And>z a. ?A (z :: 'a) (a :: 'a) \<and> R" (multi) for R \<Rightarrow> \<open>rule conjI, rule Y[where z=x,THEN conjunct1], rule Y[THEN conjunct1]\<close>) | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 114 | |
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 115 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 116 | (*We may use for-fixes in multi-matches too. All bound facts must agree on the fixed term *) | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 117 | fix A B C x | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 118 | have "(\<And>y :: 'a. B y \<and> C y) \<Longrightarrow> (\<And>x :: 'a. A x \<and> B x) \<Longrightarrow> (\<And>y :: 'a. A y \<and> C y) \<Longrightarrow> C y \<Longrightarrow> (A x \<and> B y \<and> C y)" | 
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 119 | apply (match premises in Y: "\<And>x :: 'a. P x \<and> ?U x" (multi) for P \<Rightarrow> | 
| 61912 
ad710de5c576
more standard nesting of sub-language: Parse.text allows atomic entities without quotes;
 wenzelm parents: 
61813diff
changeset | 120 | \<open>match (P) in B \<Rightarrow> fail | 
| 
ad710de5c576
more standard nesting of sub-language: Parse.text allows atomic entities without quotes;
 wenzelm parents: 
61813diff
changeset | 121 | \<bar> "\<lambda>a. B" \<Rightarrow> fail | 
| 
ad710de5c576
more standard nesting of sub-language: Parse.text allows atomic entities without quotes;
 wenzelm parents: 
61813diff
changeset | 122 | \<bar> _ \<Rightarrow> -, | 
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 123 | intro conjI, (rule Y[THEN conjunct1])\<close>) | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 124 | apply (rule dup) | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 125 | apply (match premises in Y':"\<And>x :: 'a. ?U x \<and> Q x" and Y: "\<And>x :: 'a. Q x \<and> ?U x" (multi) for Q \<Rightarrow> \<open>insert Y[THEN conjunct1]\<close>) | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 126 | apply assumption (* Previous match requires that Q is consistent *) | 
| 60209 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 127 | apply (match premises in Y: "\<And>z :: 'a. ?A z \<longrightarrow> False" (multi) \<Rightarrow> \<open>print_fact Y, fail\<close> \<bar> "C y" \<Rightarrow> \<open>print_term C\<close>) (* multi-match must bind something *) | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 128 | apply (match premises in Y: "\<And>x. B x \<and> C x" \<Rightarrow> \<open>intro conjI Y[THEN conjunct1]\<close>) | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 129 | apply (match premises in Y: "C ?x" \<Rightarrow> \<open>rule Y\<close>) | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 130 | done | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 131 | |
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 132 | (* All bindings must be tried for a particular theorem. | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 133 | However all combinations are NOT explored. *) | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 134 | fix B A C | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 135 | assume asms:"\<And>a b. B (a :: 'a) (b :: 'a) \<and> Q" "\<And>x :: 'a. A x x \<and> Q" "\<And>a b. C (a :: 'a) (b :: 'a) \<and> Q" | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 136 | have "B y x \<and> C x y \<and> B x y \<and> C y x \<and> A x x" | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 137 | apply (intro conjI) | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 138 | apply (match asms in Y: "\<And>z a. ?A (z :: 'a) (a :: 'a) \<and> R" (multi) for R \<Rightarrow> \<open>rule Y[where z=x,THEN conjunct1]\<close>) | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 139 | apply (match asms in Y: "\<And>z a. ?A (z :: 'a) (a :: 'a) \<and> R" (multi) for R \<Rightarrow> \<open>rule Y[where a=x,THEN conjunct1]\<close>) | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 140 | apply (match asms in Y: "\<And>z a. ?A (z :: 'a) (a :: 'a) \<and> R" (multi) for R \<Rightarrow> \<open>rule Y[where a=x,THEN conjunct1]\<close>) | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 141 | apply (match asms in Y: "\<And>z a. ?A (z :: 'a) (a :: 'a) \<and> R" (multi) for R \<Rightarrow> \<open>rule Y[where z=x,THEN conjunct1]\<close>) | 
| 61912 
ad710de5c576
more standard nesting of sub-language: Parse.text allows atomic entities without quotes;
 wenzelm parents: 
61813diff
changeset | 142 | apply (match asms in Y: "\<And>z a. A (z :: 'a) (a :: 'a) \<and> R" for R \<Rightarrow> fail \<bar> _ \<Rightarrow> -) | 
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 143 | apply (rule asms[THEN conjunct1]) | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 144 | done | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 145 | |
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 146 | (* Attributes *) | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 147 | fix A B C x | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 148 | have "(\<And>x :: 'a. A x \<and> B x) \<Longrightarrow> (\<And>y :: 'a. A y \<and> C y) \<Longrightarrow> (\<And>y :: 'a. B y \<and> C y) \<Longrightarrow> C y \<Longrightarrow> (A x \<and> B y \<and> C y)" | 
| 60209 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 149 | apply (match premises in Y: "\<And>x :: 'a. P x \<and> ?U x" (multi) for P \<Rightarrow> \<open>match Y[THEN conjunct1] in Y':"?H" (multi) \<Rightarrow> \<open>intro conjI,rule Y'\<close>\<close>) | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 150 | apply (match premises in Y: "\<And>x :: 'a. P x \<and> ?U x" (multi) for P \<Rightarrow> \<open>match Y[THEN conjunct2] in Y':"?H" (multi) \<Rightarrow> \<open>rule Y'\<close>\<close>) | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 151 | apply assumption | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 152 | done | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 153 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 154 | (* Removed feature for now *) | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 155 | (* | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 156 | fix A B C x | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 157 | have "(\<And>x :: 'a. A x \<and> B x) \<Longrightarrow> (\<And>y :: 'a. A y \<and> C y) \<Longrightarrow> (\<And>y :: 'a. B y \<and> C y) \<Longrightarrow> C y \<Longrightarrow> (A x \<and> B y \<and> C y)" | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 158 |   apply (match prems in Y: "\<And>x :: 'a. P x \<and> ?U x" (multi) for P \<Rightarrow> \<open>match \<open>K @{thms Y TrueI}\<close> in Y':"?H"  (multi) \<Rightarrow> \<open>rule conjI; (rule Y')?\<close>\<close>)
 | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 159 |   apply (match prems in Y: "\<And>x :: 'a. P x \<and> ?U x" (multi) for P \<Rightarrow> \<open>match \<open>K [@{thm Y}]\<close> in Y':"?H"  (multi) \<Rightarrow> \<open>rule Y'\<close>\<close>)
 | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 160 | done | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 161 | *) | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 162 | (* Testing THEN_ALL_NEW within match *) | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 163 | fix A B C x | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 164 | have "(\<And>x :: 'a. A x \<and> B x) \<Longrightarrow> (\<And>y :: 'a. A y \<and> C y) \<Longrightarrow> (\<And>y :: 'a. B y \<and> C y) \<Longrightarrow> C y \<Longrightarrow> (A x \<and> B y \<and> C y)" | 
| 60209 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 165 | apply (match premises in Y: "\<And>x :: 'a. P x \<and> ?U x" (multi) for P \<Rightarrow> \<open>intro conjI ; ((rule Y[THEN conjunct1])?); rule Y[THEN conjunct2] \<close>) | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 166 | done | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 167 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 168 | (* Cut tests *) | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 169 | fix A B C | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 170 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 171 | have "D \<and> C \<Longrightarrow> A \<and> B \<Longrightarrow> A \<longrightarrow> C \<Longrightarrow> D \<longrightarrow> True \<Longrightarrow> C" | 
| 60209 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 172 | by (((match premises in I: "P \<and> Q" (cut) | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 173 | and I': "P \<longrightarrow> ?U" for P Q \<Rightarrow> \<open>rule mp [OF I' I[THEN conjunct1]]\<close>)?), simp) | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 174 | |
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 175 | have "D \<and> C \<Longrightarrow> A \<and> B \<Longrightarrow> A \<longrightarrow> C \<Longrightarrow> D \<longrightarrow> True \<Longrightarrow> C" | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 176 | by (match premises in I: "P \<and> Q" (cut 2) | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 177 | and I': "P \<longrightarrow> ?U" for P Q \<Rightarrow> \<open>rule mp [OF I' I[THEN conjunct1]]\<close>) | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 178 | |
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 179 | have "A \<and> B \<Longrightarrow> A \<longrightarrow> C \<Longrightarrow> C" | 
| 60209 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 180 | by (((match premises in I: "P \<and> Q" (cut) | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 181 | and I': "P \<longrightarrow> ?U" for P Q \<Rightarrow> \<open>rule mp [OF I' I[THEN conjunct1]]\<close>)?, simp) | simp) | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 182 | |
| 60209 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 183 | fix f x y | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 184 | have "f x y \<Longrightarrow> f x y" | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 185 | by (match conclusion in "f x y" for f x y \<Rightarrow> \<open>print_term f\<close>) | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 186 | |
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 187 | fix A B C | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 188 | assume X: "A \<and> B" "A \<and> C" C | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 189 | have "A \<and> B \<and> C" | 
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 190 | by (match X in H: "A \<and> ?H" (multi, cut) \<Rightarrow> | 
| 61912 
ad710de5c576
more standard nesting of sub-language: Parse.text allows atomic entities without quotes;
 wenzelm parents: 
61813diff
changeset | 191 | \<open>match H in "A \<and> C" and "A \<and> B" \<Rightarrow> fail\<close> | 
| 60209 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 192 | | simp add: X) | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 193 | |
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 194 | |
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 195 | (* Thinning an inner focus *) | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 196 | (* Thinning should persist within a match, even when on an external premise *) | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 197 | |
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 198 | fix A | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 199 | have "(\<And>x. A x \<and> B) \<Longrightarrow> B \<and> C \<Longrightarrow> C" | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 200 | apply (match premises in H:"\<And>x. A x \<and> B" \<Rightarrow> | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 201 | \<open>match premises in H'[thin]: "\<And>x. A x \<and> B" \<Rightarrow> | 
| 61912 
ad710de5c576
more standard nesting of sub-language: Parse.text allows atomic entities without quotes;
 wenzelm parents: 
61813diff
changeset | 202 | \<open>match premises in H'':"\<And>x. A x \<and> B" \<Rightarrow> fail | 
| 
ad710de5c576
more standard nesting of sub-language: Parse.text allows atomic entities without quotes;
 wenzelm parents: 
61813diff
changeset | 203 | \<bar> _ \<Rightarrow> -\<close> | 
| 
ad710de5c576
more standard nesting of sub-language: Parse.text allows atomic entities without quotes;
 wenzelm parents: 
61813diff
changeset | 204 | ,match premises in H'':"\<And>x. A x \<and> B" \<Rightarrow> fail \<bar> _ \<Rightarrow> -\<close>) | 
| 
ad710de5c576
more standard nesting of sub-language: Parse.text allows atomic entities without quotes;
 wenzelm parents: 
61813diff
changeset | 205 | apply (match premises in H:"\<And>x. A x \<and> B" \<Rightarrow> fail | 
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 206 | \<bar> H':_ \<Rightarrow> \<open>rule H'[THEN conjunct2]\<close>) | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 207 | done | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 208 | |
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 209 | |
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 210 | (* Local premises *) | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 211 | (* Only match premises which actually existed in the goal we just focused.*) | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 212 | |
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 213 | fix A | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 214 | assume asms: "C \<and> D" | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 215 | have "B \<and> C \<Longrightarrow> C" | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 216 | by (match premises in _ \<Rightarrow> \<open>insert asms, | 
| 61912 
ad710de5c576
more standard nesting of sub-language: Parse.text allows atomic entities without quotes;
 wenzelm parents: 
61813diff
changeset | 217 | match premises (local) in "B \<and> C" \<Rightarrow> fail | 
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 218 | \<bar> H:"C \<and> D" \<Rightarrow> \<open>rule H[THEN conjunct1]\<close>\<close>) | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 219 | end | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 220 | |
| 60248 
f7e4294216d2
updated Eisbach, using version fb741500f533 of its Bitbucket repository;
 wenzelm parents: 
60209diff
changeset | 221 | |
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 222 | |
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 223 | (* Testing inner focusing. This fails if we don't smash flex-flex pairs produced | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 224 | by retrofitting. This needs to be done more carefully to avoid smashing | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 225 | legitimate pairs.*) | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 226 | |
| 61337 | 227 | schematic_goal "?A x \<Longrightarrow> A x" | 
| 60209 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 228 | apply (match conclusion in "H" for H \<Rightarrow> \<open>match conclusion in Y for Y \<Rightarrow> \<open>print_term Y\<close>\<close>) | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 229 | apply assumption | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 230 | done | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 231 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 232 | (* Ensure short-circuit after first match failure *) | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 233 | lemma | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 234 | assumes A: "P \<and> Q" | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 235 | shows "P" | 
| 61912 
ad710de5c576
more standard nesting of sub-language: Parse.text allows atomic entities without quotes;
 wenzelm parents: 
61813diff
changeset | 236 | by ((match A in "P \<and> Q" \<Rightarrow> fail \<bar> "?H" \<Rightarrow> -) | simp add: A) | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 237 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 238 | lemma | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 239 | assumes A: "D \<and> C" "A \<and> B" "A \<longrightarrow> B" | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 240 | shows "A" | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 241 | apply ((match A in U: "P \<and> Q" (cut) and "P' \<longrightarrow> Q'" for P Q P' Q' \<Rightarrow> | 
| 61912 
ad710de5c576
more standard nesting of sub-language: Parse.text allows atomic entities without quotes;
 wenzelm parents: 
61813diff
changeset | 242 | \<open>simp add: U\<close> \<bar> "?H" \<Rightarrow> -) | -) | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 243 | apply (simp add: A) | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 244 | done | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 245 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 246 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 247 | subsection \<open>Uses Tests\<close> | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 248 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 249 | ML \<open> | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 250 | fun test_internal_fact ctxt factnm = | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 251 | (case try (Proof_Context.get_thms ctxt) factnm of | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 252 | NONE => () | 
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 253 | | SOME _ => error "Found internal fact"); | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 254 | \<close> | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 255 | |
| 60209 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 256 | method uses_test\<^sub>1 uses uses_test\<^sub>1_uses = (rule uses_test\<^sub>1_uses) | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 257 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 258 | lemma assumes A shows A by (uses_test\<^sub>1 uses_test\<^sub>1_uses: assms) | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 259 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 260 | ML \<open>test_internal_fact @{context} "uses_test\<^sub>1_uses"\<close>
 | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 261 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 262 | ML \<open>test_internal_fact @{context} "Tests.uses_test\<^sub>1_uses"\<close>
 | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 263 | ML \<open>test_internal_fact @{context} "Tests.uses_test\<^sub>1.uses_test\<^sub>1_uses"\<close>
 | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 264 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 265 | |
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 266 | subsection \<open>Testing term and fact passing in recursion\<close> | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 267 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 268 | method recursion_example for x :: bool uses facts = | 
| 60209 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 269 | (match (x) in | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 270 | "A \<and> B" for A B \<Rightarrow> \<open>(recursion_example A facts: facts, recursion_example B facts: facts)\<close> | 
| 60209 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 271 | \<bar> "?H" \<Rightarrow> \<open>match facts in U: "x" \<Rightarrow> \<open>insert U\<close>\<close>) | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 272 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 273 | lemma | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 274 | assumes asms: "A" "B" "C" "D" | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 275 | shows "(A \<and> B) \<and> (C \<and> D)" | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 276 | apply (recursion_example "(A \<and> B) \<and> (C \<and> D)" facts: asms) | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 277 | apply simp | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 278 | done | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 279 | |
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 280 | (* uses facts are not accumulated *) | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 281 | |
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 282 | method recursion_example' for A :: bool and B :: bool uses facts = | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 283 | (match facts in | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 284 | H: "A" and H': "B" \<Rightarrow> \<open>recursion_example' "A" "B" facts: H TrueI\<close> | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 285 | \<bar> "A" and "True" \<Rightarrow> \<open>recursion_example' "A" "B" facts: TrueI\<close> | 
| 61912 
ad710de5c576
more standard nesting of sub-language: Parse.text allows atomic entities without quotes;
 wenzelm parents: 
61813diff
changeset | 286 | \<bar> "True" \<Rightarrow> - | 
| 
ad710de5c576
more standard nesting of sub-language: Parse.text allows atomic entities without quotes;
 wenzelm parents: 
61813diff
changeset | 287 | \<bar> "PROP ?P" \<Rightarrow> fail) | 
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 288 | |
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 289 | lemma | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 290 | assumes asms: "A" "B" | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 291 | shows "True" | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 292 | apply (recursion_example' "A" "B" facts: asms) | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 293 | apply simp | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 294 | done | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 295 | |
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 296 | |
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 297 | (*Method.sections in existing method*) | 
| 60209 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 298 | method my_simp\<^sub>1 uses my_simp\<^sub>1_facts = (simp add: my_simp\<^sub>1_facts) | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 299 | lemma assumes A shows A by (my_simp\<^sub>1 my_simp\<^sub>1_facts: assms) | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 300 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 301 | (*Method.sections via Eisbach argument parser*) | 
| 60209 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 302 | method uses_test\<^sub>2 uses uses_test\<^sub>2_uses = (uses_test\<^sub>1 uses_test\<^sub>1_uses: uses_test\<^sub>2_uses) | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 303 | lemma assumes A shows A by (uses_test\<^sub>2 uses_test\<^sub>2_uses: assms) | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 304 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 305 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 306 | subsection \<open>Declaration Tests\<close> | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 307 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 308 | named_theorems declare_facts\<^sub>1 | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 309 | |
| 60209 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 310 | method declares_test\<^sub>1 declares declare_facts\<^sub>1 = (rule declare_facts\<^sub>1) | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 311 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 312 | lemma assumes A shows A by (declares_test\<^sub>1 declare_facts\<^sub>1: assms) | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 313 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 314 | lemma assumes A[declare_facts\<^sub>1]: A shows A by declares_test\<^sub>1 | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 315 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 316 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 317 | subsection \<open>Rule Instantiation Tests\<close> | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 318 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 319 | method my_allE\<^sub>1 for x :: 'a and P :: "'a \<Rightarrow> bool" = | 
| 60209 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 320 | (erule allE [where x = x and P = P]) | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 321 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 322 | lemma "\<forall>x. Q x \<Longrightarrow> Q x" by (my_allE\<^sub>1 x Q) | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 323 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 324 | method my_allE\<^sub>2 for x :: 'a and P :: "'a \<Rightarrow> bool" = | 
| 60209 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 325 | (erule allE [of P x]) | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 326 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 327 | lemma "\<forall>x. Q x \<Longrightarrow> Q x" by (my_allE\<^sub>2 x Q) | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 328 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 329 | method my_allE\<^sub>3 for x :: 'a and P :: "'a \<Rightarrow> bool" = | 
| 60209 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 330 | (match allE [where 'a = 'a] in X: "\<And>(x :: 'a) P R. \<forall>x. P x \<Longrightarrow> (P x \<Longrightarrow> R) \<Longrightarrow> R" \<Rightarrow> | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 331 | \<open>erule X [where x = x and P = P]\<close>) | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 332 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 333 | lemma "\<forall>x. Q x \<Longrightarrow> Q x" by (my_allE\<^sub>3 x Q) | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 334 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 335 | method my_allE\<^sub>4 for x :: 'a and P :: "'a \<Rightarrow> bool" = | 
| 60209 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 336 | (match allE [where 'a = 'a] in X: "\<And>(x :: 'a) P R. \<forall>x. P x \<Longrightarrow> (P x \<Longrightarrow> R) \<Longrightarrow> R" \<Rightarrow> | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 337 | \<open>erule X [of x P]\<close>) | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 338 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 339 | lemma "\<forall>x. Q x \<Longrightarrow> Q x" by (my_allE\<^sub>4 x Q) | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 340 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 341 | |
| 60209 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 342 | |
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 343 | subsection \<open>Polymorphism test\<close> | 
| 60209 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 344 | |
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 345 | axiomatization foo' :: "'a \<Rightarrow> 'b \<Rightarrow> 'c \<Rightarrow> bool" | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 346 | axiomatization where foo'_ax1: "foo' x y z \<Longrightarrow> z \<and> y" | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 347 | axiomatization where foo'_ax2: "foo' x y y \<Longrightarrow> x \<and> z" | 
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 348 | axiomatization where foo'_ax3: "foo' (x :: int) y y \<Longrightarrow> y \<and> y" | 
| 60209 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 349 | |
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 350 | lemmas my_thms = foo'_ax1 foo'_ax2 foo'_ax3 | 
| 60209 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 351 | |
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 352 | definition first_id where "first_id x = x" | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 353 | |
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 354 | lemmas my_thms' = my_thms[of "first_id x" for x] | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 355 | |
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 356 | method print_conclusion = (match conclusion in concl for concl \<Rightarrow> \<open>print_term concl\<close>) | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 357 | |
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 358 | lemma | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 359 | assumes foo: "\<And>x (y :: bool). foo' (A x) B (A x)" | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 360 | shows "\<And>z. A z \<and> B" | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 361 | apply | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 362 | (match conclusion in "f x y" for f y and x :: "'d :: type" \<Rightarrow> \<open> | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 363 | match my_thms' in R:"\<And>(x :: 'f :: type). ?P (first_id x) \<Longrightarrow> ?R" | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 364 | and R':"\<And>(x :: 'f :: type). ?P' (first_id x) \<Longrightarrow> ?R'" \<Rightarrow> \<open> | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 365 | match (x) in "q :: 'f" for q \<Rightarrow> \<open> | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 366 | rule R[of q,simplified first_id_def], | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 367 | print_conclusion, | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 368 | rule foo | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 369 | \<close>\<close>\<close>) | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 370 | done | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 371 | |
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 372 | |
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 373 | subsection \<open>Unchecked rule instantiation, with the possibility of runtime errors\<close> | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 374 | |
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 375 | named_theorems my_thms_named | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 376 | |
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 377 | declare foo'_ax3[my_thms_named] | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 378 | |
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 379 | method foo_method3 declares my_thms_named = | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 380 | (match my_thms_named[of (unchecked) z for z] in R:"PROP ?H" \<Rightarrow> \<open>rule R\<close>) | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 381 | |
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 382 | notepad | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 383 | begin | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 384 | |
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 385 | (*FIXME: Shouldn't need unchecked keyword here. See Tests_Failing.thy *) | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 386 | fix A B x | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 387 | have "foo' x B A \<Longrightarrow> A \<and> B" | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 388 | by (match my_thms[of (unchecked) z for z] in R:"PROP ?H" \<Rightarrow> \<open>rule R\<close>) | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 389 | |
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 390 | fix A B x | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 391 | note foo'_ax1[my_thms_named] | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 392 | have "foo' x B A \<Longrightarrow> A \<and> B" | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 393 | by (match my_thms_named[where x=z for z] in R:"PROP ?H" \<Rightarrow> \<open>rule R\<close>) | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 394 | |
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 395 | fix A B x | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 396 | note foo'_ax1[my_thms_named] foo'_ax2[my_thms_named] foo'_ax3[my_thms_named] | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 397 | have "foo' x B A \<Longrightarrow> A \<and> B" | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 398 | by foo_method3 | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 399 | |
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 400 | end | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 401 | |
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 402 | |
| 60248 
f7e4294216d2
updated Eisbach, using version fb741500f533 of its Bitbucket repository;
 wenzelm parents: 
60209diff
changeset | 403 | ML \<open> | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 404 | structure Data = Generic_Data | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 405 | ( | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 406 | type T = thm list; | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 407 | val empty: T = []; | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 408 | val extend = I; | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 409 | fun merge data : T = Thm.merge_thms data; | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 410 | ); | 
| 60248 
f7e4294216d2
updated Eisbach, using version fb741500f533 of its Bitbucket repository;
 wenzelm parents: 
60209diff
changeset | 411 | \<close> | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 412 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 413 | local_setup \<open>Local_Theory.add_thms_dynamic (@{binding test_dyn}, Data.get)\<close>
 | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 414 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 415 | setup \<open>Context.theory_map (Data.put @{thms TrueI})\<close>
 | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 416 | |
| 60209 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 417 | method dynamic_thms_test = (rule test_dyn) | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 418 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 419 | locale foo = | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 420 | fixes A | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 421 | assumes A : "A" | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 422 | begin | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 423 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 424 | local_setup | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 425 |   \<open>Local_Theory.declaration {pervasive = false, syntax = false}
 | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 426 |     (fn phi => Data.put (Morphism.fact phi @{thms A}))\<close>
 | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 427 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 428 | lemma A by dynamic_thms_test | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 429 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 430 | end | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 431 | |
| 60248 
f7e4294216d2
updated Eisbach, using version fb741500f533 of its Bitbucket repository;
 wenzelm parents: 
60209diff
changeset | 432 | |
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 433 | notepad | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 434 | begin | 
| 60248 
f7e4294216d2
updated Eisbach, using version fb741500f533 of its Bitbucket repository;
 wenzelm parents: 
60209diff
changeset | 435 | fix A x | 
| 
f7e4294216d2
updated Eisbach, using version fb741500f533 of its Bitbucket repository;
 wenzelm parents: 
60209diff
changeset | 436 | assume X: "\<And>x. A x" | 
| 
f7e4294216d2
updated Eisbach, using version fb741500f533 of its Bitbucket repository;
 wenzelm parents: 
60209diff
changeset | 437 | have "A x" | 
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 438 | by (match X in H[of x]:"\<And>x. A x" \<Rightarrow> \<open>print_fact H,match H in "A x" \<Rightarrow> \<open>rule H\<close>\<close>) | 
| 60248 
f7e4294216d2
updated Eisbach, using version fb741500f533 of its Bitbucket repository;
 wenzelm parents: 
60209diff
changeset | 439 | |
| 
f7e4294216d2
updated Eisbach, using version fb741500f533 of its Bitbucket repository;
 wenzelm parents: 
60209diff
changeset | 440 | fix A x B | 
| 
f7e4294216d2
updated Eisbach, using version fb741500f533 of its Bitbucket repository;
 wenzelm parents: 
60209diff
changeset | 441 | assume X: "\<And>x :: bool. A x \<Longrightarrow> B" "\<And>x. A x" | 
| 
f7e4294216d2
updated Eisbach, using version fb741500f533 of its Bitbucket repository;
 wenzelm parents: 
60209diff
changeset | 442 | assume Y: "A B" | 
| 
f7e4294216d2
updated Eisbach, using version fb741500f533 of its Bitbucket repository;
 wenzelm parents: 
60209diff
changeset | 443 | have "B \<and> B \<and> B \<and> B \<and> B \<and> B" | 
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 444 | apply (intro conjI) | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 445 | apply (match X in H[OF X(2)]:"\<And>x. A x \<Longrightarrow> B" \<Rightarrow> \<open>print_fact H,rule H\<close>) | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 446 | apply (match X in H':"\<And>x. A x" and H[OF H']:"\<And>x. A x \<Longrightarrow> B" \<Rightarrow> \<open>print_fact H',print_fact H,rule H\<close>) | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 447 | apply (match X in H[of Q]:"\<And>x. A x \<Longrightarrow> ?R" and "?P \<Longrightarrow> Q" for Q \<Rightarrow> \<open>print_fact H,rule H, rule Y\<close>) | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 448 | apply (match X in H[of Q,OF Y]:"\<And>x. A x \<Longrightarrow> ?R" and "?P \<Longrightarrow> Q" for Q \<Rightarrow> \<open>print_fact H,rule H\<close>) | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 449 | apply (match X in H[OF Y,intro]:"\<And>x. A x \<Longrightarrow> ?R" \<Rightarrow> \<open>print_fact H,fastforce\<close>) | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 450 | apply (match X in H[intro]:"\<And>x. A x \<Longrightarrow> ?R" \<Rightarrow> \<open>rule H[where x=B], rule Y\<close>) | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 451 | done | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 452 | |
| 60248 
f7e4294216d2
updated Eisbach, using version fb741500f533 of its Bitbucket repository;
 wenzelm parents: 
60209diff
changeset | 453 | fix x :: "prop" and A | 
| 
f7e4294216d2
updated Eisbach, using version fb741500f533 of its Bitbucket repository;
 wenzelm parents: 
60209diff
changeset | 454 | assume X: "TERM x" | 
| 
f7e4294216d2
updated Eisbach, using version fb741500f533 of its Bitbucket repository;
 wenzelm parents: 
60209diff
changeset | 455 | assume Y: "\<And>x :: prop. A x" | 
| 
f7e4294216d2
updated Eisbach, using version fb741500f533 of its Bitbucket repository;
 wenzelm parents: 
60209diff
changeset | 456 | have "A TERM x" | 
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 457 | apply (match X in "PROP y" for y \<Rightarrow> \<open>rule Y[where x="PROP y"]\<close>) | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 458 | done | 
| 60248 
f7e4294216d2
updated Eisbach, using version fb741500f533 of its Bitbucket repository;
 wenzelm parents: 
60209diff
changeset | 459 | end | 
| 
f7e4294216d2
updated Eisbach, using version fb741500f533 of its Bitbucket repository;
 wenzelm parents: 
60209diff
changeset | 460 | |
| 60287 
adde5ce1e0a7
updated Eisbach, using version 134bc592909c of its Bitbucket repository;
 wenzelm parents: 
60285diff
changeset | 461 | subsection \<open>Proper context for method parameters\<close> | 
| 
adde5ce1e0a7
updated Eisbach, using version 134bc592909c of its Bitbucket repository;
 wenzelm parents: 
60285diff
changeset | 462 | |
| 61912 
ad710de5c576
more standard nesting of sub-language: Parse.text allows atomic entities without quotes;
 wenzelm parents: 
61813diff
changeset | 463 | method add_simp methods m uses f = (match f in H[simp]:_ \<Rightarrow> m) | 
| 60287 
adde5ce1e0a7
updated Eisbach, using version 134bc592909c of its Bitbucket repository;
 wenzelm parents: 
60285diff
changeset | 464 | |
| 61912 
ad710de5c576
more standard nesting of sub-language: Parse.text allows atomic entities without quotes;
 wenzelm parents: 
61813diff
changeset | 465 | method add_my_thms methods m uses f = (match f in H[my_thms_named]:_ \<Rightarrow> m) | 
| 60287 
adde5ce1e0a7
updated Eisbach, using version 134bc592909c of its Bitbucket repository;
 wenzelm parents: 
60285diff
changeset | 466 | |
| 
adde5ce1e0a7
updated Eisbach, using version 134bc592909c of its Bitbucket repository;
 wenzelm parents: 
60285diff
changeset | 467 | method rule_my_thms = (rule my_thms_named) | 
| 
adde5ce1e0a7
updated Eisbach, using version 134bc592909c of its Bitbucket repository;
 wenzelm parents: 
60285diff
changeset | 468 | method rule_my_thms' declares my_thms_named = (rule my_thms_named) | 
| 
adde5ce1e0a7
updated Eisbach, using version 134bc592909c of its Bitbucket repository;
 wenzelm parents: 
60285diff
changeset | 469 | |
| 
adde5ce1e0a7
updated Eisbach, using version 134bc592909c of its Bitbucket repository;
 wenzelm parents: 
60285diff
changeset | 470 | lemma | 
| 
adde5ce1e0a7
updated Eisbach, using version 134bc592909c of its Bitbucket repository;
 wenzelm parents: 
60285diff
changeset | 471 | assumes A: A and B: B | 
| 
adde5ce1e0a7
updated Eisbach, using version 134bc592909c of its Bitbucket repository;
 wenzelm parents: 
60285diff
changeset | 472 | shows | 
| 
adde5ce1e0a7
updated Eisbach, using version 134bc592909c of its Bitbucket repository;
 wenzelm parents: 
60285diff
changeset | 473 | "(A \<or> B) \<and> A \<and> A \<and> A" | 
| 
adde5ce1e0a7
updated Eisbach, using version 134bc592909c of its Bitbucket repository;
 wenzelm parents: 
60285diff
changeset | 474 | apply (intro conjI) | 
| 61912 
ad710de5c576
more standard nesting of sub-language: Parse.text allows atomic entities without quotes;
 wenzelm parents: 
61813diff
changeset | 475 | apply (add_simp \<open>add_simp simp f: B\<close> f: A) | 
| 
ad710de5c576
more standard nesting of sub-language: Parse.text allows atomic entities without quotes;
 wenzelm parents: 
61813diff
changeset | 476 | apply (add_my_thms rule_my_thms f:A) | 
| 
ad710de5c576
more standard nesting of sub-language: Parse.text allows atomic entities without quotes;
 wenzelm parents: 
61813diff
changeset | 477 | apply (add_my_thms rule_my_thms' f:A) | 
| 60287 
adde5ce1e0a7
updated Eisbach, using version 134bc592909c of its Bitbucket repository;
 wenzelm parents: 
60285diff
changeset | 478 | apply (add_my_thms \<open>rule my_thms_named\<close> f:A) | 
| 
adde5ce1e0a7
updated Eisbach, using version 134bc592909c of its Bitbucket repository;
 wenzelm parents: 
60285diff
changeset | 479 | done | 
| 
adde5ce1e0a7
updated Eisbach, using version 134bc592909c of its Bitbucket repository;
 wenzelm parents: 
60285diff
changeset | 480 | |
| 62070 
b13b98a4d5f8
more realistic Eisbach method invocation from ML;
 wenzelm parents: 
61912diff
changeset | 481 | |
| 60287 
adde5ce1e0a7
updated Eisbach, using version 134bc592909c of its Bitbucket repository;
 wenzelm parents: 
60285diff
changeset | 482 | subsection \<open>Shallow parser tests\<close> | 
| 
adde5ce1e0a7
updated Eisbach, using version 134bc592909c of its Bitbucket repository;
 wenzelm parents: 
60285diff
changeset | 483 | |
| 61813 | 484 | method all_args for A B methods m1 m2 uses f1 f2 declares my_thms_named = fail | 
| 60287 
adde5ce1e0a7
updated Eisbach, using version 134bc592909c of its Bitbucket repository;
 wenzelm parents: 
60285diff
changeset | 485 | |
| 
adde5ce1e0a7
updated Eisbach, using version 134bc592909c of its Bitbucket repository;
 wenzelm parents: 
60285diff
changeset | 486 | lemma True | 
| 61912 
ad710de5c576
more standard nesting of sub-language: Parse.text allows atomic entities without quotes;
 wenzelm parents: 
61813diff
changeset | 487 | by (all_args True False - fail f1: TrueI f2: TrueI my_thms_named: TrueI | rule TrueI) | 
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 488 | |
| 62070 
b13b98a4d5f8
more realistic Eisbach method invocation from ML;
 wenzelm parents: 
61912diff
changeset | 489 | |
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 490 | subsection \<open>Method name internalization test\<close> | 
| 60209 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 491 | |
| 60287 
adde5ce1e0a7
updated Eisbach, using version 134bc592909c of its Bitbucket repository;
 wenzelm parents: 
60285diff
changeset | 492 | |
| 60209 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 493 | method test2 = (simp) | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 494 | |
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 495 | method simp = fail | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 496 | |
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 497 | lemma "A \<Longrightarrow> A" by test2 | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 498 | |
| 62070 
b13b98a4d5f8
more realistic Eisbach method invocation from ML;
 wenzelm parents: 
61912diff
changeset | 499 | |
| 62078 
76399b8fde4d
more systematic treatment of dynamic facts, when forming closure;
 wenzelm parents: 
62075diff
changeset | 500 | subsection \<open>Dynamic facts\<close> | 
| 
76399b8fde4d
more systematic treatment of dynamic facts, when forming closure;
 wenzelm parents: 
62075diff
changeset | 501 | |
| 
76399b8fde4d
more systematic treatment of dynamic facts, when forming closure;
 wenzelm parents: 
62075diff
changeset | 502 | named_theorems my_thms_named' | 
| 
76399b8fde4d
more systematic treatment of dynamic facts, when forming closure;
 wenzelm parents: 
62075diff
changeset | 503 | |
| 
76399b8fde4d
more systematic treatment of dynamic facts, when forming closure;
 wenzelm parents: 
62075diff
changeset | 504 | method foo_method1 for x = | 
| 
76399b8fde4d
more systematic treatment of dynamic facts, when forming closure;
 wenzelm parents: 
62075diff
changeset | 505 | (match my_thms_named' [of (unchecked) x] in R: "PROP ?H" \<Rightarrow> \<open>rule R\<close>) | 
| 
76399b8fde4d
more systematic treatment of dynamic facts, when forming closure;
 wenzelm parents: 
62075diff
changeset | 506 | |
| 
76399b8fde4d
more systematic treatment of dynamic facts, when forming closure;
 wenzelm parents: 
62075diff
changeset | 507 | lemma | 
| 
76399b8fde4d
more systematic treatment of dynamic facts, when forming closure;
 wenzelm parents: 
62075diff
changeset | 508 | assumes A [my_thms_named']: "\<And>x. A x" | 
| 
76399b8fde4d
more systematic treatment of dynamic facts, when forming closure;
 wenzelm parents: 
62075diff
changeset | 509 | shows "A y" | 
| 
76399b8fde4d
more systematic treatment of dynamic facts, when forming closure;
 wenzelm parents: 
62075diff
changeset | 510 | by (foo_method1 y) | 
| 
76399b8fde4d
more systematic treatment of dynamic facts, when forming closure;
 wenzelm parents: 
62075diff
changeset | 511 | |
| 
76399b8fde4d
more systematic treatment of dynamic facts, when forming closure;
 wenzelm parents: 
62075diff
changeset | 512 | |
| 62070 
b13b98a4d5f8
more realistic Eisbach method invocation from ML;
 wenzelm parents: 
61912diff
changeset | 513 | subsection \<open>Eisbach method invocation from ML\<close> | 
| 
b13b98a4d5f8
more realistic Eisbach method invocation from ML;
 wenzelm parents: 
61912diff
changeset | 514 | |
| 
b13b98a4d5f8
more realistic Eisbach method invocation from ML;
 wenzelm parents: 
61912diff
changeset | 515 | method test_method for x y uses r = (print_term x, print_term y, rule r) | 
| 
b13b98a4d5f8
more realistic Eisbach method invocation from ML;
 wenzelm parents: 
61912diff
changeset | 516 | |
| 
b13b98a4d5f8
more realistic Eisbach method invocation from ML;
 wenzelm parents: 
61912diff
changeset | 517 | method_setup test_method' = \<open> | 
| 
b13b98a4d5f8
more realistic Eisbach method invocation from ML;
 wenzelm parents: 
61912diff
changeset | 518 | Args.term -- Args.term -- | 
| 
b13b98a4d5f8
more realistic Eisbach method invocation from ML;
 wenzelm parents: 
61912diff
changeset | 519 | (Scan.lift (Args.$$$ "rule" -- Args.colon) |-- Attrib.thms) >> | 
| 
b13b98a4d5f8
more realistic Eisbach method invocation from ML;
 wenzelm parents: 
61912diff
changeset | 520 | (fn ((x, y), r) => fn ctxt => | 
| 62075 | 521 |       Method_Closure.apply_method ctxt @{method test_method} [x, y] [r] [] ctxt);
 | 
| 62070 
b13b98a4d5f8
more realistic Eisbach method invocation from ML;
 wenzelm parents: 
61912diff
changeset | 522 | \<close> | 
| 
b13b98a4d5f8
more realistic Eisbach method invocation from ML;
 wenzelm parents: 
61912diff
changeset | 523 | |
| 
b13b98a4d5f8
more realistic Eisbach method invocation from ML;
 wenzelm parents: 
61912diff
changeset | 524 | lemma | 
| 
b13b98a4d5f8
more realistic Eisbach method invocation from ML;
 wenzelm parents: 
61912diff
changeset | 525 | fixes a b :: nat | 
| 
b13b98a4d5f8
more realistic Eisbach method invocation from ML;
 wenzelm parents: 
61912diff
changeset | 526 | assumes "a = b" | 
| 
b13b98a4d5f8
more realistic Eisbach method invocation from ML;
 wenzelm parents: 
61912diff
changeset | 527 | shows "b = a" | 
| 
b13b98a4d5f8
more realistic Eisbach method invocation from ML;
 wenzelm parents: 
61912diff
changeset | 528 | apply (test_method a b)? | 
| 
b13b98a4d5f8
more realistic Eisbach method invocation from ML;
 wenzelm parents: 
61912diff
changeset | 529 | apply (test_method' a b rule: refl)? | 
| 
b13b98a4d5f8
more realistic Eisbach method invocation from ML;
 wenzelm parents: 
61912diff
changeset | 530 | apply (test_method' a b rule: assms [symmetric])? | 
| 
b13b98a4d5f8
more realistic Eisbach method invocation from ML;
 wenzelm parents: 
61912diff
changeset | 531 | done | 
| 
b13b98a4d5f8
more realistic Eisbach method invocation from ML;
 wenzelm parents: 
61912diff
changeset | 532 | |
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 533 | end |