doc-src/TutorialI/Overview/Rules.thy
author berghofe
Thu, 13 Sep 2001 16:26:16 +0200
changeset 11563 e172cbed431d
parent 11235 860c65c7388a
child 13238 a6cb18a25cbb
permissions -rw-r--r--
Fixed proof term bug in permute_prems.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
11235
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
     1
theory Rules = Main:
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
     2
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
     3
section{*The  Rules of the Game*}
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
     4
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
     5
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
     6
subsection{*Introduction Rules*}
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
     7
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
     8
thm impI conjI disjI1 disjI2 iffI
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
     9
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    10
lemma "A \<Longrightarrow> B \<longrightarrow> A \<and> (B \<and> A)"
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    11
apply(rule impI)
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    12
apply(rule conjI)
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    13
 apply assumption
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    14
apply(rule conjI)
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    15
 apply assumption
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    16
apply assumption
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    17
done
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    18
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    19
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    20
subsection{*Elimination Rules*}
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    21
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    22
thm impE mp
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    23
thm conjE
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    24
thm disjE
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    25
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    26
lemma disj_swap: "P | Q \<Longrightarrow> Q | P"
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    27
apply (erule disjE)
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    28
 apply (rule disjI2)
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    29
 apply assumption
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    30
apply (rule disjI1)
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    31
apply assumption
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    32
done
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    33
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    34
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    35
subsection{*Destruction Rules*}
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    36
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    37
thm conjunct1 conjunct1 iffD1 iffD2
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    38
lemma conj_swap: "P \<and> Q \<Longrightarrow> Q \<and> P"
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    39
apply (rule conjI)
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    40
 apply (drule conjunct2)
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    41
 apply assumption
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    42
apply (drule conjunct1)
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    43
apply assumption
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    44
done
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    45
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    46
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    47
subsection{*Quantifiers*}
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    48
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    49
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    50
thm allI exI
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    51
thm allE exE
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    52
thm spec
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    53
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    54
lemma "\<exists>x.\<forall>y. P x y \<Longrightarrow> \<forall>y.\<exists>x. P x y"
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    55
oops
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    56
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    57
subsection{*Instantiation*}
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    58
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    59
lemma "\<exists>xs. xs @ xs = xs"
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    60
apply(rule_tac x = "[]" in exI)
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    61
by simp
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    62
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    63
lemma "\<forall>xs. f(xs @ xs) = xs \<Longrightarrow> f [] = []"
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    64
apply(erule_tac x = "[]" in allE)
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    65
by simp
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    66
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    67
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    68
subsection{*Hilbert's epsilon Operator*}
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    69
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    70
theorem axiom_of_choice:
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    71
     "\<forall>x. \<exists>y. P x y \<Longrightarrow> \<exists>f. \<forall>x. P x (f x)"
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    72
by (fast elim!: someI)
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    73
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    74
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    75
subsection{*Automation*}
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    76
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    77
lemma "(\<forall>x. honest(x) \<and> industrious(x) \<longrightarrow> healthy(x)) \<and>  
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    78
       \<not> (\<exists>x. grocer(x) \<and> healthy(x)) \<and> 
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    79
       (\<forall>x. industrious(x) \<and> grocer(x) \<longrightarrow> honest(x)) \<and> 
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    80
       (\<forall>x. cyclist(x) \<longrightarrow> industrious(x)) \<and> 
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    81
       (\<forall>x. \<not>healthy(x) \<and> cyclist(x) \<longrightarrow> \<not>honest(x))  
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    82
       \<longrightarrow> (\<forall>x. grocer(x) \<longrightarrow> \<not>cyclist(x))";
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    83
by blast
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    84
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    85
lemma "(\<Union>i\<in>I. A(i)) \<inter> (\<Union>j\<in>J. B(j)) =
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    86
       (\<Union>i\<in>I. \<Union>j\<in>J. A(i) \<inter> B(j))"
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    87
by fast
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    88
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    89
lemma "\<exists>x.\<forall>y. P x y \<Longrightarrow> \<forall>y.\<exists>x. P x y"
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    90
apply(clarify)
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    91
by blast
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    92
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    93
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    94
subsection{*Forward Proof*}
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    95
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    96
thm rev_rev_ident
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    97
thm rev_rev_ident[of "[]"]
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    98
thm sym
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    99
thm sym[OF rev_rev_ident]
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   100
thm rev_rev_ident[THEN sym]
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   101
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   102
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   103
subsection{*Further Useful Methods*}
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   104
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   105
lemma "n \<le> 1 \<and> n \<noteq> 0 \<Longrightarrow> n^n = n"
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   106
apply(subgoal_tac "n=1")
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   107
 apply simp
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   108
apply arith
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   109
done
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   110
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   111
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   112
lemma "\<lbrakk> 2 \<in> Q; sqrt 2 \<notin> Q;
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   113
         \<forall>x y z. sqrt x * sqrt x = x \<and>
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   114
                  x ^ 2 = x * x \<and>
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   115
                 (x ^ y) ^ z = x ^ (y*z)
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   116
       \<rbrakk> \<Longrightarrow> \<exists>a b. a \<notin> Q \<and> b \<notin> Q \<and> a ^ b \<in> Q"
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   117
(*
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   118
apply(case_tac "")
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   119
 apply blast
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   120
apply(rule_tac x = "" in exI)
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   121
apply(rule_tac x = "" in exI)
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   122
apply simp
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   123
done
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   124
*)
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   125
oops
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   126
end