doc-src/TutorialI/Inductive/Advanced.thy
author chaieb
Wed, 19 May 2004 11:23:59 +0200
changeset 14758 af3b71a46a1c
parent 12156 d2758965362e
child 16417 9bc16273c2d4
permissions -rw-r--r--
A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller. the tactic has also changed and allows the abstaction over fuction occurences whose type is nat or int.
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
10468
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
     4
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
     5
datatype 'f gterm = Apply 'f "'f gterm list"
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
     6
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
     7
datatype integer_op = Number int | UnaryMinus | Plus;
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
     8
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
     9
consts gterms :: "'f set \<Rightarrow> 'f gterm set"
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    10
inductive "gterms F"
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    11
intros
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    12
step[intro!]: "\<lbrakk>\<forall>t \<in> set args. t \<in> gterms F;  f \<in> F\<rbrakk>
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    13
               \<Longrightarrow> (Apply f args) \<in> gterms F"
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    14
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    15
lemma gterms_mono: "F\<subseteq>G \<Longrightarrow> gterms F \<subseteq> gterms G"
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    16
apply clarify
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    17
apply (erule gterms.induct)
10882
ca41ba5fb8e2 updated for new version of advanced-examples.tex
paulson
parents: 10468
diff changeset
    18
txt{*
ca41ba5fb8e2 updated for new version of advanced-examples.tex
paulson
parents: 10468
diff changeset
    19
@{subgoals[display,indent=0,margin=65]}
ca41ba5fb8e2 updated for new version of advanced-examples.tex
paulson
parents: 10468
diff changeset
    20
*};
10468
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    21
apply blast
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    22
done
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    23
10882
ca41ba5fb8e2 updated for new version of advanced-examples.tex
paulson
parents: 10468
diff changeset
    24
10468
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    25
text{*
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    26
@{thm[display] even.cases[no_vars]}
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    27
\rulename{even.cases}
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    28
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    29
Just as a demo I include
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    30
the two forms that Markus has made available. First the one for binding the
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    31
result to a name 
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    32
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    33
*}
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    34
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    35
inductive_cases Suc_Suc_cases [elim!]:
10426
469f19c4bf97 rule inversion
nipkow
parents: 10370
diff changeset
    36
  "Suc(Suc n) \<in> even"
469f19c4bf97 rule inversion
nipkow
parents: 10370
diff changeset
    37
10468
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    38
thm Suc_Suc_cases;
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    39
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    40
text{*
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    41
@{thm[display] Suc_Suc_cases[no_vars]}
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    42
\rulename{Suc_Suc_cases}
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    43
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    44
and now the one for local usage:
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    45
*}
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    46
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    47
lemma "Suc(Suc n) \<in> even \<Longrightarrow> P n";
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    48
apply (ind_cases "Suc(Suc n) \<in> even");
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    49
oops
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    50
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    51
inductive_cases gterm_Apply_elim [elim!]: "Apply f args \<in> gterms F"
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    52
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    53
text{*this is what we get:
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    54
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    55
@{thm[display] gterm_Apply_elim[no_vars]}
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    56
\rulename{gterm_Apply_elim}
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    57
*}
10426
469f19c4bf97 rule inversion
nipkow
parents: 10370
diff changeset
    58
11173
094b76968484 revisions in response to comments by Tobias
paulson
parents: 10882
diff changeset
    59
lemma gterms_IntI [rule_format, intro!]:
10468
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    60
     "t \<in> gterms F \<Longrightarrow> t \<in> gterms G \<longrightarrow> t \<in> gterms (F\<inter>G)"
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    61
apply (erule gterms.induct)
10882
ca41ba5fb8e2 updated for new version of advanced-examples.tex
paulson
parents: 10468
diff changeset
    62
txt{*
ca41ba5fb8e2 updated for new version of advanced-examples.tex
paulson
parents: 10468
diff changeset
    63
@{subgoals[display,indent=0,margin=65]}
ca41ba5fb8e2 updated for new version of advanced-examples.tex
paulson
parents: 10468
diff changeset
    64
*};
10468
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    65
apply blast
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    66
done
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    67
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    68
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    69
text{*
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    70
@{thm[display] mono_Int[no_vars]}
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    71
\rulename{mono_Int}
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    72
*}
10426
469f19c4bf97 rule inversion
nipkow
parents: 10370
diff changeset
    73
10468
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    74
lemma gterms_Int_eq [simp]:
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    75
     "gterms (F\<inter>G) = gterms F \<inter> gterms G"
11173
094b76968484 revisions in response to comments by Tobias
paulson
parents: 10882
diff changeset
    76
by (blast intro!: mono_Int monoI gterms_mono)
10468
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    77
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    78
12156
d2758965362e new-style numerals without leading #, along with generic 0 and 1
paulson
parents: 11711
diff changeset
    79
text{*the following declaration isn't actually used*}
10468
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    80
consts integer_arity :: "integer_op \<Rightarrow> nat"
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    81
primrec
11711
ecdfd237ffee fixed numerals;
wenzelm
parents: 11173
diff changeset
    82
"integer_arity (Number n)        = 0"
ecdfd237ffee fixed numerals;
wenzelm
parents: 11173
diff changeset
    83
"integer_arity UnaryMinus        = 1"
ecdfd237ffee fixed numerals;
wenzelm
parents: 11173
diff changeset
    84
"integer_arity Plus              = 2"
10468
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    85
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    86
consts well_formed_gterm :: "('f \<Rightarrow> nat) \<Rightarrow> 'f gterm set"
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    87
inductive "well_formed_gterm arity"
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    88
intros
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    89
step[intro!]: "\<lbrakk>\<forall>t \<in> set args. t \<in> well_formed_gterm arity;  
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    90
                length args = arity f\<rbrakk>
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    91
               \<Longrightarrow> (Apply f args) \<in> well_formed_gterm arity"
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    92
10426
469f19c4bf97 rule inversion
nipkow
parents: 10370
diff changeset
    93
10468
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    94
consts well_formed_gterm' :: "('f \<Rightarrow> nat) \<Rightarrow> 'f gterm set"
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    95
inductive "well_formed_gterm' arity"
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    96
intros
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    97
step[intro!]: "\<lbrakk>args \<in> lists (well_formed_gterm' arity);  
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    98
                length args = arity f\<rbrakk>
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
    99
               \<Longrightarrow> (Apply f args) \<in> well_formed_gterm' arity"
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
   100
monos lists_mono
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
   101
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
   102
lemma "well_formed_gterm arity \<subseteq> well_formed_gterm' arity"
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
   103
apply clarify
10882
ca41ba5fb8e2 updated for new version of advanced-examples.tex
paulson
parents: 10468
diff changeset
   104
txt{*
ca41ba5fb8e2 updated for new version of advanced-examples.tex
paulson
parents: 10468
diff changeset
   105
The situation after clarify
ca41ba5fb8e2 updated for new version of advanced-examples.tex
paulson
parents: 10468
diff changeset
   106
@{subgoals[display,indent=0,margin=65]}
ca41ba5fb8e2 updated for new version of advanced-examples.tex
paulson
parents: 10468
diff changeset
   107
*};
10468
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
   108
apply (erule well_formed_gterm.induct)
10882
ca41ba5fb8e2 updated for new version of advanced-examples.tex
paulson
parents: 10468
diff changeset
   109
txt{*
ca41ba5fb8e2 updated for new version of advanced-examples.tex
paulson
parents: 10468
diff changeset
   110
note the induction hypothesis!
ca41ba5fb8e2 updated for new version of advanced-examples.tex
paulson
parents: 10468
diff changeset
   111
@{subgoals[display,indent=0,margin=65]}
ca41ba5fb8e2 updated for new version of advanced-examples.tex
paulson
parents: 10468
diff changeset
   112
*};
10468
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
   113
apply auto
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
   114
done
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
   115
10426
469f19c4bf97 rule inversion
nipkow
parents: 10370
diff changeset
   116
10370
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
   117
10468
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
   118
lemma "well_formed_gterm' arity \<subseteq> well_formed_gterm arity"
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
   119
apply clarify
10882
ca41ba5fb8e2 updated for new version of advanced-examples.tex
paulson
parents: 10468
diff changeset
   120
txt{*
ca41ba5fb8e2 updated for new version of advanced-examples.tex
paulson
parents: 10468
diff changeset
   121
The situation after clarify
ca41ba5fb8e2 updated for new version of advanced-examples.tex
paulson
parents: 10468
diff changeset
   122
@{subgoals[display,indent=0,margin=65]}
ca41ba5fb8e2 updated for new version of advanced-examples.tex
paulson
parents: 10468
diff changeset
   123
*};
10468
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
   124
apply (erule well_formed_gterm'.induct)
10882
ca41ba5fb8e2 updated for new version of advanced-examples.tex
paulson
parents: 10468
diff changeset
   125
txt{*
ca41ba5fb8e2 updated for new version of advanced-examples.tex
paulson
parents: 10468
diff changeset
   126
note the induction hypothesis!
ca41ba5fb8e2 updated for new version of advanced-examples.tex
paulson
parents: 10468
diff changeset
   127
@{subgoals[display,indent=0,margin=65]}
ca41ba5fb8e2 updated for new version of advanced-examples.tex
paulson
parents: 10468
diff changeset
   128
*};
10468
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
   129
apply auto
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
   130
done
10370
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
   131
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
   132
10468
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
   133
text{*
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
   134
@{thm[display] lists_Int_eq[no_vars]}
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
   135
*}
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
   136
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
   137
text{* the rest isn't used: too complicated.  OK for an exercise though.*}
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
   138
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
   139
consts integer_signature :: "(integer_op * (unit list * unit)) set"
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
   140
inductive "integer_signature"
10370
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
   141
intros
10468
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
   142
Number:     "(Number n,   ([], ())) \<in> integer_signature"
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
   143
UnaryMinus: "(UnaryMinus, ([()], ())) \<in> integer_signature"
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
   144
Plus:       "(Plus,       ([(),()], ())) \<in> integer_signature"
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
   145
10370
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
   146
10468
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
   147
consts well_typed_gterm :: "('f \<Rightarrow> 't list * 't) \<Rightarrow> ('f gterm * 't)set"
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
   148
inductive "well_typed_gterm sig"
10370
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
   149
intros
10468
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
   150
step[intro!]: 
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
   151
    "\<lbrakk>\<forall>pair \<in> set args. pair \<in> well_typed_gterm sig; 
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
   152
      sig f = (map snd args, rtype)\<rbrakk>
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
   153
     \<Longrightarrow> (Apply f (map fst args), rtype) 
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
   154
         \<in> well_typed_gterm sig"
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
   155
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
   156
consts well_typed_gterm' :: "('f \<Rightarrow> 't list * 't) \<Rightarrow> ('f gterm * 't)set"
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
   157
inductive "well_typed_gterm' sig"
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
   158
intros
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
   159
step[intro!]: 
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
   160
    "\<lbrakk>args \<in> lists(well_typed_gterm' sig); 
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
   161
      sig f = (map snd args, rtype)\<rbrakk>
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
   162
     \<Longrightarrow> (Apply f (map fst args), rtype) 
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
   163
         \<in> well_typed_gterm' sig"
10370
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
   164
monos lists_mono
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
   165
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
   166
10468
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
   167
lemma "well_typed_gterm sig \<subseteq> well_typed_gterm' sig"
10370
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
   168
apply clarify
10468
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
   169
apply (erule well_typed_gterm.induct)
10370
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
   170
apply auto
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
   171
done
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
   172
10468
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
   173
lemma "well_typed_gterm' sig \<subseteq> well_typed_gterm sig"
10370
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
   174
apply clarify
10468
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
   175
apply (erule well_typed_gterm'.induct)
10370
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
   176
apply auto
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
   177
done
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
   178
10468
87dda999deca first version of Advanced Inductive Defs section
paulson
parents: 10426
diff changeset
   179
10370
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
   180
end
99bd3e902979 advanced induction examples
paulson
parents:
diff changeset
   181