# HG changeset patch # User paulson # Date 1047634246 -3600 # Node ID 0c18f31d901a16845ef771d4cf4c4bff053e666d # Parent b681a3cb0beb08bfdc2a24c6bd4daf55802e4d5b Proved the main lemma on progress sets diff -r b681a3cb0beb -r 0c18f31d901a src/HOL/UNITY/ProgressSets.thy --- a/src/HOL/UNITY/ProgressSets.thy Fri Mar 14 10:30:15 2003 +0100 +++ b/src/HOL/UNITY/ProgressSets.thy Fri Mar 14 10:30:46 2003 +0100 @@ -8,6 +8,10 @@ David Meier and Beverly Sanders, Composing Leads-to Properties Theoretical Computer Science 243:1-2 (2000), 339-361. + + David Meier, + Progress Properties in Program Refinement and Parallel Composition + Swiss Federal Institute of Technology Zurich (1997) *) header{*Progress Sets*} @@ -15,102 +19,220 @@ theory ProgressSets = Transformers: constdefs - closure_set :: "'a set set => bool" - "closure_set C == - (\D. D \ C --> \D \ C) & (\D. D \ C --> \D \ C)" + lattice :: "'a set set => bool" + --{*Meier calls them closure sets, but they are just complete lattices*} + "lattice L == + (\M. M \ L --> \M \ L) & (\M. M \ L --> \M \ L)" cl :: "['a set set, 'a set] => 'a set" --{*short for ``closure''*} - "cl C r == \{x. x\C & r \ x}" + "cl L r == \{x. x\L & r \ x}" -lemma UNIV_in_closure_set: "closure_set C ==> UNIV \ C" -by (force simp add: closure_set_def) +lemma UNIV_in_lattice: "lattice L ==> UNIV \ L" +by (force simp add: lattice_def) -lemma empty_in_closure_set: "closure_set C ==> {} \ C" -by (force simp add: closure_set_def) +lemma empty_in_lattice: "lattice L ==> {} \ L" +by (force simp add: lattice_def) -lemma Union_in_closure_set: "[|D \ C; closure_set C|] ==> \D \ C" -by (simp add: closure_set_def) +lemma Union_in_lattice: "[|M \ L; lattice L|] ==> \M \ L" +by (simp add: lattice_def) -lemma Inter_in_closure_set: "[|D \ C; closure_set C|] ==> \D \ C" -by (simp add: closure_set_def) +lemma Inter_in_lattice: "[|M \ L; lattice L|] ==> \M \ L" +by (simp add: lattice_def) -lemma UN_in_closure_set: - "[|closure_set C; !!i. i\I ==> r i \ C|] ==> (\i\I. r i) \ C" +lemma UN_in_lattice: + "[|lattice L; !!i. i\I ==> r i \ L|] ==> (\i\I. r i) \ L" apply (simp add: Set.UN_eq) -apply (blast intro: Union_in_closure_set) +apply (blast intro: Union_in_lattice) done -lemma IN_in_closure_set: - "[|closure_set C; !!i. i\I ==> r i \ C|] ==> (\i\I. r i) \ C" +lemma INT_in_lattice: + "[|lattice L; !!i. i\I ==> r i \ L|] ==> (\i\I. r i) \ L" apply (simp add: INT_eq) -apply (blast intro: Inter_in_closure_set) +apply (blast intro: Inter_in_lattice) done -lemma Un_in_closure_set: "[|x\C; y\C; closure_set C|] ==> x\y \ C" +lemma Un_in_lattice: "[|x\L; y\L; lattice L|] ==> x\y \ L" apply (simp only: Un_eq_Union) -apply (blast intro: Union_in_closure_set) +apply (blast intro: Union_in_lattice) done -lemma Int_in_closure_set: "[|x\C; y\C; closure_set C|] ==> x\y \ C" +lemma Int_in_lattice: "[|x\L; y\L; lattice L|] ==> x\y \ L" apply (simp only: Int_eq_Inter) -apply (blast intro: Inter_in_closure_set) +apply (blast intro: Inter_in_lattice) done -lemma closure_set_stable: "closure_set {X. F \ stable X}" -by (simp add: closure_set_def stable_def constrains_def, blast) +lemma lattice_stable: "lattice {X. F \ stable X}" +by (simp add: lattice_def stable_def constrains_def, blast) -text{*The next three results state that @{term "cl C r"} is the minimal - element of @{term C} that includes @{term r}.*} -lemma cl_in_closure_set: "closure_set C ==> cl C r \ C" -apply (simp add: closure_set_def cl_def) +text{*The next three results state that @{term "cl L r"} is the minimal + element of @{term L} that includes @{term r}.*} +lemma cl_in_lattice: "lattice L ==> cl L r \ L" +apply (simp add: lattice_def cl_def) apply (erule conjE) apply (drule spec, erule mp, blast) done -lemma cl_least: "[|c\C; r\c|] ==> cl C r \ c" +lemma cl_least: "[|c\L; r\c|] ==> cl L r \ c" by (force simp add: cl_def) text{*The next three lemmas constitute assertion (4.61)*} -lemma cl_mono: "r \ r' ==> cl C r \ cl C r'" +lemma cl_mono: "r \ r' ==> cl L r \ cl L r'" +by (simp add: cl_def, blast) + +lemma subset_cl: "r \ cl L r" +by (simp add: cl_def, blast) + +lemma cl_UN_subset: "(\i\I. cl L (r i)) \ cl L (\i\I. r i)" by (simp add: cl_def, blast) -lemma subset_cl: "r \ cl C r" -by (simp add: cl_def, blast) +lemma cl_Un: "lattice L ==> cl L (r\s) = cl L r \ cl L s" +apply (rule equalityI) + prefer 2 + apply (simp add: cl_def, blast) +apply (rule cl_least) + apply (blast intro: Un_in_lattice cl_in_lattice) +apply (blast intro: subset_cl [THEN subsetD]) +done -lemma cl_UN_subset: "(\i\I. cl C (r i)) \ cl C (\i\I. r i)" -by (simp add: cl_def, blast) - -lemma cl_Un: "closure_set C ==> cl C (r\s) = cl C r \ cl C s" +lemma cl_UN: "lattice L ==> cl L (\i\I. r i) = (\i\I. cl L (r i))" apply (rule equalityI) prefer 2 apply (simp add: cl_def, blast) apply (rule cl_least) - apply (blast intro: Un_in_closure_set cl_in_closure_set) -apply (blast intro: subset_cl [THEN subsetD]) -done - -lemma cl_UN: "closure_set C ==> cl C (\i\I. r i) = (\i\I. cl C (r i))" -apply (rule equalityI) - prefer 2 - apply (simp add: cl_def, blast) -apply (rule cl_least) - apply (blast intro: UN_in_closure_set cl_in_closure_set) + apply (blast intro: UN_in_lattice cl_in_lattice) apply (blast intro: subset_cl [THEN subsetD]) done -lemma cl_idem [simp]: "cl C (cl C r) = cl C r" +lemma cl_idem [simp]: "cl L (cl L r) = cl L r" by (simp add: cl_def, blast) -lemma cl_ident: "r\C ==> cl C r = r" +lemma cl_ident: "r\L ==> cl L r = r" by (force simp add: cl_def) text{*Assertion (4.62)*} -lemma cl_ident_iff: "closure_set C ==> (cl C r = r) = (r\C)" +lemma cl_ident_iff: "lattice L ==> (cl L r = r) = (r\L)" apply (rule iffI) apply (erule subst) - apply (erule cl_in_closure_set) + apply (erule cl_in_lattice) apply (erule cl_ident) done +lemma cl_subset_in_lattice: "[|cl L r \ r; lattice L|] ==> r\L" +by (simp add: cl_ident_iff [symmetric] equalityI subset_cl) + + +constdefs + closed :: "['a program, 'a set, 'a set, 'a set set] => bool" + "closed F T B L == \M. \act \ Acts F. B\M & T\M \ L --> + T \ (B \ wp act M) \ L" + + progress_set :: "['a program, 'a set, 'a set] => 'a set set set" + "progress_set F T B == + {L. F \ stable T & lattice L & B \ L & T \ L & closed F T B L}" + +lemma closedD: + "[|closed F T B L; act \ Acts F; B\M; T\M \ L|] + ==> T \ (B \ wp act M) \ L" +by (simp add: closed_def) + +lemma lattice_awp_lemma: + assumes tmc: "T\m \ C" --{*induction hypothesis in theorem below*} + and qsm: "q \ m" --{*holds in inductive step*} + and latt: "lattice C" + and tc: "T \ C" + and qc: "q \ C" + and clos: "closed F T q C" + shows "T \ (q \ awp F (m \ cl C (T\r))) \ C" +apply (simp del: INT_simps add: awp_def INT_extend_simps) +apply (rule INT_in_lattice [OF latt]) +apply (erule closedD [OF clos]) +apply (simp add: subset_trans [OF qsm Un_upper1]) +apply (subgoal_tac "T \ (m \ cl C (T\r)) = (T\m) \ cl C (T\r)") + prefer 2 apply (blast intro: tc rev_subsetD [OF _ cl_least]) +apply (erule ssubst) +apply (blast intro: Un_in_lattice latt cl_in_lattice tmc) +done + +lemma lattice_lemma: + assumes tmc: "T\m \ C" --{*induction hypothesis in theorem below*} + and qsm: "q \ m" --{*holds in inductive step*} + and act: "act \ Acts F" + and latt: "lattice C" + and tc: "T \ C" + and qc: "q \ C" + and clos: "closed F T q C" + shows "T \ (wp act m \ awp F (m \ cl C (T\r)) \ m) \ C" +apply (subgoal_tac "T \ (q \ wp act m) \ C") + prefer 2 apply (simp add: closedD [OF clos] act qsm tmc) +apply (drule Int_in_lattice + [OF _ lattice_awp_lemma [OF tmc qsm latt tc qc clos, of r] + latt]) +apply (subgoal_tac + "T \ (q \ wp act m) \ (T \ (q \ awp F (m \ cl C (T\r)))) = + T \ (q \ wp act m \ awp F (m \ cl C (T\r)))") + prefer 2 apply blast +apply simp +apply (drule Un_in_lattice [OF _ tmc latt]) +apply (subgoal_tac + "T \ (q \ wp act m \ awp F (m \ cl C (T\r))) \ T\m = + T \ (wp act m \ awp F (m \ cl C (T\r)) \ m)") + prefer 2 apply (blast intro: qsm [THEN subsetD], simp) +done + + +lemma progress_induction_step: + assumes tmc: "T\m \ C" --{*induction hypothesis in theorem below*} + and act: "act \ Acts F" + and mwens: "m \ wens_set F q" + and latt: "lattice C" + and tc: "T \ C" + and qc: "q \ C" + and clos: "closed F T q C" + and Fstable: "F \ stable T" + shows "T \ wens F act m \ C" +proof - +from mwens have qsm: "q \ m" + by (rule wens_set_imp_subset) +let ?r = "wens F act m" +have "?r \ (wp act m \ awp F (m\?r)) \ m" + by (simp add: wens_unfold [symmetric]) +then have "T\?r \ T \ ((wp act m \ awp F (m\?r)) \ m)" + by blast +then have "T\?r \ T \ ((wp act m \ awp F (T \ (m\?r))) \ m)" + by (simp add: awp_Int_eq Fstable stable_imp_awp_ident, blast) +then have "T\?r \ T \ ((wp act m \ awp F (m \ cl C (T\?r))) \ m)" + by (blast intro: awp_mono [THEN [2] rev_subsetD] subset_cl [THEN subsetD]) +then have "cl C (T\?r) \ + cl C (T \ ((wp act m \ awp F (m \ cl C (T\?r))) \ m))" + by (rule cl_mono) +then have "cl C (T\?r) \ + T \ ((wp act m \ awp F (m \ cl C (T\?r))) \ m)" + by (simp add: cl_ident lattice_lemma [OF tmc qsm act latt tc qc clos]) +then have "cl C (T\?r) \ (wp act m \ awp F (m \ cl C (T\?r))) \ m" + by blast +then have "cl C (T\?r) \ ?r" + by (blast intro!: subset_wens) +then have cl_subset: "cl C (T\?r) \ T\?r" + by (simp add: Int_subset_iff cl_ident tc + subset_trans [OF cl_mono [OF Int_lower1]]) +show ?thesis + by (rule cl_subset_in_lattice [OF cl_subset latt]) +qed + + +lemma progress_set_lemma: + "[|C \ progress_set F T B; r \ wens_set F B|] ==> T\r \ C" +apply (simp add: progress_set_def, clarify) +apply (erule wens_set.induct) + txt{*Base*} + apply (simp add: Int_in_lattice) + txt{*The difficult @{term wens} case*} + apply (simp add: progress_induction_step) +txt{*Disjunctive case*} +apply (subgoal_tac "(\U\W. T \ U) \ C") + apply (simp add: Int_Union) +apply (blast intro: UN_in_lattice) +done + end diff -r b681a3cb0beb -r 0c18f31d901a src/HOL/UNITY/Transformers.thy --- a/src/HOL/UNITY/Transformers.thy Fri Mar 14 10:30:15 2003 +0100 +++ b/src/HOL/UNITY/Transformers.thy Fri Mar 14 10:30:46 2003 +0100 @@ -48,15 +48,23 @@ "wp (totalize_act act) B = (wp act B \ Domain act) \ (B - Domain act)" by (simp add: wp_def totalize_act_def, blast) +lemma awp_subset: "(awp F A \ A)" +by (force simp add: awp_def wp_def) + lemma awp_Int_eq: "awp F (A\B) = awp F A \ awp F B" by (simp add: awp_def wp_def, blast) text{*The fundamental theorem for awp*} -theorem awp_iff: "(A <= awp F B) = (F \ A co B)" +theorem awp_iff_constrains: "(A <= awp F B) = (F \ A co B)" by (simp add: awp_def constrains_def wp_iff INT_subset_iff) -theorem stable_iff_awp: "(A \ awp F A) = (F \ stable A)" -by (simp add: awp_iff stable_def) +lemma awp_iff_stable: "(A \ awp F A) = (F \ stable A)" +by (simp add: awp_iff_constrains stable_def) + +lemma stable_imp_awp_ident: "F \ stable A ==> awp F A = A" +apply (rule equalityI [OF awp_subset]) +apply (simp add: awp_iff_stable) +done lemma awp_mono: "(A \ B) ==> awp F A \ awp F B" by (simp add: awp_def wp_def, blast) @@ -168,8 +176,8 @@ lemma leadsTo_imp_wens_set: "F \ A leadsTo B ==> \C \ wens_set F B. A \ C" apply (erule leadsTo_induct_pre) - apply (blast dest!: ensures_imp_wens intro: wens_set.Basis wens_set.Wens, clarify) - apply (drule ensures_weaken_R, assumption) + apply (blast dest!: ensures_imp_wens intro: wens_set.Basis wens_set.Wens) + apply (clarify, drule ensures_weaken_R, assumption) apply (blast dest!: ensures_imp_wens intro: wens_set.Wens) apply (case_tac "S={}") apply (simp, blast intro: wens_set.Basis) @@ -197,8 +205,7 @@ lemma awp_Join_eq: "awp (F\G) B = awp F B \ awp G B" by (simp add: awp_def wp_def, blast) -lemma wens_subset: - "wens F act B - B \ wp act B \ awp F (B \ wens F act B)" +lemma wens_subset: "wens F act B - B \ wp act B \ awp F (B \ wens F act B)" by (subst wens_unfold, fast) text{*Assertion (4.31)*} @@ -239,8 +246,7 @@ apply (rule_tac B = "wens (F\G) act (T\X)" in subset_trans) prefer 2 apply (blast intro!: wens_mono) apply (subst wens_Int_eq, assumption+) -apply (rule subset_wens_Join [of _ T], simp) - apply blast +apply (rule subset_wens_Join [of _ T], simp, blast) apply (subgoal_tac "T \ wens F act (T\X) \ T\X = T \ wens F act X") prefer 2 apply (subst wens_Int_eq [symmetric], assumption+) @@ -388,8 +394,7 @@ "[|W \ wens_single_finite act B ` (atMost k); single_valued act; W\{}|] ==> \m. \W = wens_single_finite act B m" apply (induct k) - apply (rule_tac x=0 in exI, simp) - apply blast + apply (rule_tac x=0 in exI, simp, blast) apply (auto simp add: atMost_Suc) apply (case_tac "wens_single_finite act B (Suc n) \ W") prefer 2 apply blast @@ -469,11 +474,8 @@ lemma fp_leadsTo_Union: "[|T-B \ awp F T; T-B \ FP G; F \ A leadsTo B|] ==> F\G \ T\A leadsTo B" -apply (rule leadsTo_Union) -apply assumption; - apply (simp add: FP_def awp_iff stable_def constrains_def) - apply (blast intro: elim:); -apply assumption; +apply (rule leadsTo_Union, assumption) + apply (simp add: FP_def awp_iff_constrains stable_def constrains_def, blast, assumption) done end diff -r b681a3cb0beb -r 0c18f31d901a src/HOL/UNITY/UNITY.thy --- a/src/HOL/UNITY/UNITY.thy Fri Mar 14 10:30:15 2003 +0100 +++ b/src/HOL/UNITY/UNITY.thy Fri Mar 14 10:30:46 2003 +0100 @@ -72,6 +72,9 @@ lemma insert_Id_Acts [iff]: "insert Id (Acts F) = Acts F" by (simp add: insert_absorb Id_in_Acts) +lemma Acts_nonempty [simp]: "Acts F \ {}" +by auto + lemma Id_in_AllowedActs [iff]: "Id \ AllowedActs F" apply (cut_tac x = F in Rep_Program) apply (auto simp add: program_typedef)