src/HOL/UNITY/Lift_prog.thy
author paulson
Tue, 04 Feb 2003 18:12:40 +0100
changeset 13805 3786b2fd6808
parent 13798 4c1a53627500
child 13812 91713a1915ee
permissions -rw-r--r--
some x-symbols
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
7186
860479291bb5 new theory UNITY/Lift_prog
paulson
parents:
diff changeset
     1
(*  Title:      HOL/UNITY/Lift_prog.thy
860479291bb5 new theory UNITY/Lift_prog
paulson
parents:
diff changeset
     2
    ID:         $Id$
860479291bb5 new theory UNITY/Lift_prog
paulson
parents:
diff changeset
     3
    Author:     Lawrence C Paulson, Cambridge University Computer Laboratory
860479291bb5 new theory UNITY/Lift_prog
paulson
parents:
diff changeset
     4
    Copyright   1999  University of Cambridge
860479291bb5 new theory UNITY/Lift_prog
paulson
parents:
diff changeset
     5
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
     6
lift_prog, etc: replication of components and arrays of processes. 
7186
860479291bb5 new theory UNITY/Lift_prog
paulson
parents:
diff changeset
     7
*)
860479291bb5 new theory UNITY/Lift_prog
paulson
parents:
diff changeset
     8
13798
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 13790
diff changeset
     9
header{*Replication of Components*}
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 13790
diff changeset
    10
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
    11
theory Lift_prog = Rename:
7186
860479291bb5 new theory UNITY/Lift_prog
paulson
parents:
diff changeset
    12
860479291bb5 new theory UNITY/Lift_prog
paulson
parents:
diff changeset
    13
constdefs
860479291bb5 new theory UNITY/Lift_prog
paulson
parents:
diff changeset
    14
8251
9be357df93d4 New treatment of "guarantees" with polymorphic components and bijections.
paulson
parents: 8122
diff changeset
    15
  insert_map :: "[nat, 'b, nat=>'b] => (nat=>'b)"
9be357df93d4 New treatment of "guarantees" with polymorphic components and bijections.
paulson
parents: 8122
diff changeset
    16
    "insert_map i z f k == if k<i then f k
9be357df93d4 New treatment of "guarantees" with polymorphic components and bijections.
paulson
parents: 8122
diff changeset
    17
                           else if k=i then z
11701
3d51fbf81c17 sane numerals (stage 1): added generic 1, removed 1' and 2 on nat,
wenzelm
parents: 10834
diff changeset
    18
                           else f(k - 1)"
7186
860479291bb5 new theory UNITY/Lift_prog
paulson
parents:
diff changeset
    19
8251
9be357df93d4 New treatment of "guarantees" with polymorphic components and bijections.
paulson
parents: 8122
diff changeset
    20
  delete_map :: "[nat, nat=>'b] => (nat=>'b)"
9be357df93d4 New treatment of "guarantees" with polymorphic components and bijections.
paulson
parents: 8122
diff changeset
    21
    "delete_map i g k == if k<i then g k else g (Suc k)"
7186
860479291bb5 new theory UNITY/Lift_prog
paulson
parents:
diff changeset
    22
8251
9be357df93d4 New treatment of "guarantees" with polymorphic components and bijections.
paulson
parents: 8122
diff changeset
    23
  lift_map :: "[nat, 'b * ((nat=>'b) * 'c)] => (nat=>'b) * 'c"
9be357df93d4 New treatment of "guarantees" with polymorphic components and bijections.
paulson
parents: 8122
diff changeset
    24
    "lift_map i == %(s,(f,uu)). (insert_map i s f, uu)"
9be357df93d4 New treatment of "guarantees" with polymorphic components and bijections.
paulson
parents: 8122
diff changeset
    25
9be357df93d4 New treatment of "guarantees" with polymorphic components and bijections.
paulson
parents: 8122
diff changeset
    26
  drop_map :: "[nat, (nat=>'b) * 'c] => 'b * ((nat=>'b) * 'c)"
9be357df93d4 New treatment of "guarantees" with polymorphic components and bijections.
paulson
parents: 8122
diff changeset
    27
    "drop_map i == %(g, uu). (g i, (delete_map i g, uu))"
7186
860479291bb5 new theory UNITY/Lift_prog
paulson
parents:
diff changeset
    28
8251
9be357df93d4 New treatment of "guarantees" with polymorphic components and bijections.
paulson
parents: 8122
diff changeset
    29
  lift_set :: "[nat, ('b * ((nat=>'b) * 'c)) set] => ((nat=>'b) * 'c) set"
10834
a7897aebbffc *** empty log message ***
nipkow
parents: 8251
diff changeset
    30
    "lift_set i A == lift_map i ` A"
7186
860479291bb5 new theory UNITY/Lift_prog
paulson
parents:
diff changeset
    31
8251
9be357df93d4 New treatment of "guarantees" with polymorphic components and bijections.
paulson
parents: 8122
diff changeset
    32
  lift :: "[nat, ('b * ((nat=>'b) * 'c)) program] => ((nat=>'b) * 'c) program"
9be357df93d4 New treatment of "guarantees" with polymorphic components and bijections.
paulson
parents: 8122
diff changeset
    33
    "lift i == rename (lift_map i)"
7186
860479291bb5 new theory UNITY/Lift_prog
paulson
parents:
diff changeset
    34
860479291bb5 new theory UNITY/Lift_prog
paulson
parents:
diff changeset
    35
  (*simplifies the expression of specifications*)
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
    36
  sub :: "['a, 'a=>'b] => 'b"
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
    37
    "sub == %i f. f i"
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
    38
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
    39
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
    40
declare insert_map_def [simp] delete_map_def [simp]
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
    41
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
    42
lemma insert_map_inverse: "delete_map i (insert_map i x f) = f"
13798
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 13790
diff changeset
    43
by (rule ext, simp)
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
    44
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
    45
lemma insert_map_delete_map_eq: "(insert_map i x (delete_map i g)) = g(i:=x)"
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
    46
apply (rule ext)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
    47
apply (auto split add: nat_diff_split)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
    48
done
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
    49
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
    50
(*** Injectiveness proof ***)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
    51
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
    52
lemma insert_map_inject1: "(insert_map i x f) = (insert_map i y g) ==> x=y"
13798
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 13790
diff changeset
    53
by (drule_tac x = i in fun_cong, simp)
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
    54
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
    55
lemma insert_map_inject2: "(insert_map i x f) = (insert_map i y g) ==> f=g"
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
    56
apply (drule_tac f = "delete_map i" in arg_cong)
13798
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 13790
diff changeset
    57
apply (simp add: insert_map_inverse)
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
    58
done
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
    59
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
    60
lemma insert_map_inject':
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
    61
     "(insert_map i x f) = (insert_map i y g) ==> x=y & f=g"
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
    62
by (blast dest: insert_map_inject1 insert_map_inject2)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
    63
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
    64
lemmas insert_map_inject = insert_map_inject' [THEN conjE, elim!]
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
    65
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
    66
(*The general case: we don't assume i=i'*)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
    67
lemma lift_map_eq_iff [iff]: 
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
    68
     "(lift_map i (s,(f,uu)) = lift_map i' (s',(f',uu')))  
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
    69
      = (uu = uu' & insert_map i s f = insert_map i' s' f')"
13798
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 13790
diff changeset
    70
by (unfold lift_map_def, auto)
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
    71
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
    72
(*The !!s allows the automatic splitting of the bound variable*)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
    73
lemma drop_map_lift_map_eq [simp]: "!!s. drop_map i (lift_map i s) = s"
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
    74
apply (unfold lift_map_def drop_map_def)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
    75
apply (force intro: insert_map_inverse)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
    76
done
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
    77
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
    78
lemma inj_lift_map: "inj (lift_map i)"
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
    79
apply (unfold lift_map_def)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
    80
apply (rule inj_onI, auto)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
    81
done
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
    82
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
    83
(*** Surjectiveness proof ***)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
    84
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
    85
lemma lift_map_drop_map_eq [simp]: "!!s. lift_map i (drop_map i s) = s"
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
    86
apply (unfold lift_map_def drop_map_def)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
    87
apply (force simp add: insert_map_delete_map_eq)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
    88
done
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
    89
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
    90
lemma drop_map_inject [dest!]: "(drop_map i s) = (drop_map i s') ==> s=s'"
13798
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 13790
diff changeset
    91
by (drule_tac f = "lift_map i" in arg_cong, simp)
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
    92
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
    93
lemma surj_lift_map: "surj (lift_map i)"
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
    94
apply (rule surjI)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
    95
apply (rule lift_map_drop_map_eq)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
    96
done
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
    97
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
    98
lemma bij_lift_map [iff]: "bij (lift_map i)"
13798
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 13790
diff changeset
    99
by (simp add: bij_def inj_lift_map surj_lift_map)
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   100
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   101
lemma inv_lift_map_eq [simp]: "inv (lift_map i) = drop_map i"
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   102
by (rule inv_equality, auto)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   103
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   104
lemma inv_drop_map_eq [simp]: "inv (drop_map i) = lift_map i"
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   105
by (rule inv_equality, auto)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   106
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   107
lemma bij_drop_map [iff]: "bij (drop_map i)"
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   108
by (simp del: inv_lift_map_eq add: inv_lift_map_eq [symmetric] bij_imp_bij_inv)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   109
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   110
(*sub's main property!*)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   111
lemma sub_apply [simp]: "sub i f = f i"
13798
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 13790
diff changeset
   112
by (simp add: sub_def)
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   113
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   114
(*** lift_set ***)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   115
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   116
lemma lift_set_empty [simp]: "lift_set i {} = {}"
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   117
by (unfold lift_set_def, auto)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   118
13805
3786b2fd6808 some x-symbols
paulson
parents: 13798
diff changeset
   119
lemma lift_set_iff: "(lift_map i x \<in> lift_set i A) = (x \<in> A)"
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   120
apply (unfold lift_set_def)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   121
apply (rule inj_lift_map [THEN inj_image_mem_iff])
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   122
done
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   123
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   124
(*Do we really need both this one and its predecessor?*)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   125
lemma lift_set_iff2 [iff]:
13805
3786b2fd6808 some x-symbols
paulson
parents: 13798
diff changeset
   126
     "((f,uu) \<in> lift_set i A) = ((f i, (delete_map i f, uu)) \<in> A)"
13798
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 13790
diff changeset
   127
by (simp add: lift_set_def mem_rename_set_iff drop_map_def)
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   128
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   129
13805
3786b2fd6808 some x-symbols
paulson
parents: 13798
diff changeset
   130
lemma lift_set_mono: "A \<subseteq> B ==> lift_set i A \<subseteq> lift_set i B"
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   131
apply (unfold lift_set_def)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   132
apply (erule image_mono)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   133
done
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   134
13805
3786b2fd6808 some x-symbols
paulson
parents: 13798
diff changeset
   135
lemma lift_set_Un_distrib: "lift_set i (A \<union> B) = lift_set i A \<union> lift_set i B"
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   136
apply (unfold lift_set_def)
13798
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 13790
diff changeset
   137
apply (simp add: image_Un)
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   138
done
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   139
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   140
lemma lift_set_Diff_distrib: "lift_set i (A-B) = lift_set i A - lift_set i B"
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   141
apply (unfold lift_set_def)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   142
apply (rule inj_lift_map [THEN image_set_diff])
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   143
done
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   144
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   145
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   146
(*** the lattice operations ***)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   147
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   148
lemma bij_lift [iff]: "bij (lift i)"
13798
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 13790
diff changeset
   149
by (simp add: lift_def)
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   150
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   151
lemma lift_SKIP [simp]: "lift i SKIP = SKIP"
13798
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 13790
diff changeset
   152
by (simp add: lift_def)
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   153
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   154
lemma lift_Join [simp]: "lift i (F Join G) = lift i F Join lift i G"
13798
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 13790
diff changeset
   155
by (simp add: lift_def)
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   156
13805
3786b2fd6808 some x-symbols
paulson
parents: 13798
diff changeset
   157
lemma lift_JN [simp]: "lift j (JOIN I F) = (\<Squnion>i \<in> I. lift j (F i))"
13798
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 13790
diff changeset
   158
by (simp add: lift_def)
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   159
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   160
(*** Safety: co, stable, invariant ***)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   161
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   162
lemma lift_constrains: 
13805
3786b2fd6808 some x-symbols
paulson
parents: 13798
diff changeset
   163
     "(lift i F \<in> (lift_set i A) co (lift_set i B)) = (F \<in> A co B)"
13798
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 13790
diff changeset
   164
by (simp add: lift_def lift_set_def rename_constrains)
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   165
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   166
lemma lift_stable: 
13805
3786b2fd6808 some x-symbols
paulson
parents: 13798
diff changeset
   167
     "(lift i F \<in> stable (lift_set i A)) = (F \<in> stable A)"
13798
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 13790
diff changeset
   168
by (simp add: lift_def lift_set_def rename_stable)
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   169
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   170
lemma lift_invariant: 
13805
3786b2fd6808 some x-symbols
paulson
parents: 13798
diff changeset
   171
     "(lift i F \<in> invariant (lift_set i A)) = (F \<in> invariant A)"
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   172
apply (unfold lift_def lift_set_def)
13798
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 13790
diff changeset
   173
apply (simp add: rename_invariant)
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   174
done
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   175
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   176
lemma lift_Constrains: 
13805
3786b2fd6808 some x-symbols
paulson
parents: 13798
diff changeset
   177
     "(lift i F \<in> (lift_set i A) Co (lift_set i B)) = (F \<in> A Co B)"
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   178
apply (unfold lift_def lift_set_def)
13798
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 13790
diff changeset
   179
apply (simp add: rename_Constrains)
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   180
done
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   181
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   182
lemma lift_Stable: 
13805
3786b2fd6808 some x-symbols
paulson
parents: 13798
diff changeset
   183
     "(lift i F \<in> Stable (lift_set i A)) = (F \<in> Stable A)"
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   184
apply (unfold lift_def lift_set_def)
13798
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 13790
diff changeset
   185
apply (simp add: rename_Stable)
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   186
done
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   187
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   188
lemma lift_Always: 
13805
3786b2fd6808 some x-symbols
paulson
parents: 13798
diff changeset
   189
     "(lift i F \<in> Always (lift_set i A)) = (F \<in> Always A)"
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   190
apply (unfold lift_def lift_set_def)
13798
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 13790
diff changeset
   191
apply (simp add: rename_Always)
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   192
done
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   193
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   194
(*** Progress: transient, ensures ***)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   195
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   196
lemma lift_transient: 
13805
3786b2fd6808 some x-symbols
paulson
parents: 13798
diff changeset
   197
     "(lift i F \<in> transient (lift_set i A)) = (F \<in> transient A)"
13798
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 13790
diff changeset
   198
by (simp add: lift_def lift_set_def rename_transient)
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   199
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   200
lemma lift_ensures: 
13805
3786b2fd6808 some x-symbols
paulson
parents: 13798
diff changeset
   201
     "(lift i F \<in> (lift_set i A) ensures (lift_set i B)) =  
3786b2fd6808 some x-symbols
paulson
parents: 13798
diff changeset
   202
      (F \<in> A ensures B)"
13798
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 13790
diff changeset
   203
by (simp add: lift_def lift_set_def rename_ensures)
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   204
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   205
lemma lift_leadsTo: 
13805
3786b2fd6808 some x-symbols
paulson
parents: 13798
diff changeset
   206
     "(lift i F \<in> (lift_set i A) leadsTo (lift_set i B)) =  
3786b2fd6808 some x-symbols
paulson
parents: 13798
diff changeset
   207
      (F \<in> A leadsTo B)"
13798
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 13790
diff changeset
   208
by (simp add: lift_def lift_set_def rename_leadsTo)
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   209
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   210
lemma lift_LeadsTo: 
13805
3786b2fd6808 some x-symbols
paulson
parents: 13798
diff changeset
   211
     "(lift i F \<in> (lift_set i A) LeadsTo (lift_set i B)) =   
3786b2fd6808 some x-symbols
paulson
parents: 13798
diff changeset
   212
      (F \<in> A LeadsTo B)"
13798
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 13790
diff changeset
   213
by (simp add: lift_def lift_set_def rename_LeadsTo)
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   214
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   215
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   216
(** guarantees **)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   217
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   218
lemma lift_lift_guarantees_eq: 
13805
3786b2fd6808 some x-symbols
paulson
parents: 13798
diff changeset
   219
     "(lift i F \<in> (lift i ` X) guarantees (lift i ` Y)) =  
3786b2fd6808 some x-symbols
paulson
parents: 13798
diff changeset
   220
      (F \<in> X guarantees Y)"
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   221
apply (unfold lift_def)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   222
apply (subst bij_lift_map [THEN rename_rename_guarantees_eq, symmetric])
13798
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 13790
diff changeset
   223
apply (simp add: o_def)
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   224
done
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   225
13805
3786b2fd6808 some x-symbols
paulson
parents: 13798
diff changeset
   226
lemma lift_guarantees_eq_lift_inv: "(lift i F \<in> X guarantees Y) =  
3786b2fd6808 some x-symbols
paulson
parents: 13798
diff changeset
   227
      (F \<in> (rename (drop_map i) ` X) guarantees (rename (drop_map i) ` Y))"
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   228
by (simp add: bij_lift_map [THEN rename_guarantees_eq_rename_inv] lift_def)
7186
860479291bb5 new theory UNITY/Lift_prog
paulson
parents:
diff changeset
   229
860479291bb5 new theory UNITY/Lift_prog
paulson
parents:
diff changeset
   230
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   231
(*** We devote an ENORMOUS effort to proving lift_transient_eq_disj, 
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   232
     which is used only in TimerArray and perhaps isn't even essential
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   233
     there!
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   234
***)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   235
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   236
(*To preserve snd means that the second component is there just to allow
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   237
  guarantees properties to be stated.  Converse fails, for lift i F can 
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   238
  change function components other than i*)
13805
3786b2fd6808 some x-symbols
paulson
parents: 13798
diff changeset
   239
lemma lift_preserves_snd_I: "F \<in> preserves snd ==> lift i F \<in> preserves snd"
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   240
apply (drule_tac w1=snd in subset_preserves_o [THEN subsetD])
13798
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 13790
diff changeset
   241
apply (simp add: lift_def rename_preserves)
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 13790
diff changeset
   242
apply (simp add: lift_map_def o_def split_def)
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   243
done
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   244
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   245
lemma delete_map_eqE':
13805
3786b2fd6808 some x-symbols
paulson
parents: 13798
diff changeset
   246
     "(delete_map i g) = (delete_map i g') ==> \<exists>x. g = g'(i:=x)"
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   247
apply (drule_tac f = "insert_map i (g i) " in arg_cong)
13798
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 13790
diff changeset
   248
apply (simp add: insert_map_delete_map_eq)
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   249
apply (erule exI)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   250
done
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   251
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   252
lemmas delete_map_eqE = delete_map_eqE' [THEN exE, elim!]
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   253
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   254
lemma delete_map_neq_apply:
13805
3786b2fd6808 some x-symbols
paulson
parents: 13798
diff changeset
   255
     "[| delete_map j g = delete_map j g';  i\<noteq>j |] ==> g i = g' i"
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   256
by force
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   257
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   258
(*A set of the form (A <*> UNIV) ignores the second (dummy) state component*)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   259
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   260
lemma vimage_o_fst_eq [simp]: "(f o fst) -` A = (f-`A) <*> UNIV"
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   261
by auto
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   262
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   263
lemma vimage_sub_eq_lift_set [simp]:
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   264
     "(sub i -`A) <*> UNIV = lift_set i (A <*> UNIV)"
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   265
by auto
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   266
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   267
lemma mem_lift_act_iff [iff]: 
13805
3786b2fd6808 some x-symbols
paulson
parents: 13798
diff changeset
   268
     "((s,s') \<in> extend_act (%(x,u::unit). lift_map i x) act) =  
3786b2fd6808 some x-symbols
paulson
parents: 13798
diff changeset
   269
      ((drop_map i s, drop_map i s') \<in> act)"
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   270
apply (unfold extend_act_def, auto)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   271
apply (rule bexI, auto)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   272
done
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   273
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   274
lemma preserves_snd_lift_stable:
13805
3786b2fd6808 some x-symbols
paulson
parents: 13798
diff changeset
   275
     "[| F \<in> preserves snd;  i\<noteq>j |]  
3786b2fd6808 some x-symbols
paulson
parents: 13798
diff changeset
   276
      ==> lift j F \<in> stable (lift_set i (A <*> UNIV))"
13798
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 13790
diff changeset
   277
apply (auto simp add: lift_def lift_set_def stable_def constrains_def 
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 13790
diff changeset
   278
                      rename_def extend_def mem_rename_set_iff)
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   279
apply (auto dest!: preserves_imp_eq simp add: lift_map_def drop_map_def)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   280
apply (drule_tac x = i in fun_cong, auto)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   281
done
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   282
13805
3786b2fd6808 some x-symbols
paulson
parents: 13798
diff changeset
   283
(*If i\<noteq>j then lift j F  does nothing to lift_set i, and the 
3786b2fd6808 some x-symbols
paulson
parents: 13798
diff changeset
   284
  premise ensures A \<subseteq> B.*)
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   285
lemma constrains_imp_lift_constrains:
13805
3786b2fd6808 some x-symbols
paulson
parents: 13798
diff changeset
   286
    "[| F i \<in> (A <*> UNIV) co (B <*> UNIV);   
3786b2fd6808 some x-symbols
paulson
parents: 13798
diff changeset
   287
        F j \<in> preserves snd |]   
3786b2fd6808 some x-symbols
paulson
parents: 13798
diff changeset
   288
     ==> lift j (F j) \<in> (lift_set i (A <*> UNIV)) co (lift_set i (B <*> UNIV))"
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   289
apply (case_tac "i=j")
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   290
apply (simp add: lift_def lift_set_def rename_constrains)
13798
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 13790
diff changeset
   291
apply (erule preserves_snd_lift_stable[THEN stableD, THEN constrains_weaken_R],
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 13790
diff changeset
   292
       assumption)
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   293
apply (erule constrains_imp_subset [THEN lift_set_mono])
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   294
done
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   295
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   296
(** Lemmas for the transient theorem **)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   297
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   298
lemma insert_map_upd_same: "(insert_map i t f)(i := s) = insert_map i s f"
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   299
by (rule ext, auto)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   300
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   301
lemma insert_map_upd:
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   302
     "(insert_map j t f)(i := s) =  
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   303
      (if i=j then insert_map i s f  
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   304
       else if i<j then insert_map j t (f(i:=s))  
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   305
       else insert_map j t (f(i - Suc 0 := s)))"
13798
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 13790
diff changeset
   306
apply (rule ext) 
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   307
apply (simp split add: nat_diff_split) 
13798
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 13790
diff changeset
   308
 txt{*This simplification is VERY slow*}
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   309
done
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   310
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   311
lemma insert_map_eq_diff:
13805
3786b2fd6808 some x-symbols
paulson
parents: 13798
diff changeset
   312
     "[| insert_map i s f = insert_map j t g;  i\<noteq>j |]  
3786b2fd6808 some x-symbols
paulson
parents: 13798
diff changeset
   313
      ==> \<exists>g'. insert_map i s' f = insert_map j t g'"
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   314
apply (subst insert_map_upd_same [symmetric])
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   315
apply (erule ssubst)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   316
apply (simp only: insert_map_upd if_False split: split_if, blast)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   317
done
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   318
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   319
lemma lift_map_eq_diff: 
13805
3786b2fd6808 some x-symbols
paulson
parents: 13798
diff changeset
   320
     "[| lift_map i (s,(f,uu)) = lift_map j (t,(g,vv));  i\<noteq>j |]  
3786b2fd6808 some x-symbols
paulson
parents: 13798
diff changeset
   321
      ==> \<exists>g'. lift_map i (s',(f,uu)) = lift_map j (t,(g',vv))"
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   322
apply (unfold lift_map_def, auto)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   323
apply (blast dest: insert_map_eq_diff)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   324
done
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   325
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   326
lemma lift_transient_eq_disj:
13805
3786b2fd6808 some x-symbols
paulson
parents: 13798
diff changeset
   327
     "F \<in> preserves snd  
3786b2fd6808 some x-symbols
paulson
parents: 13798
diff changeset
   328
      ==> (lift i F \<in> transient (lift_set j (A <*> UNIV))) =  
3786b2fd6808 some x-symbols
paulson
parents: 13798
diff changeset
   329
          (i=j & F \<in> transient (A <*> UNIV) | A={})"
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   330
apply (case_tac "i=j")
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   331
apply (auto simp add: lift_transient)
13798
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 13790
diff changeset
   332
apply (auto simp add: lift_set_def lift_def transient_def rename_def 
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 13790
diff changeset
   333
                      extend_def Domain_extend_act)
13790
8d7e9fce8c50 converting UNITY to new-style theories
paulson
parents: 13786
diff changeset
   334
apply (drule subsetD, blast, auto)
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   335
apply (rename_tac s f uu s' f' uu')
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   336
apply (subgoal_tac "f'=f & uu'=uu")
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   337
 prefer 2 apply (force dest!: preserves_imp_eq, auto)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   338
apply (drule sym)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   339
apply (drule subsetD)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   340
apply (rule ImageI)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   341
apply (erule bij_lift_map [THEN good_map_bij, 
13790
8d7e9fce8c50 converting UNITY to new-style theories
paulson
parents: 13786
diff changeset
   342
                           THEN Extend.intro, 
8d7e9fce8c50 converting UNITY to new-style theories
paulson
parents: 13786
diff changeset
   343
                           THEN Extend.mem_extend_act_iff [THEN iffD2]], force)
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   344
apply (erule lift_map_eq_diff [THEN exE], auto)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   345
done
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   346
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   347
(*USELESS??*)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   348
lemma lift_map_image_Times: "lift_map i ` (A <*> UNIV) =  
13805
3786b2fd6808 some x-symbols
paulson
parents: 13798
diff changeset
   349
      (\<Union>s \<in> A. \<Union>f. {insert_map i s f}) <*> UNIV"
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   350
apply (auto intro!: bexI image_eqI simp add: lift_map_def)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   351
apply (rule split_conv [symmetric])
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   352
done
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   353
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   354
lemma lift_preserves_eq:
13805
3786b2fd6808 some x-symbols
paulson
parents: 13798
diff changeset
   355
     "(lift i F \<in> preserves v) = (F \<in> preserves (v o lift_map i))"
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   356
by (simp add: lift_def rename_preserves)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   357
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   358
(*A useful rewrite.  If o, sub have been rewritten out already then can also
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   359
  use it as   rewrite_rule [sub_def, o_def] lift_preserves_sub*)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   360
lemma lift_preserves_sub:
13805
3786b2fd6808 some x-symbols
paulson
parents: 13798
diff changeset
   361
     "F \<in> preserves snd  
3786b2fd6808 some x-symbols
paulson
parents: 13798
diff changeset
   362
      ==> lift i F \<in> preserves (v o sub j o fst) =  
3786b2fd6808 some x-symbols
paulson
parents: 13798
diff changeset
   363
          (if i=j then F \<in> preserves (v o fst) else True)"
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   364
apply (drule subset_preserves_o [THEN subsetD])
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   365
apply (simp add: lift_preserves_eq o_def drop_map_lift_map_eq)
13798
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 13790
diff changeset
   366
apply (auto cong del: if_weak_cong 
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 13790
diff changeset
   367
            simp add: lift_map_def eq_commute split_def o_def)
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   368
done
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   369
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   370
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   371
(*** Lemmas to handle function composition (o) more consistently ***)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   372
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   373
(*Lets us prove one version of a theorem and store others*)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   374
lemma o_equiv_assoc: "f o g = h ==> f' o f o g = f' o h"
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   375
by (simp add: expand_fun_eq o_def)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   376
13805
3786b2fd6808 some x-symbols
paulson
parents: 13798
diff changeset
   377
lemma o_equiv_apply: "f o g = h ==> \<forall>x. f(g x) = h x"
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   378
by (simp add: expand_fun_eq o_def)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   379
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   380
lemma fst_o_lift_map: "sub i o fst o lift_map i = fst"
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   381
apply (rule ext)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   382
apply (auto simp add: o_def lift_map_def sub_def)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   383
done
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   384
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   385
lemma snd_o_lift_map: "snd o lift_map i = snd o snd"
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   386
apply (rule ext)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   387
apply (auto simp add: o_def lift_map_def)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   388
done
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   389
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   390
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   391
(*** More lemmas about extend and project 
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   392
     They could be moved to {Extend,Project}.ML, but DON'T need the locale ***)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   393
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   394
lemma extend_act_extend_act: "extend_act h' (extend_act h act) =  
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   395
      extend_act (%(x,(y,y')). h'(h(x,y),y')) act"
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   396
apply (auto elim!: rev_bexI simp add: extend_act_def, blast) 
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   397
done
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   398
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   399
lemma project_act_project_act: "project_act h (project_act h' act) =  
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   400
      project_act (%(x,(y,y')). h'(h(x,y),y')) act"
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   401
by (auto elim!: rev_bexI simp add: project_act_def)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   402
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   403
lemma project_act_extend_act:
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   404
     "project_act h (extend_act h' act) =  
13805
3786b2fd6808 some x-symbols
paulson
parents: 13798
diff changeset
   405
        {(x,x'). \<exists>s s' y y' z. (s,s') \<in> act &  
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   406
                 h(x,y) = h'(s,z) & h(x',y') = h'(s',z)}"
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   407
by (simp add: extend_act_def project_act_def, blast)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   408
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   409
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   410
(*** OK and "lift" ***)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   411
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   412
lemma act_in_UNION_preserves_fst:
13805
3786b2fd6808 some x-symbols
paulson
parents: 13798
diff changeset
   413
     "act \<subseteq> {(x,x'). fst x = fst x'} ==> act \<in> UNION (preserves fst) Acts"
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   414
apply (rule_tac a = "mk_program (UNIV,{act},UNIV) " in UN_I)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   415
apply (auto simp add: preserves_def stable_def constrains_def)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   416
done
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   417
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   418
lemma UNION_OK_lift_I:
13805
3786b2fd6808 some x-symbols
paulson
parents: 13798
diff changeset
   419
     "[| \<forall>i \<in> I. F i \<in> preserves snd;   
3786b2fd6808 some x-symbols
paulson
parents: 13798
diff changeset
   420
         \<forall>i \<in> I. UNION (preserves fst) Acts \<subseteq> AllowedActs (F i) |]  
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   421
      ==> OK I (%i. lift i (F i))"
13790
8d7e9fce8c50 converting UNITY to new-style theories
paulson
parents: 13786
diff changeset
   422
apply (auto simp add: OK_def lift_def rename_def Extend.Acts_extend)
13798
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 13790
diff changeset
   423
apply (simp add: Extend.AllowedActs_extend project_act_extend_act)
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   424
apply (rename_tac "act")
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   425
apply (subgoal_tac
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   426
       "{(x, x'). \<exists>s f u s' f' u'. 
13805
3786b2fd6808 some x-symbols
paulson
parents: 13798
diff changeset
   427
                    ((s, f, u), s', f', u') \<in> act & 
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   428
                    lift_map j x = lift_map i (s, f, u) & 
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   429
                    lift_map j x' = lift_map i (s', f', u') } 
13805
3786b2fd6808 some x-symbols
paulson
parents: 13798
diff changeset
   430
                \<subseteq> { (x,x') . fst x = fst x'}")
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   431
apply (blast intro: act_in_UNION_preserves_fst, clarify)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   432
apply (drule_tac x = j in fun_cong)+
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   433
apply (drule_tac x = i in bspec, assumption)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   434
apply (frule preserves_imp_eq, auto)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   435
done
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   436
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   437
lemma OK_lift_I:
13805
3786b2fd6808 some x-symbols
paulson
parents: 13798
diff changeset
   438
     "[| \<forall>i \<in> I. F i \<in> preserves snd;   
3786b2fd6808 some x-symbols
paulson
parents: 13798
diff changeset
   439
         \<forall>i \<in> I. preserves fst \<subseteq> Allowed (F i) |]  
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   440
      ==> OK I (%i. lift i (F i))"
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   441
by (simp add: safety_prop_AllowedActs_iff_Allowed UNION_OK_lift_I)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   442
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   443
lemma Allowed_lift [simp]: "Allowed (lift i F) = lift i ` (Allowed F)"
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   444
by (simp add: lift_def Allowed_rename)
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   445
13790
8d7e9fce8c50 converting UNITY to new-style theories
paulson
parents: 13786
diff changeset
   446
lemma lift_image_preserves:
8d7e9fce8c50 converting UNITY to new-style theories
paulson
parents: 13786
diff changeset
   447
     "lift i ` preserves v = preserves (v o drop_map i)"
13798
4c1a53627500 conversion to new-style theories and tidying
paulson
parents: 13790
diff changeset
   448
by (simp add: rename_image_preserves lift_def inv_lift_map_eq)
13786
ab8f39f48a6f More conversion of UNITY to Isar new-style theories
paulson
parents: 11701
diff changeset
   449
7186
860479291bb5 new theory UNITY/Lift_prog
paulson
parents:
diff changeset
   450
end