doc-src/TutorialI/Inductive/Advanced.thy
author wenzelm
Fri, 10 Nov 2000 19:15:38 +0100
changeset 10448 da7d0e28f746
parent 10426 469f19c4bf97
child 10468 87dda999deca
permissions -rw-r--r--
tuned;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
10370
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
     1
(* ID:         $Id$ *)
10426
469f19c4bf97 rule inversion
nipkow
parents: 10370
diff changeset
     2
theory Advanced = Even:
469f19c4bf97 rule inversion
nipkow
parents: 10370
diff changeset
     3
469f19c4bf97 rule inversion
nipkow
parents: 10370
diff changeset
     4
text{* We completely forgot about "rule inversion", or whatever we may want
469f19c4bf97 rule inversion
nipkow
parents: 10370
diff changeset
     5
to call it. Just as a demo I include the two forms that Markus has made available. First the one for binding the result to a name *}
469f19c4bf97 rule inversion
nipkow
parents: 10370
diff changeset
     6
469f19c4bf97 rule inversion
nipkow
parents: 10370
diff changeset
     7
inductive_cases even_cases [elim!]:
469f19c4bf97 rule inversion
nipkow
parents: 10370
diff changeset
     8
  "Suc(Suc n) \<in> even"
469f19c4bf97 rule inversion
nipkow
parents: 10370
diff changeset
     9
469f19c4bf97 rule inversion
nipkow
parents: 10370
diff changeset
    10
thm even_cases;
469f19c4bf97 rule inversion
nipkow
parents: 10370
diff changeset
    11
469f19c4bf97 rule inversion
nipkow
parents: 10370
diff changeset
    12
text{*and now the one for local usage:*}
469f19c4bf97 rule inversion
nipkow
parents: 10370
diff changeset
    13
469f19c4bf97 rule inversion
nipkow
parents: 10370
diff changeset
    14
lemma "Suc(Suc n) \<in> even \<Longrightarrow> n \<in> even";
469f19c4bf97 rule inversion
nipkow
parents: 10370
diff changeset
    15
by(ind_cases "Suc(Suc n) \<in> even");
469f19c4bf97 rule inversion
nipkow
parents: 10370
diff changeset
    16
469f19c4bf97 rule inversion
nipkow
parents: 10370
diff changeset
    17
text{*Both forms accept lists of strings.
469f19c4bf97 rule inversion
nipkow
parents: 10370
diff changeset
    18
469f19c4bf97 rule inversion
nipkow
parents: 10370
diff changeset
    19
Hope you can find some more exciting examples, although these may do
469f19c4bf97 rule inversion
nipkow
parents: 10370
diff changeset
    20
*}
469f19c4bf97 rule inversion
nipkow
parents: 10370
diff changeset
    21
10370
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
    22
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
    23
datatype 'f "term" = Apply 'f "'f term list"
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
    24
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
    25
consts terms :: "'f set \<Rightarrow> 'f term set"
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
    26
inductive "terms F"
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
    27
intros
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
    28
step[intro]: "\<lbrakk>\<forall>t \<in> set term_list. t \<in> terms F;  f \<in> F\<rbrakk>
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
    29
              \<Longrightarrow> (Apply f term_list) \<in> terms F"
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
    30
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
    31
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
    32
lemma "F\<subseteq>G \<Longrightarrow> terms F \<subseteq> terms G"
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
    33
apply clarify
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
    34
apply (erule terms.induct)
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
    35
apply blast
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
    36
done
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
    37
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
    38
consts term_type :: "('f \<Rightarrow> 't list * 't) \<Rightarrow> ('f term * 't)set"
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
    39
inductive "term_type sig"
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
    40
intros
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
    41
step[intro]: "\<lbrakk>\<forall>et \<in> set term_type_list. et \<in> term_type sig; 
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
    42
               sig f = (map snd term_type_list, rtype)\<rbrakk>
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
    43
              \<Longrightarrow> (Apply f (map fst term_type_list), rtype) \<in> term_type sig"
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
    44
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
    45
consts term_type' :: "('f \<Rightarrow> 't list * 't) \<Rightarrow> ('f term * 't)set"
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
    46
inductive "term_type' sig"
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
    47
intros
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
    48
step[intro]: "\<lbrakk>term_type_list \<in> lists(term_type' sig); 
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
    49
                 sig f = (map snd term_type_list, rtype)\<rbrakk>
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
    50
              \<Longrightarrow> (Apply f (map fst term_type_list), rtype) \<in> term_type' sig"
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
    51
monos lists_mono
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
    52
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
    53
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
    54
lemma "term_type sig \<subseteq> term_type' sig"
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
    55
apply clarify
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
    56
apply (erule term_type.induct)
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
    57
apply auto
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
    58
done
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
    59
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
    60
lemma "term_type' sig \<subseteq> term_type sig"
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
    61
apply clarify
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
    62
apply (erule term_type'.induct)
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
    63
apply auto
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
    64
done
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
    65
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
    66
end
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
    67