doc-src/TutorialI/Overview/Rules.thy
author nipkow
Fri, 21 Jun 2002 18:40:06 +0200
changeset 13238 a6cb18a25cbb
parent 11235 860c65c7388a
child 13250 efd5db7dc7cc
permissions -rw-r--r--
*** empty log message ***
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
13238
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
     1
(*<*)
11235
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
     2
theory Rules = Main:
13238
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
     3
(*>*)
11235
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
     4
13238
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
     5
section{*The Rules of the Game*}
11235
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
     6
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
     7
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
     8
subsection{*Introduction Rules*}
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
     9
13238
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
    10
text{* Introduction rules for propositional logic:
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
    11
\begin{center}
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
    12
\begin{tabular}{ll}
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
    13
@{thm[source]impI} & @{thm impI[no_vars]} \\
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
    14
@{thm[source]conjI} & @{thm conjI[no_vars]} \\
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
    15
@{thm[source]disjI1} & @{thm disjI1[no_vars]} \\
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
    16
@{thm[source]disjI2} & @{thm disjI2[no_vars]} \\
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
    17
@{thm[source]iffI} & @{thm iffI[no_vars]}
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
    18
\end{tabular}
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
    19
\end{center}
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
    20
*}
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
    21
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
    22
(*<*)
11235
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    23
thm impI conjI disjI1 disjI2 iffI
13238
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
    24
(*>*)
11235
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    25
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    26
lemma "A \<Longrightarrow> B \<longrightarrow> A \<and> (B \<and> A)"
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    27
apply(rule impI)
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    28
apply(rule conjI)
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    29
 apply assumption
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    30
apply(rule conjI)
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    31
 apply assumption
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    32
apply assumption
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    33
done
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    34
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    35
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    36
subsection{*Elimination Rules*}
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    37
13238
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
    38
text{* Elimination rules for propositional logic:
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
    39
\begin{center}
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
    40
\begin{tabular}{ll}
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
    41
@{thm[source]impE} & @{thm impE[no_vars]} \\
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
    42
@{thm[source]mp} & @{thm mp[no_vars]} \\
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
    43
@{thm[source]conjE} & @{thm conjE[no_vars]} \\
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
    44
@{thm[source]disjE} & @{thm disjE[no_vars]}
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
    45
\end{tabular}
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
    46
\end{center}
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
    47
*}
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
    48
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
    49
(*<*)
11235
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    50
thm impE mp
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    51
thm conjE
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    52
thm disjE
13238
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
    53
(*>*)
11235
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    54
13238
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
    55
lemma disj_swap: "P \<or> Q \<Longrightarrow> Q \<or> P"
11235
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    56
apply (erule disjE)
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    57
 apply (rule disjI2)
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    58
 apply assumption
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    59
apply (rule disjI1)
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    60
apply assumption
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    61
done
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    62
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    63
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    64
subsection{*Destruction Rules*}
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    65
13238
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
    66
text{* Destruction rules for propositional logic:
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
    67
\begin{center}
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
    68
\begin{tabular}{ll}
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
    69
@{thm[source]conjunct1} & @{thm conjunct1[no_vars]} \\
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
    70
@{thm[source]conjunct2} & @{thm conjunct2[no_vars]} \\
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
    71
@{thm[source]iffD1} & @{thm iffD1[no_vars]} \\
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
    72
@{thm[source]iffD2} & @{thm iffD2[no_vars]}
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
    73
\end{tabular}
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
    74
\end{center}
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
    75
*}
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
    76
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
    77
(*<*)
11235
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    78
thm conjunct1 conjunct1 iffD1 iffD2
13238
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
    79
(*>*)
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
    80
11235
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    81
lemma conj_swap: "P \<and> Q \<Longrightarrow> Q \<and> P"
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    82
apply (rule conjI)
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    83
 apply (drule conjunct2)
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    84
 apply assumption
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    85
apply (drule conjunct1)
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    86
apply assumption
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    87
done
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    88
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    89
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    90
subsection{*Quantifiers*}
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
    91
13238
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
    92
text{* Quantifier rules:
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
    93
\begin{center}
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
    94
\begin{tabular}{ll}
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
    95
@{thm[source]allI} & @{thm allI[no_vars]} \\
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
    96
@{thm[source]exI} & @{thm exI[no_vars]} \\
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
    97
@{thm[source]allE} & @{thm allE[no_vars]} \\
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
    98
@{thm[source]exE} & @{thm exE[no_vars]} \\
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
    99
@{thm[source]spec} & @{thm spec[no_vars]}
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
   100
\end{tabular}
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
   101
\end{center}
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
   102
*}
11235
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   103
13238
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
   104
(*<*)
11235
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   105
thm allI exI
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   106
thm allE exE
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   107
thm spec
13238
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
   108
(*>*)
11235
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   109
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   110
lemma "\<exists>x.\<forall>y. P x y \<Longrightarrow> \<forall>y.\<exists>x. P x y"
13238
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
   111
(*<*)oops(*>*)
11235
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   112
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   113
subsection{*Instantiation*}
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   114
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   115
lemma "\<exists>xs. xs @ xs = xs"
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   116
apply(rule_tac x = "[]" in exI)
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   117
by simp
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   118
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   119
lemma "\<forall>xs. f(xs @ xs) = xs \<Longrightarrow> f [] = []"
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   120
apply(erule_tac x = "[]" in allE)
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   121
by simp
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   122
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   123
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   124
subsection{*Automation*}
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   125
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   126
lemma "(\<forall>x. honest(x) \<and> industrious(x) \<longrightarrow> healthy(x)) \<and>  
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   127
       \<not> (\<exists>x. grocer(x) \<and> healthy(x)) \<and> 
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   128
       (\<forall>x. industrious(x) \<and> grocer(x) \<longrightarrow> honest(x)) \<and> 
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   129
       (\<forall>x. cyclist(x) \<longrightarrow> industrious(x)) \<and> 
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   130
       (\<forall>x. \<not>healthy(x) \<and> cyclist(x) \<longrightarrow> \<not>honest(x))  
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   131
       \<longrightarrow> (\<forall>x. grocer(x) \<longrightarrow> \<not>cyclist(x))";
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   132
by blast
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   133
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   134
lemma "(\<Union>i\<in>I. A(i)) \<inter> (\<Union>j\<in>J. B(j)) =
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   135
       (\<Union>i\<in>I. \<Union>j\<in>J. A(i) \<inter> B(j))"
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   136
by fast
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   137
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   138
lemma "\<exists>x.\<forall>y. P x y \<Longrightarrow> \<forall>y.\<exists>x. P x y"
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   139
apply(clarify)
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   140
by blast
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   141
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   142
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   143
subsection{*Forward Proof*}
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   144
13238
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
   145
text{*
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
   146
Instantiation of unknowns (in left-to-right order):
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
   147
\begin{center}
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
   148
\begin{tabular}{@ {}ll@ {}}
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
   149
@{thm[source]append_self_conv} & @{thm append_self_conv} \\
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
   150
@{thm[source]append_self_conv[of _ "[]"]} & @{thm append_self_conv[of _ "[]"]}
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
   151
\end{tabular}
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
   152
\end{center}
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
   153
Applying one theorem to another
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
   154
by unifying the premise of one theorem with the conclusion of another:
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
   155
\begin{center}
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
   156
\begin{tabular}{@ {}ll@ {}}
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
   157
@{thm[source]sym} & @{thm sym} \\
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
   158
@{thm[source]sym[OF append_self_conv]} & @{thm sym[OF append_self_conv]}\\
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
   159
@{thm[source]append_self_conv[THEN sym]} & @{thm append_self_conv[THEN sym]}
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
   160
\end{tabular}
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
   161
\end{center}
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
   162
*}
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
   163
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
   164
(*<*)
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
   165
thm append_self_conv
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
   166
thm append_self_conv[of _ "[]"]
11235
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   167
thm sym
13238
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
   168
thm sym[OF append_self_conv]
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
   169
thm append_self_conv[THEN sym]
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
   170
(*>*)
11235
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   171
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   172
subsection{*Further Useful Methods*}
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   173
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   174
lemma "n \<le> 1 \<and> n \<noteq> 0 \<Longrightarrow> n^n = n"
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   175
apply(subgoal_tac "n=1")
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   176
 apply simp
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   177
apply arith
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   178
done
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   179
13238
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
   180
text{* And a cute example: *}
11235
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   181
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   182
lemma "\<lbrakk> 2 \<in> Q; sqrt 2 \<notin> Q;
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   183
         \<forall>x y z. sqrt x * sqrt x = x \<and>
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   184
                  x ^ 2 = x * x \<and>
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   185
                 (x ^ y) ^ z = x ^ (y*z)
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   186
       \<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
   187
(*
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   188
apply(case_tac "")
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   189
 apply blast
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   190
apply(rule_tac x = "" in exI)
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   191
apply(rule_tac x = "" in exI)
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   192
apply simp
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   193
done
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   194
*)
13238
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
   195
(*<*)
11235
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   196
oops
860c65c7388a *** empty log message ***
nipkow
parents:
diff changeset
   197
end
13238
a6cb18a25cbb *** empty log message ***
nipkow
parents: 11235
diff changeset
   198
(*>*)