CookBook/Package/Ind_Examples.thy
changeset 32 5bb2d29553c2
child 38 e21b2f888fa2
equal deleted inserted replaced
31:53460ac408b5 32:5bb2d29553c2
       
     1 theory Ind_Examples
       
     2 imports Main
       
     3 begin
       
     4 
       
     5 section{* Examples of inductive definitions *}
       
     6 
       
     7 text {*
       
     8 \label{sec:ind-examples}
       
     9 In this section, we will give three examples showing how to define inductive
       
    10 predicates by hand and prove characteristic properties such as introduction
       
    11 rules and an induction rule. From these examples, we will then figure out a
       
    12 general method for defining inductive predicates, which will be described in
       
    13 \S\ref{sec:ind-general-method}. This description will serve as a basis for the
       
    14 actual implementation to be developed in \S\ref{sec:ind-interface} -- \S\ref{sec:ind-proofs}.
       
    15 It should be noted that our aim in this section is not to write proofs that
       
    16 are as beautiful as possible, but as close as possible to the ML code producing
       
    17 the proofs that we will develop later.
       
    18 As a first example, we consider the \emph{transitive closure} @{text "trcl R"}
       
    19 of a relation @{text R}. It is characterized by the following
       
    20 two introduction rules
       
    21 \[
       
    22 \begin{array}{l}
       
    23 @{term "trcl R x x"} \\
       
    24 @{term [mode=no_brackets] "R x y \<Longrightarrow> trcl R y z \<Longrightarrow> trcl R x z"}
       
    25 \end{array}
       
    26 \]
       
    27 Note that the @{text trcl} predicate has two different kinds of parameters: the
       
    28 first parameter @{text R} stays \emph{fixed} throughout the definition, whereas
       
    29 the second and third parameter changes in the ``recursive call''.
       
    30 Since an inductively defined predicate is the \emph{least} predicate closed under
       
    31 a collection of introduction rules, we define the predicate @{text "trcl R x y"} in
       
    32 such a way that it holds if and only if @{text "P x y"} holds for every predicate
       
    33 @{text P} closed under the above rules. This gives rise to a definition containing
       
    34 a universal quantifier over the predicate @{text P}:
       
    35 *}
       
    36 
       
    37 definition "trcl \<equiv> \<lambda>R x y.
       
    38   \<forall>P. (\<forall>x. P x x) \<longrightarrow> (\<forall>x y z. R x y \<longrightarrow> P y z \<longrightarrow> P x z) \<longrightarrow> P x y"
       
    39 
       
    40 text {*
       
    41 \noindent
       
    42 Since the predicate @{term "trcl R x y"} yields an element of the type of object
       
    43 level truth values @{text bool}, the meta-level implications @{text "\<Longrightarrow>"} in the
       
    44 above introduction rules have to be converted to object-level implications
       
    45 @{text "\<longrightarrow>"}. Moreover, we use object-level universal quantifiers @{text "\<forall>"}
       
    46 rather than meta-level universal quantifiers @{text "\<And>"} for quantifying over
       
    47 the variable parameters of the introduction rules. Isabelle already offers some
       
    48 infrastructure for converting between meta-level and object-level connectives,
       
    49 which we will use later on.
       
    50 
       
    51 With this definition of the transitive closure, the proof of the (weak) induction
       
    52 theorem is almost immediate. It suffices to convert all the meta-level connectives
       
    53 in the induction rule to object-level connectives using the @{text atomize} proof
       
    54 method, expand the definition of @{text trcl}, eliminate the universal quantifier
       
    55 contained in it, and then solve the goal by assumption.
       
    56 *}
       
    57 
       
    58 lemma trcl_induct:
       
    59   assumes trcl: "trcl R x y"
       
    60   shows "(\<And>x. P x x) \<Longrightarrow> (\<And>x y z. R x y \<Longrightarrow> P y z \<Longrightarrow> P x z) \<Longrightarrow> P x y"
       
    61   apply (atomize (full))
       
    62   apply (cut_tac trcl)
       
    63   apply (unfold trcl_def)
       
    64   apply (drule spec [where x=P])
       
    65   apply assumption
       
    66   done
       
    67 (*<*)
       
    68 lemma "trcl R x x"
       
    69   apply (unfold trcl_def)
       
    70   apply (rule allI impI)+
       
    71 (*>*)
       
    72 txt {*
       
    73 \noindent
       
    74 The above induction rule is \emph{weak} in the sense that the induction step may
       
    75 only be proved using the assumptions @{term "R x y"} and @{term "P y z"}, but not
       
    76 using the additional assumption \mbox{@{term "trcl R y z"}}. A stronger induction rule
       
    77 containing this additional assumption can be derived from the weaker one with the
       
    78 help of the introduction rules for @{text trcl}.
       
    79 
       
    80 We now turn to the proofs of the introduction rules, which are slightly more complicated.
       
    81 In order to prove the first introduction rule, we again unfold the definition and
       
    82 then apply the introdution rules for @{text "\<forall>"} and @{text "\<longrightarrow>"} as often as possible.
       
    83 We then end up in a proof state of the following form:
       
    84 @{subgoals [display]}
       
    85 The two assumptions correspond to the introduction rules, where @{term "trcl R"} has been
       
    86 replaced by @{term "P"}. Thus, all we have to do is to eliminate the universal quantifier
       
    87 in front of the first assumption, and then solve the goal by assumption:
       
    88 *}
       
    89 (*<*)oops(*>*)
       
    90 lemma trcl_base: "trcl R x x"
       
    91   apply (unfold trcl_def)
       
    92   apply (rule allI impI)+
       
    93   apply (drule spec)
       
    94   apply assumption
       
    95   done
       
    96 (*<*)
       
    97 lemma "R x y \<Longrightarrow> trcl R y z \<Longrightarrow> trcl R x z"
       
    98   apply (unfold trcl_def)
       
    99   apply (rule allI impI)+
       
   100 (*>*)
       
   101 txt {*
       
   102 \noindent
       
   103 Since the second introduction rule has premises, its proof is not as easy as the previous
       
   104 one. After unfolding the definitions and applying the introduction rules for @{text "\<forall>"}
       
   105 and @{text "\<longrightarrow>"}, we get the proof state
       
   106 @{subgoals [display]}
       
   107 The third and fourth assumption corresponds to the first and second introduction rule,
       
   108 respectively, whereas the first and second assumption corresponds to the premises of
       
   109 the introduction rule. Since we want to prove the second introduction rule, we apply
       
   110 the fourth assumption to the goal @{term "P x z"}. In order for the assumption to
       
   111 be applicable, we have to eliminate the universal quantifiers and turn the object-level
       
   112 implications into meta-level ones. This can be accomplished using the @{text rule_format}
       
   113 attribute. Applying the assumption produces two new subgoals, which can be solved using
       
   114 the first and second assumption. The second assumption again involves a quantifier and
       
   115 implications that have to be eliminated before it can be applied. To avoid problems
       
   116 with higher order unification, it is advisable to provide an instantiation for the
       
   117 universally quantified predicate variable in the assumption.
       
   118 *}
       
   119 (*<*)oops(*>*)
       
   120 lemma trcl_step: "R x y \<Longrightarrow> trcl R y z \<Longrightarrow> trcl R x z"
       
   121   apply (unfold trcl_def)
       
   122   apply (rule allI impI)+
       
   123   proof -
       
   124     case goal1
       
   125     show ?case
       
   126       apply (rule goal1(4) [rule_format])
       
   127       apply (rule goal1(1))
       
   128       apply (rule goal1(2) [THEN spec [where x=P], THEN mp, THEN mp,
       
   129 	OF goal1(3-4)])
       
   130       done
       
   131   qed
       
   132 
       
   133 text {*
       
   134 \noindent
       
   135 This method of defining inductive predicates easily generalizes to mutually inductive
       
   136 predicates, like the predicates @{text even} and @{text odd} characterized by the
       
   137 following introduction rules:
       
   138 \[
       
   139 \begin{array}{l}
       
   140 @{term "even (0::nat)"} \\
       
   141 @{term "odd m \<Longrightarrow> even (Suc m)"} \\
       
   142 @{term "even m \<Longrightarrow> odd (Suc m)"}
       
   143 \end{array}
       
   144 \]
       
   145 Since the predicates are mutually inductive, each of the definitions contain two
       
   146 quantifiers over the predicates @{text P} and @{text Q}.
       
   147 *}
       
   148 
       
   149 definition "even \<equiv> \<lambda>n.
       
   150   \<forall>P Q. P 0 \<longrightarrow> (\<forall>m. Q m \<longrightarrow> P (Suc m)) \<longrightarrow> (\<forall>m. P m \<longrightarrow> Q (Suc m)) \<longrightarrow> P n"
       
   151 
       
   152 definition "odd \<equiv> \<lambda>n.
       
   153   \<forall>P Q. P 0 \<longrightarrow> (\<forall>m. Q m \<longrightarrow> P (Suc m)) \<longrightarrow> (\<forall>m. P m \<longrightarrow> Q (Suc m)) \<longrightarrow> Q n"
       
   154 
       
   155 text {*
       
   156 \noindent
       
   157 For proving the induction rule, we use exactly the same technique as in the transitive
       
   158 closure example:
       
   159 *}
       
   160 
       
   161 lemma even_induct:
       
   162   assumes even: "even n"
       
   163   shows "P 0 \<Longrightarrow> (\<And>m. Q m \<Longrightarrow> P (Suc m)) \<Longrightarrow> (\<And>m. P m \<Longrightarrow> Q (Suc m)) \<Longrightarrow> P n"
       
   164   apply (atomize (full))
       
   165   apply (cut_tac even)
       
   166   apply (unfold even_def)
       
   167   apply (drule spec [where x=P])
       
   168   apply (drule spec [where x=Q])
       
   169   apply assumption
       
   170   done
       
   171 
       
   172 text {*
       
   173 \noindent
       
   174 A similar induction rule having @{term "Q n"} as a conclusion can be proved for
       
   175 the @{text odd} predicate.
       
   176 The proofs of the introduction rules are also very similar to the ones in the
       
   177 previous example. We only show the proof of the second introduction rule,
       
   178 since it is almost the same as the one for the third introduction rule,
       
   179 and the proof of the first rule is trivial.
       
   180 *}
       
   181 
       
   182 lemma evenS: "odd m \<Longrightarrow> even (Suc m)"
       
   183   apply (unfold odd_def even_def)
       
   184   apply (rule allI impI)+
       
   185   proof -
       
   186     case goal1
       
   187     show ?case
       
   188       apply (rule goal1(3) [rule_format])
       
   189       apply (rule goal1(1) [THEN spec [where x=P], THEN spec [where x=Q],
       
   190 	THEN mp, THEN mp, THEN mp, OF goal1(2-4)])
       
   191       done
       
   192   qed
       
   193 (*<*)
       
   194 lemma even0: "even 0"
       
   195   apply (unfold even_def)
       
   196   apply (rule allI impI)+
       
   197   apply assumption
       
   198   done
       
   199 
       
   200 lemma oddS: "even m \<Longrightarrow> odd (Suc m)"
       
   201   apply (unfold odd_def even_def)
       
   202   apply (rule allI impI)+
       
   203   proof -
       
   204     case goal1
       
   205     show ?case
       
   206       apply (rule goal1(4) [rule_format])
       
   207       apply (rule goal1(1) [THEN spec [where x=P], THEN spec [where x=Q],
       
   208 	THEN mp, THEN mp, THEN mp, OF goal1(2-4)])
       
   209       done
       
   210   qed
       
   211 (*>*)
       
   212 text {*
       
   213 \noindent
       
   214 As a final example, we will consider the definition of the accessible
       
   215 part of a relation @{text R} characterized by the introduction rule
       
   216 \[
       
   217 @{term "(\<And>y. R y x \<Longrightarrow> accpart R y) \<Longrightarrow> accpart R x"}
       
   218 \]
       
   219 whose premise involves a universal quantifier and an implication. The
       
   220 definition of @{text accpart} is as follows:
       
   221 *}
       
   222 
       
   223 definition "accpart \<equiv> \<lambda>R x. \<forall>P. (\<forall>x. (\<forall>y. R y x \<longrightarrow> P y) \<longrightarrow> P x) \<longrightarrow> P x"
       
   224 
       
   225 text {*
       
   226 \noindent
       
   227 The proof of the induction theorem is again straightforward:
       
   228 *}
       
   229 
       
   230 lemma accpart_induct:
       
   231   assumes acc: "accpart R x"
       
   232   shows "(\<And>x. (\<And>y. R y x \<Longrightarrow> P y) \<Longrightarrow> P x) \<Longrightarrow> P x"
       
   233   apply (atomize (full))
       
   234   apply (cut_tac acc)
       
   235   apply (unfold accpart_def)
       
   236   apply (drule spec [where x=P])
       
   237   apply assumption
       
   238   done
       
   239 (*<*)
       
   240 lemma accpartI: "(\<And>y. R y x \<Longrightarrow> accpart R y) \<Longrightarrow> accpart R x"
       
   241   apply (unfold accpart_def)
       
   242   apply (rule allI impI)+
       
   243 (*>*)
       
   244 txt {*
       
   245 \noindent
       
   246 Proving the introduction rule is a little more complicated, due to the quantifier
       
   247 and the implication in the premise. We first convert the meta-level universal quantifier
       
   248 and implication to their object-level counterparts. Unfolding the definition of
       
   249 @{text accpart} and applying the introduction rules for @{text "\<forall>"} and @{text "\<longrightarrow>"}
       
   250 yields the following proof state:
       
   251 @{subgoals [display]}
       
   252 Applying the second assumption produces a proof state with the new local assumption
       
   253 @{term "R y x"}, which will then be used to solve the goal @{term "P y"} using the
       
   254 first assumption.
       
   255 *}
       
   256 (*<*)oops(*>*)
       
   257 lemma accpartI: "(\<And>y. R y x \<Longrightarrow> accpart R y) \<Longrightarrow> accpart R x"
       
   258   apply (unfold accpart_def)
       
   259   apply (rule allI impI)+
       
   260   proof -
       
   261     case goal1
       
   262     note goal1' = this
       
   263     show ?case
       
   264       apply (rule goal1'(2) [rule_format])
       
   265       proof -
       
   266         case goal1
       
   267         show ?case
       
   268 	  apply (rule goal1'(1) [OF goal1, THEN spec [where x=P],
       
   269             THEN mp, OF goal1'(2)])
       
   270 	  done
       
   271       qed
       
   272     qed
       
   273 
       
   274 end