src/HOL/UNITY/Lift.ML
author paulson
Tue, 21 Sep 1999 11:11:09 +0200
changeset 7547 a72a551b6d79
parent 7403 c318acb88251
child 8769 981ebe7f1f10
permissions -rw-r--r--
new proof of drop_prog_correct for new definition of project_act
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5277
e4297d03e5d2 A higher-level treatment of LeadsTo, minimizing use of "reachable"
paulson
parents:
diff changeset
     1
(*  Title:      HOL/UNITY/Lift
e4297d03e5d2 A higher-level treatment of LeadsTo, minimizing use of "reachable"
paulson
parents:
diff changeset
     2
    ID:         $Id$
e4297d03e5d2 A higher-level treatment of LeadsTo, minimizing use of "reachable"
paulson
parents:
diff changeset
     3
    Author:     Lawrence C Paulson, Cambridge University Computer Laboratory
e4297d03e5d2 A higher-level treatment of LeadsTo, minimizing use of "reachable"
paulson
parents:
diff changeset
     4
    Copyright   1998  University of Cambridge
e4297d03e5d2 A higher-level treatment of LeadsTo, minimizing use of "reachable"
paulson
parents:
diff changeset
     5
e4297d03e5d2 A higher-level treatment of LeadsTo, minimizing use of "reachable"
paulson
parents:
diff changeset
     6
The Lift-Control Example
e4297d03e5d2 A higher-level treatment of LeadsTo, minimizing use of "reachable"
paulson
parents:
diff changeset
     7
*)
e4297d03e5d2 A higher-level treatment of LeadsTo, minimizing use of "reachable"
paulson
parents:
diff changeset
     8
5563
228b92552d1f Now uses integers instead of naturals
paulson
parents: 5490
diff changeset
     9
Goal "[| x ~: A;  y : A |] ==> x ~= y";
228b92552d1f Now uses integers instead of naturals
paulson
parents: 5490
diff changeset
    10
by (Blast_tac 1);
228b92552d1f Now uses integers instead of naturals
paulson
parents: 5490
diff changeset
    11
qed "not_mem_distinct";
228b92552d1f Now uses integers instead of naturals
paulson
parents: 5490
diff changeset
    12
228b92552d1f Now uses integers instead of naturals
paulson
parents: 5490
diff changeset
    13
fun distinct_tac i =
228b92552d1f Now uses integers instead of naturals
paulson
parents: 5490
diff changeset
    14
    dtac zle_neq_implies_zless i THEN
228b92552d1f Now uses integers instead of naturals
paulson
parents: 5490
diff changeset
    15
    eresolve_tac [not_mem_distinct, not_mem_distinct RS not_sym] i THEN
228b92552d1f Now uses integers instead of naturals
paulson
parents: 5490
diff changeset
    16
    assume_tac i;
228b92552d1f Now uses integers instead of naturals
paulson
parents: 5490
diff changeset
    17
5426
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5424
diff changeset
    18
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5424
diff changeset
    19
(** Rules to move "metric n s" out of the assumptions, for case splitting **)
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5424
diff changeset
    20
val mov_metric1 = read_instantiate_sg (sign_of thy) 
5596
b29d18d8c4d2 abstype of programs
paulson
parents: 5583
diff changeset
    21
                   [("P", "?x < metric ?n ?s")] rev_mp;
5426
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5424
diff changeset
    22
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5424
diff changeset
    23
val mov_metric2 = read_instantiate_sg (sign_of thy) 
5596
b29d18d8c4d2 abstype of programs
paulson
parents: 5583
diff changeset
    24
                   [("P", "?x = metric ?n ?s")] rev_mp;
5426
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5424
diff changeset
    25
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5424
diff changeset
    26
val mov_metric3 = read_instantiate_sg (sign_of thy) 
5596
b29d18d8c4d2 abstype of programs
paulson
parents: 5583
diff changeset
    27
                   [("P", "~ (?x < metric ?n ?s)")] rev_mp;
5426
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5424
diff changeset
    28
5563
228b92552d1f Now uses integers instead of naturals
paulson
parents: 5490
diff changeset
    29
val mov_metric4 = read_instantiate_sg (sign_of thy) 
5596
b29d18d8c4d2 abstype of programs
paulson
parents: 5583
diff changeset
    30
                   [("P", "(?x <= metric ?n ?s)")] rev_mp;
5563
228b92552d1f Now uses integers instead of naturals
paulson
parents: 5490
diff changeset
    31
6916
4957978b6f9e tidied proofs to cope with default if_weak_cong
paulson
parents: 6740
diff changeset
    32
val mov_metric5 = read_instantiate_sg (sign_of thy) 
4957978b6f9e tidied proofs to cope with default if_weak_cong
paulson
parents: 6740
diff changeset
    33
                   [("P", "?x ~= metric ?n ?s")] rev_mp;
4957978b6f9e tidied proofs to cope with default if_weak_cong
paulson
parents: 6740
diff changeset
    34
5426
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5424
diff changeset
    35
(*The order in which they are applied seems to be critical...*)
6916
4957978b6f9e tidied proofs to cope with default if_weak_cong
paulson
parents: 6740
diff changeset
    36
val mov_metrics = [mov_metric2, mov_metric3, mov_metric1, mov_metric4,
4957978b6f9e tidied proofs to cope with default if_weak_cong
paulson
parents: 6740
diff changeset
    37
		   mov_metric5];
5426
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5424
diff changeset
    38
6139
26abad27b03c simplified thanks to the arithmetic prover
paulson
parents: 6132
diff changeset
    39
val metric_simps = [metric_def, vimage_def];
5563
228b92552d1f Now uses integers instead of naturals
paulson
parents: 5490
diff changeset
    40
5340
d75c03cf77b5 Misc changes
paulson
parents: 5320
diff changeset
    41
6718
e869ff059252 renamed Lprg to Lift; simplified proof of Always_nonneg
paulson
parents: 6676
diff changeset
    42
Addsimps [Lift_def RS def_prg_Init];
e869ff059252 renamed Lprg to Lift; simplified proof of Always_nonneg
paulson
parents: 6676
diff changeset
    43
program_defs_ref := [Lift_def];
5426
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5424
diff changeset
    44
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5424
diff changeset
    45
Addsimps (map simp_of_act
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5424
diff changeset
    46
	  [request_act_def, open_act_def, close_act_def,
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5424
diff changeset
    47
	   req_up_def, req_down_def, move_up_def, move_down_def,
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5424
diff changeset
    48
	   button_press_def]);
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5424
diff changeset
    49
7403
c318acb88251 tidied some proofs
paulson
parents: 7221
diff changeset
    50
(*The ALWAYS properties*)
c318acb88251 tidied some proofs
paulson
parents: 7221
diff changeset
    51
Addsimps (map simp_of_set [above_def, below_def, queueing_def, 
c318acb88251 tidied some proofs
paulson
parents: 7221
diff changeset
    52
			   goingup_def, goingdown_def, ready_def]);
5357
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
    53
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
    54
5277
e4297d03e5d2 A higher-level treatment of LeadsTo, minimizing use of "reachable"
paulson
parents:
diff changeset
    55
Addsimps [bounded_def, open_stop_def, open_move_def, stop_floor_def,
e4297d03e5d2 A higher-level treatment of LeadsTo, minimizing use of "reachable"
paulson
parents:
diff changeset
    56
	  moving_up_def, moving_down_def];
e4297d03e5d2 A higher-level treatment of LeadsTo, minimizing use of "reachable"
paulson
parents:
diff changeset
    57
5357
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
    58
AddIffs [Min_le_Max];
5277
e4297d03e5d2 A higher-level treatment of LeadsTo, minimizing use of "reachable"
paulson
parents:
diff changeset
    59
5320
79b326bceafb now trans_tac is part of the claset...
paulson
parents: 5313
diff changeset
    60
6718
e869ff059252 renamed Lprg to Lift; simplified proof of Always_nonneg
paulson
parents: 6676
diff changeset
    61
Goal "Lift : Always open_stop";
7403
c318acb88251 tidied some proofs
paulson
parents: 7221
diff changeset
    62
by (always_tac 1);
5277
e4297d03e5d2 A higher-level treatment of LeadsTo, minimizing use of "reachable"
paulson
parents:
diff changeset
    63
qed "open_stop";
e4297d03e5d2 A higher-level treatment of LeadsTo, minimizing use of "reachable"
paulson
parents:
diff changeset
    64
6718
e869ff059252 renamed Lprg to Lift; simplified proof of Always_nonneg
paulson
parents: 6676
diff changeset
    65
Goal "Lift : Always stop_floor";
7403
c318acb88251 tidied some proofs
paulson
parents: 7221
diff changeset
    66
by (always_tac 1);
5277
e4297d03e5d2 A higher-level treatment of LeadsTo, minimizing use of "reachable"
paulson
parents:
diff changeset
    67
qed "stop_floor";
e4297d03e5d2 A higher-level treatment of LeadsTo, minimizing use of "reachable"
paulson
parents:
diff changeset
    68
5313
1861a564d7e2 Constrains, Stable, Invariant...more of the substitution axiom, but Union
paulson
parents: 5277
diff changeset
    69
(*This one needs open_stop, which was proved above*)
6718
e869ff059252 renamed Lprg to Lift; simplified proof of Always_nonneg
paulson
parents: 6676
diff changeset
    70
Goal "Lift : Always open_move";
7403
c318acb88251 tidied some proofs
paulson
parents: 7221
diff changeset
    71
by (cut_facts_tac [open_stop] 1);
c318acb88251 tidied some proofs
paulson
parents: 7221
diff changeset
    72
by (always_tac 1);
5277
e4297d03e5d2 A higher-level treatment of LeadsTo, minimizing use of "reachable"
paulson
parents:
diff changeset
    73
qed "open_move";
e4297d03e5d2 A higher-level treatment of LeadsTo, minimizing use of "reachable"
paulson
parents:
diff changeset
    74
6718
e869ff059252 renamed Lprg to Lift; simplified proof of Always_nonneg
paulson
parents: 6676
diff changeset
    75
Goal "Lift : Always moving_up";
7403
c318acb88251 tidied some proofs
paulson
parents: 7221
diff changeset
    76
by (always_tac 1);
c318acb88251 tidied some proofs
paulson
parents: 7221
diff changeset
    77
by (auto_tac (claset() addDs [zle_imp_zless_or_eq],
7000
6920cf9b8623 rewrite add1_zle_eq is no longer in the default simpset
paulson
parents: 6916
diff changeset
    78
	      simpset() addsimps [add1_zle_eq]));
5277
e4297d03e5d2 A higher-level treatment of LeadsTo, minimizing use of "reachable"
paulson
parents:
diff changeset
    79
qed "moving_up";
e4297d03e5d2 A higher-level treatment of LeadsTo, minimizing use of "reachable"
paulson
parents:
diff changeset
    80
6718
e869ff059252 renamed Lprg to Lift; simplified proof of Always_nonneg
paulson
parents: 6676
diff changeset
    81
Goal "Lift : Always moving_down";
7403
c318acb88251 tidied some proofs
paulson
parents: 7221
diff changeset
    82
by (always_tac 1);
5563
228b92552d1f Now uses integers instead of naturals
paulson
parents: 5490
diff changeset
    83
by (blast_tac (claset() addDs [zle_imp_zless_or_eq]) 1);
5277
e4297d03e5d2 A higher-level treatment of LeadsTo, minimizing use of "reachable"
paulson
parents:
diff changeset
    84
qed "moving_down";
e4297d03e5d2 A higher-level treatment of LeadsTo, minimizing use of "reachable"
paulson
parents:
diff changeset
    85
6718
e869ff059252 renamed Lprg to Lift; simplified proof of Always_nonneg
paulson
parents: 6676
diff changeset
    86
Goal "Lift : Always bounded";
7403
c318acb88251 tidied some proofs
paulson
parents: 7221
diff changeset
    87
by (cut_facts_tac [moving_up, moving_down] 1);
c318acb88251 tidied some proofs
paulson
parents: 7221
diff changeset
    88
by (always_tac 1);
5563
228b92552d1f Now uses integers instead of naturals
paulson
parents: 5490
diff changeset
    89
by (ALLGOALS Clarify_tac);
228b92552d1f Now uses integers instead of naturals
paulson
parents: 5490
diff changeset
    90
by (REPEAT_FIRST distinct_tac);
6161
paulson
parents: 6139
diff changeset
    91
by Auto_tac;
5277
e4297d03e5d2 A higher-level treatment of LeadsTo, minimizing use of "reachable"
paulson
parents:
diff changeset
    92
qed "bounded";
e4297d03e5d2 A higher-level treatment of LeadsTo, minimizing use of "reachable"
paulson
parents:
diff changeset
    93
5320
79b326bceafb now trans_tac is part of the claset...
paulson
parents: 5313
diff changeset
    94
5277
e4297d03e5d2 A higher-level treatment of LeadsTo, minimizing use of "reachable"
paulson
parents:
diff changeset
    95
5320
79b326bceafb now trans_tac is part of the claset...
paulson
parents: 5313
diff changeset
    96
(*** Progress ***)
5277
e4297d03e5d2 A higher-level treatment of LeadsTo, minimizing use of "reachable"
paulson
parents:
diff changeset
    97
e4297d03e5d2 A higher-level treatment of LeadsTo, minimizing use of "reachable"
paulson
parents:
diff changeset
    98
5320
79b326bceafb now trans_tac is part of the claset...
paulson
parents: 5313
diff changeset
    99
val abbrev_defs = [moving_def, stopped_def, 
5340
d75c03cf77b5 Misc changes
paulson
parents: 5320
diff changeset
   100
		   opened_def, closed_def, atFloor_def, Req_def];
5277
e4297d03e5d2 A higher-level treatment of LeadsTo, minimizing use of "reachable"
paulson
parents:
diff changeset
   101
5426
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5424
diff changeset
   102
Addsimps (map simp_of_set abbrev_defs);
5277
e4297d03e5d2 A higher-level treatment of LeadsTo, minimizing use of "reachable"
paulson
parents:
diff changeset
   103
5340
d75c03cf77b5 Misc changes
paulson
parents: 5320
diff changeset
   104
d75c03cf77b5 Misc changes
paulson
parents: 5320
diff changeset
   105
(** The HUG'93 paper mistakenly omits the Req n from these! **)
5277
e4297d03e5d2 A higher-level treatment of LeadsTo, minimizing use of "reachable"
paulson
parents:
diff changeset
   106
5357
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   107
(** Lift_1 **)
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   108
6718
e869ff059252 renamed Lprg to Lift; simplified proof of Always_nonneg
paulson
parents: 6676
diff changeset
   109
Goal "Lift : (stopped Int atFloor n) LeadsTo (opened Int atFloor n)";
5340
d75c03cf77b5 Misc changes
paulson
parents: 5320
diff changeset
   110
by (cut_facts_tac [stop_floor] 1);
5426
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5424
diff changeset
   111
by (ensures_tac "open_act" 1);
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5424
diff changeset
   112
qed "E_thm01";  (*lem_lift_1_5*)
5340
d75c03cf77b5 Misc changes
paulson
parents: 5320
diff changeset
   113
6718
e869ff059252 renamed Lprg to Lift; simplified proof of Always_nonneg
paulson
parents: 6676
diff changeset
   114
Goal "Lift : (Req n Int stopped - atFloor n) LeadsTo \
6139
26abad27b03c simplified thanks to the arithmetic prover
paulson
parents: 6132
diff changeset
   115
\                    (Req n Int opened - atFloor n)";
5340
d75c03cf77b5 Misc changes
paulson
parents: 5320
diff changeset
   116
by (cut_facts_tac [stop_floor] 1);
5426
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5424
diff changeset
   117
by (ensures_tac "open_act" 1);
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5424
diff changeset
   118
qed "E_thm02";  (*lem_lift_1_1*)
5340
d75c03cf77b5 Misc changes
paulson
parents: 5320
diff changeset
   119
6718
e869ff059252 renamed Lprg to Lift; simplified proof of Always_nonneg
paulson
parents: 6676
diff changeset
   120
Goal "Lift : (Req n Int opened - atFloor n) LeadsTo \
6139
26abad27b03c simplified thanks to the arithmetic prover
paulson
parents: 6132
diff changeset
   121
\                    (Req n Int closed - (atFloor n - queueing))";
5426
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5424
diff changeset
   122
by (ensures_tac "close_act" 1);
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5424
diff changeset
   123
qed "E_thm03";  (*lem_lift_1_2*)
5340
d75c03cf77b5 Misc changes
paulson
parents: 5320
diff changeset
   124
6718
e869ff059252 renamed Lprg to Lift; simplified proof of Always_nonneg
paulson
parents: 6676
diff changeset
   125
Goal "Lift : (Req n Int closed Int (atFloor n - queueing))  \
6536
281d44905cab made many specification operators infix
paulson
parents: 6161
diff changeset
   126
\            LeadsTo (opened Int atFloor n)";
5426
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5424
diff changeset
   127
by (ensures_tac "open_act" 1);
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5424
diff changeset
   128
qed "E_thm04";  (*lem_lift_1_7*)
5340
d75c03cf77b5 Misc changes
paulson
parents: 5320
diff changeset
   129
d75c03cf77b5 Misc changes
paulson
parents: 5320
diff changeset
   130
5357
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   131
(** Lift 2.  Statements of thm05a and thm05b were wrong! **)
5340
d75c03cf77b5 Misc changes
paulson
parents: 5320
diff changeset
   132
d75c03cf77b5 Misc changes
paulson
parents: 5320
diff changeset
   133
Open_locale "floor"; 
d75c03cf77b5 Misc changes
paulson
parents: 5320
diff changeset
   134
5357
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   135
val Min_le_n = thm "Min_le_n";
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   136
val n_le_Max = thm "n_le_Max";
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   137
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   138
AddIffs [Min_le_n, n_le_Max];
5340
d75c03cf77b5 Misc changes
paulson
parents: 5320
diff changeset
   139
6676
62d1e642da30 preferring generic rules to specific ones...
paulson
parents: 6614
diff changeset
   140
val le_MinD = Min_le_n RS order_antisym;
62d1e642da30 preferring generic rules to specific ones...
paulson
parents: 6614
diff changeset
   141
val Max_leD = n_le_Max RSN (2,order_antisym);
5357
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   142
6676
62d1e642da30 preferring generic rules to specific ones...
paulson
parents: 6614
diff changeset
   143
val linorder_leI = linorder_not_less RS iffD1;
62d1e642da30 preferring generic rules to specific ones...
paulson
parents: 6614
diff changeset
   144
62d1e642da30 preferring generic rules to specific ones...
paulson
parents: 6614
diff changeset
   145
AddSDs [le_MinD, linorder_leI RS le_MinD,
62d1e642da30 preferring generic rules to specific ones...
paulson
parents: 6614
diff changeset
   146
	Max_leD, linorder_leI RS Max_leD];
5357
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   147
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   148
(*lem_lift_2_0 
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   149
  NOT an ensures property, but a mere inclusion;
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   150
  don't know why script lift_2.uni says ENSURES*)
6718
e869ff059252 renamed Lprg to Lift; simplified proof of Always_nonneg
paulson
parents: 6676
diff changeset
   151
Goal "Lift : (Req n Int closed - (atFloor n - queueing))   \
6536
281d44905cab made many specification operators infix
paulson
parents: 6161
diff changeset
   152
\            LeadsTo ((closed Int goingup Int Req n)  Un \
6139
26abad27b03c simplified thanks to the arithmetic prover
paulson
parents: 6132
diff changeset
   153
\                     (closed Int goingdown Int Req n))";
7403
c318acb88251 tidied some proofs
paulson
parents: 7221
diff changeset
   154
by (auto_tac (claset() addSIs [subset_imp_LeadsTo] addSEs [int_neqE], 
c318acb88251 tidied some proofs
paulson
parents: 7221
diff changeset
   155
		       simpset()));
5340
d75c03cf77b5 Misc changes
paulson
parents: 5320
diff changeset
   156
qed "E_thm05c";
d75c03cf77b5 Misc changes
paulson
parents: 5320
diff changeset
   157
5357
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   158
(*lift_2*)
6718
e869ff059252 renamed Lprg to Lift; simplified proof of Always_nonneg
paulson
parents: 6676
diff changeset
   159
Goal "Lift : (Req n Int closed - (atFloor n - queueing))   \
6536
281d44905cab made many specification operators infix
paulson
parents: 6161
diff changeset
   160
\            LeadsTo (moving Int Req n)";
5426
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5424
diff changeset
   161
by (rtac ([E_thm05c, LeadsTo_Un] MRS LeadsTo_Trans) 1);
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5424
diff changeset
   162
by (ensures_tac "req_down" 2);
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5424
diff changeset
   163
by (ensures_tac "req_up" 1);
5424
771a68a468cc modified proofs for new constrains_tac and ensures_tac
paulson
parents: 5410
diff changeset
   164
by Auto_tac;
5340
d75c03cf77b5 Misc changes
paulson
parents: 5320
diff changeset
   165
qed "lift_2";
d75c03cf77b5 Misc changes
paulson
parents: 5320
diff changeset
   166
d75c03cf77b5 Misc changes
paulson
parents: 5320
diff changeset
   167
5357
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   168
(** Towards lift_4 ***)
5563
228b92552d1f Now uses integers instead of naturals
paulson
parents: 5490
diff changeset
   169
 
5357
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   170
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   171
(*lem_lift_4_1 *)
5563
228b92552d1f Now uses integers instead of naturals
paulson
parents: 5490
diff changeset
   172
Goal "#0 < N ==> \
6718
e869ff059252 renamed Lprg to Lift; simplified proof of Always_nonneg
paulson
parents: 6676
diff changeset
   173
\     Lift : (moving Int Req n Int {s. metric n s = N} Int \
6536
281d44905cab made many specification operators infix
paulson
parents: 6161
diff changeset
   174
\             {s. floor s ~: req s} Int {s. up s})   \
281d44905cab made many specification operators infix
paulson
parents: 6161
diff changeset
   175
\            LeadsTo \
6139
26abad27b03c simplified thanks to the arithmetic prover
paulson
parents: 6132
diff changeset
   176
\              (moving Int Req n Int {s. metric n s < N})";
5357
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   177
by (cut_facts_tac [moving_up] 1);
5426
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5424
diff changeset
   178
by (ensures_tac "move_up" 1);
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5424
diff changeset
   179
by Safe_tac;
5357
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   180
(*this step consolidates two formulae to the goal  metric n s' <= metric n s*)
6676
62d1e642da30 preferring generic rules to specific ones...
paulson
parents: 6614
diff changeset
   181
by (etac (linorder_leI RS order_antisym RS sym) 1);
7403
c318acb88251 tidied some proofs
paulson
parents: 7221
diff changeset
   182
by (REPEAT_FIRST (eresolve_tac mov_metrics ORELSE' distinct_tac));
5563
228b92552d1f Now uses integers instead of naturals
paulson
parents: 5490
diff changeset
   183
(** LEVEL 6 **)
7403
c318acb88251 tidied some proofs
paulson
parents: 7221
diff changeset
   184
by (ALLGOALS (asm_simp_tac (simpset() addsimps metric_simps @ zcompare_rls)));
5357
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   185
qed "E_thm12a";
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   186
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   187
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   188
(*lem_lift_4_3 *)
5563
228b92552d1f Now uses integers instead of naturals
paulson
parents: 5490
diff changeset
   189
Goal "#0 < N ==> \
6718
e869ff059252 renamed Lprg to Lift; simplified proof of Always_nonneg
paulson
parents: 6676
diff changeset
   190
\     Lift : (moving Int Req n Int {s. metric n s = N} Int \
6536
281d44905cab made many specification operators infix
paulson
parents: 6161
diff changeset
   191
\             {s. floor s ~: req s} - {s. up s})   \
281d44905cab made many specification operators infix
paulson
parents: 6161
diff changeset
   192
\            LeadsTo (moving Int Req n Int {s. metric n s < N})";
5357
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   193
by (cut_facts_tac [moving_down] 1);
5426
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5424
diff changeset
   194
by (ensures_tac "move_down" 1);
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5424
diff changeset
   195
by Safe_tac;
5357
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   196
(*this step consolidates two formulae to the goal  metric n s' <= metric n s*)
6676
62d1e642da30 preferring generic rules to specific ones...
paulson
parents: 6614
diff changeset
   197
by (etac (linorder_leI RS order_antisym RS sym) 1);
7403
c318acb88251 tidied some proofs
paulson
parents: 7221
diff changeset
   198
by (REPEAT_FIRST (eresolve_tac mov_metrics ORELSE' distinct_tac));
5563
228b92552d1f Now uses integers instead of naturals
paulson
parents: 5490
diff changeset
   199
(** LEVEL 6 **)
6139
26abad27b03c simplified thanks to the arithmetic prover
paulson
parents: 6132
diff changeset
   200
by (ALLGOALS (asm_simp_tac (simpset() addsimps metric_simps @ zcompare_rls)));
5357
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   201
qed "E_thm12b";
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   202
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   203
(*lift_4*)
6718
e869ff059252 renamed Lprg to Lift; simplified proof of Always_nonneg
paulson
parents: 6676
diff changeset
   204
Goal "#0<N ==> Lift : (moving Int Req n Int {s. metric n s = N} Int \
6536
281d44905cab made many specification operators infix
paulson
parents: 6161
diff changeset
   205
\                           {s. floor s ~: req s}) LeadsTo     \
5563
228b92552d1f Now uses integers instead of naturals
paulson
parents: 5490
diff changeset
   206
\                          (moving Int Req n Int {s. metric n s < N})";
7403
c318acb88251 tidied some proofs
paulson
parents: 7221
diff changeset
   207
by (rtac ([subset_imp_LeadsTo, [E_thm12a, E_thm12b] MRS LeadsTo_Un] 
c318acb88251 tidied some proofs
paulson
parents: 7221
diff changeset
   208
	  MRS LeadsTo_Trans) 1);
c318acb88251 tidied some proofs
paulson
parents: 7221
diff changeset
   209
by Auto_tac;
5357
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   210
qed "lift_4";
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   211
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   212
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   213
(** towards lift_5 **)
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   214
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   215
(*lem_lift_5_3*)
5563
228b92552d1f Now uses integers instead of naturals
paulson
parents: 5490
diff changeset
   216
Goal "#0<N   \
6718
e869ff059252 renamed Lprg to Lift; simplified proof of Always_nonneg
paulson
parents: 6676
diff changeset
   217
\     ==> Lift : (closed Int Req n Int {s. metric n s = N} Int goingup) LeadsTo \
5563
228b92552d1f Now uses integers instead of naturals
paulson
parents: 5490
diff changeset
   218
\                      (moving Int Req n Int {s. metric n s < N})";
5357
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   219
by (cut_facts_tac [bounded] 1);
5426
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5424
diff changeset
   220
by (ensures_tac "req_up" 1);
5424
771a68a468cc modified proofs for new constrains_tac and ensures_tac
paulson
parents: 5410
diff changeset
   221
by Auto_tac;
5426
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5424
diff changeset
   222
by (REPEAT_FIRST (eresolve_tac mov_metrics));
6139
26abad27b03c simplified thanks to the arithmetic prover
paulson
parents: 6132
diff changeset
   223
by (ALLGOALS (asm_simp_tac (simpset() addsimps metric_simps @ zcompare_rls)));
6128
2acc5d36610c More arith refinements.
nipkow
parents: 6061
diff changeset
   224
by (Blast_tac 1);
5357
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   225
qed "E_thm16a";
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   226
7079
eec20608c791 removed the combine_coeff simproc because linear arith does not handle
paulson
parents: 7000
diff changeset
   227
(*Must sometimes delete them because they introduce multiplication*)
eec20608c791 removed the combine_coeff simproc because linear arith does not handle
paulson
parents: 7000
diff changeset
   228
val metric_ss = simpset() delsimprocs [Int_CC.sum_conv, Int_CC.rel_conv]
eec20608c791 removed the combine_coeff simproc because linear arith does not handle
paulson
parents: 7000
diff changeset
   229
                          addsimps metric_simps;
eec20608c791 removed the combine_coeff simproc because linear arith does not handle
paulson
parents: 7000
diff changeset
   230
eec20608c791 removed the combine_coeff simproc because linear arith does not handle
paulson
parents: 7000
diff changeset
   231
5357
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   232
(*lem_lift_5_1 has ~goingup instead of goingdown*)
5563
228b92552d1f Now uses integers instead of naturals
paulson
parents: 5490
diff changeset
   233
Goal "#0<N ==>   \
6718
e869ff059252 renamed Lprg to Lift; simplified proof of Always_nonneg
paulson
parents: 6676
diff changeset
   234
\     Lift : (closed Int Req n Int {s. metric n s = N} Int goingdown) LeadsTo \
5563
228b92552d1f Now uses integers instead of naturals
paulson
parents: 5490
diff changeset
   235
\                  (moving Int Req n Int {s. metric n s < N})";
5357
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   236
by (cut_facts_tac [bounded] 1);
5426
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5424
diff changeset
   237
by (ensures_tac "req_down" 1);
5424
771a68a468cc modified proofs for new constrains_tac and ensures_tac
paulson
parents: 5410
diff changeset
   238
by Auto_tac;
5426
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5424
diff changeset
   239
by (REPEAT_FIRST (eresolve_tac mov_metrics));
7079
eec20608c791 removed the combine_coeff simproc because linear arith does not handle
paulson
parents: 7000
diff changeset
   240
by (ALLGOALS (asm_simp_tac (metric_ss addsimps zcompare_rls)));
6128
2acc5d36610c More arith refinements.
nipkow
parents: 6061
diff changeset
   241
by (Blast_tac 1);
5357
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   242
qed "E_thm16b";
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   243
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   244
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   245
(*lem_lift_5_0 proves an intersection involving ~goingup and goingup,
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   246
  i.e. the trivial disjunction, leading to an asymmetrical proof.*)
5563
228b92552d1f Now uses integers instead of naturals
paulson
parents: 5490
diff changeset
   247
Goal "#0<N ==> Req n Int {s. metric n s = N} <= goingup Un goingdown";
7079
eec20608c791 removed the combine_coeff simproc because linear arith does not handle
paulson
parents: 7000
diff changeset
   248
by (asm_simp_tac metric_ss 1);
5758
27a2b36efd95 corrected auto_tac (applications of unsafe wrappers)
oheimb
parents: 5706
diff changeset
   249
by (force_tac (claset() delrules [impCE] addEs [impCE], 
6139
26abad27b03c simplified thanks to the arithmetic prover
paulson
parents: 6132
diff changeset
   250
	       simpset() addsimps conj_comms) 1);
5357
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   251
qed "E_thm16c";
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   252
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   253
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   254
(*lift_5*)
6718
e869ff059252 renamed Lprg to Lift; simplified proof of Always_nonneg
paulson
parents: 6676
diff changeset
   255
Goal "#0<N ==> Lift : (closed Int Req n Int {s. metric n s = N}) LeadsTo   \
5563
228b92552d1f Now uses integers instead of naturals
paulson
parents: 5490
diff changeset
   256
\                          (moving Int Req n Int {s. metric n s < N})";
7403
c318acb88251 tidied some proofs
paulson
parents: 7221
diff changeset
   257
by (rtac ([subset_imp_LeadsTo, [E_thm16a, E_thm16b] MRS LeadsTo_Un] 
c318acb88251 tidied some proofs
paulson
parents: 7221
diff changeset
   258
	  MRS LeadsTo_Trans) 1);
5426
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5424
diff changeset
   259
by (dtac E_thm16c 1);
7403
c318acb88251 tidied some proofs
paulson
parents: 7221
diff changeset
   260
by Auto_tac;
5357
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   261
qed "lift_5";
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   262
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   263
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   264
(** towards lift_3 **)
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   265
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   266
(*lemma used to prove lem_lift_3_1*)
5563
228b92552d1f Now uses integers instead of naturals
paulson
parents: 5490
diff changeset
   267
Goal "[| metric n s = #0;  Min <= floor s;  floor s <= Max |] ==> floor s = n";
5426
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5424
diff changeset
   268
by (etac rev_mp 1);
5563
228b92552d1f Now uses integers instead of naturals
paulson
parents: 5490
diff changeset
   269
(*force simplification of "metric..." while in conclusion part*)
7079
eec20608c791 removed the combine_coeff simproc because linear arith does not handle
paulson
parents: 7000
diff changeset
   270
by (asm_simp_tac metric_ss 1);
5357
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   271
qed "metric_eq_0D";
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   272
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   273
AddDs [metric_eq_0D];
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   274
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   275
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   276
(*lem_lift_3_1*)
6718
e869ff059252 renamed Lprg to Lift; simplified proof of Always_nonneg
paulson
parents: 6676
diff changeset
   277
Goal "Lift : (moving Int Req n Int {s. metric n s = #0}) LeadsTo   \
5357
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   278
\                  (stopped Int atFloor n)";
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   279
by (cut_facts_tac [bounded] 1);
5426
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5424
diff changeset
   280
by (ensures_tac "request_act" 1);
5424
771a68a468cc modified proofs for new constrains_tac and ensures_tac
paulson
parents: 5410
diff changeset
   281
by Auto_tac;
5357
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   282
qed "E_thm11";
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   283
6916
4957978b6f9e tidied proofs to cope with default if_weak_cong
paulson
parents: 6740
diff changeset
   284
val metric_tac = REPEAT (FIRSTGOAL (eresolve_tac mov_metrics))
7079
eec20608c791 removed the combine_coeff simproc because linear arith does not handle
paulson
parents: 7000
diff changeset
   285
                 THEN auto_tac (claset(), metric_ss);
6916
4957978b6f9e tidied proofs to cope with default if_weak_cong
paulson
parents: 6740
diff changeset
   286
5357
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   287
(*lem_lift_3_5*)
6536
281d44905cab made many specification operators infix
paulson
parents: 6161
diff changeset
   288
Goal
6718
e869ff059252 renamed Lprg to Lift; simplified proof of Always_nonneg
paulson
parents: 6676
diff changeset
   289
  "Lift : (moving Int Req n Int {s. metric n s = N} Int {s. floor s : req s}) \
6536
281d44905cab made many specification operators infix
paulson
parents: 6161
diff changeset
   290
\ LeadsTo (stopped Int Req n Int {s. metric n s = N} Int {s. floor s : req s})";
5426
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5424
diff changeset
   291
by (ensures_tac "request_act" 1);
6916
4957978b6f9e tidied proofs to cope with default if_weak_cong
paulson
parents: 6740
diff changeset
   292
by metric_tac;
5357
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   293
qed "E_thm13";
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   294
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   295
(*lem_lift_3_6*)
5563
228b92552d1f Now uses integers instead of naturals
paulson
parents: 5490
diff changeset
   296
Goal "#0 < N ==> \
6718
e869ff059252 renamed Lprg to Lift; simplified proof of Always_nonneg
paulson
parents: 6676
diff changeset
   297
\     Lift : \
5563
228b92552d1f Now uses integers instead of naturals
paulson
parents: 5490
diff changeset
   298
\       (stopped Int Req n Int {s. metric n s = N} Int {s. floor s : req s}) \
6536
281d44905cab made many specification operators infix
paulson
parents: 6161
diff changeset
   299
\       LeadsTo (opened Int Req n Int {s. metric n s = N})";
5426
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5424
diff changeset
   300
by (ensures_tac "open_act" 1);
6916
4957978b6f9e tidied proofs to cope with default if_weak_cong
paulson
parents: 6740
diff changeset
   301
by metric_tac;
5357
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   302
qed "E_thm14";
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   303
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   304
(*lem_lift_3_7*)
6718
e869ff059252 renamed Lprg to Lift; simplified proof of Always_nonneg
paulson
parents: 6676
diff changeset
   305
Goal "Lift : (opened Int Req n Int {s. metric n s = N})  \
6536
281d44905cab made many specification operators infix
paulson
parents: 6161
diff changeset
   306
\            LeadsTo (closed Int Req n Int {s. metric n s = N})";
5426
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5424
diff changeset
   307
by (ensures_tac "close_act" 1);
6916
4957978b6f9e tidied proofs to cope with default if_weak_cong
paulson
parents: 6740
diff changeset
   308
by metric_tac;
5357
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   309
qed "E_thm15";
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   310
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   311
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   312
(** the final steps **)
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   313
5563
228b92552d1f Now uses integers instead of naturals
paulson
parents: 5490
diff changeset
   314
Goal "#0 < N ==> \
6718
e869ff059252 renamed Lprg to Lift; simplified proof of Always_nonneg
paulson
parents: 6676
diff changeset
   315
\     Lift : \
5563
228b92552d1f Now uses integers instead of naturals
paulson
parents: 5490
diff changeset
   316
\       (moving Int Req n Int {s. metric n s = N} Int {s. floor s : req s})   \
6536
281d44905cab made many specification operators infix
paulson
parents: 6161
diff changeset
   317
\       LeadsTo (moving Int Req n Int {s. metric n s < N})";
5479
5a5dfb0f0d7d fixed PROOF FAILED
paulson
parents: 5426
diff changeset
   318
by (blast_tac (claset() addSIs [E_thm13, E_thm14, E_thm15, lift_5]
5a5dfb0f0d7d fixed PROOF FAILED
paulson
parents: 5426
diff changeset
   319
	                addIs [LeadsTo_Trans]) 1);
5357
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   320
qed "lift_3_Req";
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   321
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   322
5563
228b92552d1f Now uses integers instead of naturals
paulson
parents: 5490
diff changeset
   323
(*Now we observe that our integer metric is really a natural number*)
6718
e869ff059252 renamed Lprg to Lift; simplified proof of Always_nonneg
paulson
parents: 6676
diff changeset
   324
Goal "Lift : Always {s. #0 <= metric n s}";
6570
a7d7985050a9 Invariant -> Always and other tidying
paulson
parents: 6536
diff changeset
   325
by (rtac (bounded RS Always_weaken) 1);
6916
4957978b6f9e tidied proofs to cope with default if_weak_cong
paulson
parents: 6740
diff changeset
   326
by metric_tac;
6570
a7d7985050a9 Invariant -> Always and other tidying
paulson
parents: 6536
diff changeset
   327
qed "Always_nonneg";
5563
228b92552d1f Now uses integers instead of naturals
paulson
parents: 5490
diff changeset
   328
6570
a7d7985050a9 Invariant -> Always and other tidying
paulson
parents: 6536
diff changeset
   329
val R_thm11 = [Always_nonneg, E_thm11] MRS Always_LeadsTo_weaken;
5563
228b92552d1f Now uses integers instead of naturals
paulson
parents: 5490
diff changeset
   330
6718
e869ff059252 renamed Lprg to Lift; simplified proof of Always_nonneg
paulson
parents: 6676
diff changeset
   331
Goal "Lift : (moving Int Req n) LeadsTo (stopped Int atFloor n)";
6570
a7d7985050a9 Invariant -> Always and other tidying
paulson
parents: 6536
diff changeset
   332
by (rtac (Always_nonneg RS integ_0_le_induct) 1);
5563
228b92552d1f Now uses integers instead of naturals
paulson
parents: 5490
diff changeset
   333
by (case_tac "#0 < z" 1);
228b92552d1f Now uses integers instead of naturals
paulson
parents: 5490
diff changeset
   334
(*If z <= #0 then actually z = #0*)
7403
c318acb88251 tidied some proofs
paulson
parents: 7221
diff changeset
   335
by (force_tac (claset() addIs [R_thm11, order_antisym], 
c318acb88251 tidied some proofs
paulson
parents: 7221
diff changeset
   336
	       simpset() addsimps [linorder_not_less]) 2);
5426
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5424
diff changeset
   337
by (rtac ([asm_rl, Un_upper1] MRS LeadsTo_weaken_R) 1);
7403
c318acb88251 tidied some proofs
paulson
parents: 7221
diff changeset
   338
by (rtac ([subset_imp_LeadsTo, [lift_4, lift_3_Req] MRS LeadsTo_Un] 
c318acb88251 tidied some proofs
paulson
parents: 7221
diff changeset
   339
	  MRS LeadsTo_Trans) 1);
5426
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5424
diff changeset
   340
by Auto_tac;
5357
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   341
qed "lift_3";
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   342
6efb2b87610c New theory Lift
paulson
parents: 5340
diff changeset
   343
7403
c318acb88251 tidied some proofs
paulson
parents: 7221
diff changeset
   344
val LeadsTo_Trans_Un' = rotate_prems 1 LeadsTo_Trans_Un;
c318acb88251 tidied some proofs
paulson
parents: 7221
diff changeset
   345
(* [| Lift: B LeadsTo C; Lift: A LeadsTo B |] ==> Lift: (A Un B) LeadsTo C *)
c318acb88251 tidied some proofs
paulson
parents: 7221
diff changeset
   346
6718
e869ff059252 renamed Lprg to Lift; simplified proof of Always_nonneg
paulson
parents: 6676
diff changeset
   347
Goal "Lift : (Req n) LeadsTo (opened Int atFloor n)";
5426
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5424
diff changeset
   348
by (rtac LeadsTo_Trans 1);
7403
c318acb88251 tidied some proofs
paulson
parents: 7221
diff changeset
   349
by (rtac ([E_thm04, LeadsTo_Un_post] MRS LeadsTo_Un) 2);
5426
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5424
diff changeset
   350
by (rtac (E_thm01 RS LeadsTo_Trans_Un') 2);
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5424
diff changeset
   351
by (rtac (lift_3 RS LeadsTo_Trans_Un') 2);
566f47250bd0 A new approach, using simp_of_act and simp_of_set to activate definitions when
paulson
parents: 5424
diff changeset
   352
by (rtac (lift_2 RS LeadsTo_Trans_Un') 2);
7403
c318acb88251 tidied some proofs
paulson
parents: 7221
diff changeset
   353
by (rtac ([E_thm03,E_thm02] MRS LeadsTo_Trans_Un') 2);
6570
a7d7985050a9 Invariant -> Always and other tidying
paulson
parents: 6536
diff changeset
   354
by (rtac (open_move RS Always_LeadsToI) 1);
7403
c318acb88251 tidied some proofs
paulson
parents: 7221
diff changeset
   355
by (rtac ([open_stop, subset_imp_LeadsTo] MRS Always_LeadsToI) 1);
5340
d75c03cf77b5 Misc changes
paulson
parents: 5320
diff changeset
   356
by (Clarify_tac 1);
5484
e9430ed7e8d6 Extra steps at end to make it run faster
paulson
parents: 5479
diff changeset
   357
(*The case split is not essential but makes Blast_tac much faster.
7403
c318acb88251 tidied some proofs
paulson
parents: 7221
diff changeset
   358
  Calling rotate_tac prevents simplification from looping*)
5484
e9430ed7e8d6 Extra steps at end to make it run faster
paulson
parents: 5479
diff changeset
   359
by (case_tac "open x" 1);
e9430ed7e8d6 Extra steps at end to make it run faster
paulson
parents: 5479
diff changeset
   360
by (ALLGOALS (rotate_tac ~1));
7403
c318acb88251 tidied some proofs
paulson
parents: 7221
diff changeset
   361
by Auto_tac;
5340
d75c03cf77b5 Misc changes
paulson
parents: 5320
diff changeset
   362
qed "lift_1";
d75c03cf77b5 Misc changes
paulson
parents: 5320
diff changeset
   363
6024
cb87f103d114 new Close_locale synatx
paulson
parents: 5783
diff changeset
   364
Close_locale "floor";