Theory KPL_execution_group

section ‹Execution rules for groups›

theory KPL_execution_group imports 
  KPL_execution_thread
begin

text ‹Intra-group race detection›
definition group_race 
  :: "lid set  (lid  thread_state)  bool"
where "group_race T γ  
  j  T. k  T. j  k  
  W (the (γ j))  (R (the (γ k))  W (the (γ k)))  {}"

text ‹The constraints for the @{term "merge"} map›
inductive pre_merge 
  :: "lid set  (lid  thread_state)  nat  word  bool"
where 
  " j  T ; z  W (the (γ j)) ; dom γ = T  
  pre_merge T γ z (sh (the (γ j)) z)"
| " j  T. z  W (the (γ j)) ; dom γ = T   
  pre_merge T γ z (sh (the (γ 0)) z)"

inductive_cases pre_merge_inv [elim!]: "pre_merge P γ z z'"

text ‹The @{term "merge"} map maps each nat to the word that 
   satisfies the above constaints. The merge_is_unique›
   lemma shows that there exists exactly one such word 
   per nat, provided there are no group races.›
definition merge :: "lid set  (lid  thread_state)  nat  word"
where "merge T γ  λz. The (pre_merge T γ z)"

lemma no_races_imp_no_write_overlap: 
  "¬ (group_race T γ)  
  i  T. j  T. 
  i  j  W (the (γ i))  W (the (γ j)) = {}"
unfolding group_race_def 
by blast

lemma merge_is_unique:
  assumes "dom γ = T"
  assumes "¬ (group_race T γ)"
  shows "∃!z'. pre_merge T γ z z'"
apply (insert assms)
apply (drule no_races_imp_no_write_overlap)
apply (intro allI ex_ex1I)
apply (metis pre_merge.intros)
apply clarify
proof -
  fix z1 z2
  assume a: "idom γ. jdom γ. i  j  W (the (γ i))  W (the (γ j)) = {}"
  assume "pre_merge (dom γ) γ z z1" 
  and "pre_merge (dom γ) γ z z2"
  thus "z1 = z2"
  apply (elim pre_merge_inv)
  apply (rename_tac j1 j2)
  apply (case_tac "j1 = j2")
  apply auto[1]
  apply simp
  apply (subgoal_tac "W (the (γ j1))  W (the (γ j2)) = {}")
  apply auto[1]
  apply (auto simp add: a)
  done
qed
 
text ‹The rules of Figure 5, plus an additional rule for
  equality abstraction (Fig 7a), plus an additional rule for
  adversarial abstraction (Fig 7b)›
inductive step_g
  :: "abs_level  gid  (gid  lid set)  (group_state × pred_stmt)  group_state option  bool"
where
  G_Race:
  " j  the (T i). step_t a (the (γ ts j), (s, p)) (the (γ' ts j)) ; 
    group_race (the (T i)) ((γ' :: group_state)ts) 
   step_g a i T (γ, (Basic s, p)) None"
| G_Basic:
  " j  the (T i). step_t a (the (γ ts j), (s, p)) (the (γ' ts j)) ; 
    ¬ (group_race (the (T i)) (γ' ts)) ;
    R_group γ' = R_group γ  (j  the (T i). ({j} × R (the (γ' ts j)))) ;
    W_group γ' = W_group γ  (j  the (T i). ({j} × W (the (γ' ts j)))) 
   step_g a i T (γ, (Basic s, p)) (Some γ')"
| G_No_Op:
  "j  the (T i). ¬ (eval_bool p (the (γ ts j)))
   step_g a i T (γ, (Barrier, p)) (Some γ)"
| G_Divergence:
  " j  k ; j  the (T i) ; k  the (T i) ;
   eval_bool p (the (γ ts j)) ; ¬ (eval_bool p (the (γ ts k))) 
   step_g a i T (γ, (Barrier, p)) None"
| G_Sync:
  " j  the (T i). eval_bool p (the (γ ts j)) ;
    j  the (T i). the (γ' ts j) = (the (γ ts j)) (| 
    sh := merge P (γ ts), R := {}, W := {} |)  
   step_g No_Abst i T (γ, (Barrier, p)) (Some γ')"
| G_Sync_Eq:
  " j  the (T i). eval_bool p (the (γ ts j)) ;
    j  the (T i). the (γ' ts j) = (the (γ ts j)) (| 
    sh := sh', R := {}, W := {} |)  
   step_g Eq_Abst i T (γ, (Barrier, p)) (Some γ')"
| G_Sync_Adv:
  " j  the (T i). eval_bool p (the (γ ts j)) ;
    j  the (T i). sh'. the (γ' ts j) = (the (γ ts j)) (| 
    sh := sh', R := {}, W := {} |)  
   step_g Adv_Abst i T (γ, (Barrier, p)) (Some γ')"

text ‹Rephrasing G_No_Op› to make it more usable›
lemma G_No_Op_helper:
  " j  the (T i). ¬ (eval_bool p (the (γ ts j))) ; γ = γ' 
   step_g a i T (γ, (Barrier, p)) (Some γ')"
by (simp add: step_g.G_No_Op)


end