doc-src/TutorialI/Inductive/AB.thy
author wenzelm
Sun, 15 Oct 2000 19:50:35 +0200
changeset 10220 2a726de6e124
parent 10217 e61e7e1eacaf
child 10225 b9fd52525b69
permissions -rw-r--r--
proper symbol markup with \isamath, \isatext; support sub/super scripts:
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
10217
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
     1
theory AB = Main:;
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
     2
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
     3
datatype alfa = a | b;
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
     4
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
     5
lemma [simp]: "(x ~= a) = (x = b) & (x ~= b) = (x = a)";
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
     6
apply(case_tac x);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
     7
by(auto);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
     8
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
     9
consts S :: "alfa list set"
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    10
       A :: "alfa list set"
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    11
       B :: "alfa list set";
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    12
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    13
inductive S A B
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    14
intros
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    15
"[] : S"
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    16
"w : A ==> b#w : S"
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    17
"w : B ==> a#w : S"
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    18
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    19
"w : S ==> a#w : A"
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    20
"[| v:A; w:A |] ==> b#v@w : A"
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    21
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    22
"w : S ==> b#w : B"
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    23
"[| v:B; w:B |] ==> a#v@w : B";
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    24
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    25
thm S_A_B.induct[no_vars];
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    26
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    27
lemma "(w : S --> size[x:w. x=a] = size[x:w. x=b]) &
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    28
       (w : A --> size[x:w. x=a] = size[x:w. x=b] + 1) &
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    29
       (w : B --> size[x:w. x=b] = size[x:w. x=a] + 1)";
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    30
apply(rule S_A_B.induct);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    31
by(auto);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    32
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    33
lemma intermed_val[rule_format(no_asm)]:
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    34
 "(!i<n. abs(f(i+1) - f i) <= #1) --> 
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    35
  f 0 <= k & k <= f n --> (? i <= n. f i = (k::int))";
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    36
apply(induct n);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    37
 apply(simp);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    38
 apply(arith);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    39
apply(rule);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    40
apply(erule impE);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    41
 apply(simp);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    42
apply(rule);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    43
apply(erule_tac x = n in allE);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    44
apply(simp);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    45
apply(case_tac "k = f(n+1)");
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    46
 apply(force);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    47
apply(erule impE);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    48
 apply(simp add:zabs_def split:split_if_asm);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    49
 apply(arith);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    50
by(blast intro:le_SucI);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    51
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    52
lemma step1: "ALL i < size w.
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    53
  abs((int(size[x:take (i+1) w . P x]) - int(size[x:take (i+1) w . ~P x])) -
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    54
      (int(size[x:take i w . P x]) - int(size[x:take i w . ~P x]))) <= #1";
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    55
apply(induct w);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    56
 apply(simp);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    57
apply(simp add:take_Cons split:nat.split);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    58
apply(clarsimp);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    59
apply(rule conjI);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    60
 apply(clarify);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    61
 apply(erule allE);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    62
 apply(erule impE);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    63
  apply(assumption);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    64
 apply(arith);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    65
apply(clarify);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    66
apply(erule allE);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    67
apply(erule impE);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    68
 apply(assumption);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    69
by(arith);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    70
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    71
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    72
lemma part1:
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    73
 "size[x:w. P x] = Suc(Suc(size[x:w. ~P x])) ==>
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    74
  EX i<=size w. size[x:take i w. P x] = size[x:take i w. ~P x]+1";
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    75
apply(insert intermed_val[OF step1, of "P" "w" "#1"]);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    76
apply(simp);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    77
apply(erule exE);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    78
apply(rule_tac x=i in exI);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    79
apply(simp);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    80
apply(rule int_int_eq[THEN iffD1]);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    81
apply(simp);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    82
by(arith);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    83
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    84
lemma part2:
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    85
"[| size[x:take i xs @ drop i xs. P x] = size[x:take i xs @ drop i xs. ~P x]+2;
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    86
    size[x:take i xs. P x] = size[x:take i xs. ~P x]+1 |]
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    87
 ==> size[x:drop i xs. P x] = size[x:drop i xs. ~P x]+1";
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    88
by(simp del:append_take_drop_id);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    89
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    90
lemmas [simp] = S_A_B.intros;
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    91
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    92
lemma "(size[x:w. x=a] = size[x:w. x=b] --> w : S) &
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    93
       (size[x:w. x=a] = size[x:w. x=b] + 1 --> w : A) &
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    94
       (size[x:w. x=b] = size[x:w. x=a] + 1 --> w : B)";
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    95
apply(induct_tac w rule: length_induct);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    96
apply(case_tac "xs");
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    97
 apply(simp);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    98
apply(simp);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
    99
apply(rule conjI);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
   100
 apply(clarify);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
   101
 apply(frule part1[of "%x. x=a", simplified]);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
   102
 apply(erule exE);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
   103
 apply(erule conjE);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
   104
 apply(drule part2[of "%x. x=a", simplified]);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
   105
  apply(assumption);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
   106
 apply(rule_tac n1=i and t=list in subst[OF append_take_drop_id]);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
   107
 apply(rule S_A_B.intros);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
   108
  apply(force simp add:min_less_iff_disj);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
   109
 apply(force split add: nat_diff_split);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
   110
apply(clarify);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
   111
apply(frule part1[of "%x. x=b", simplified]);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
   112
apply(erule exE);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
   113
apply(erule conjE);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
   114
apply(drule part2[of "%x. x=b", simplified]);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
   115
 apply(assumption);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
   116
apply(rule_tac n1=i and t=list in subst[OF append_take_drop_id]);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
   117
apply(rule S_A_B.intros);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
   118
 apply(force simp add:min_less_iff_disj);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
   119
by(force simp add:min_less_iff_disj split add: nat_diff_split);
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
   120
e61e7e1eacaf *** empty log message ***
nipkow
parents:
diff changeset
   121
end;