Theory Stuttering

subsection ‹Stuttering›

theory Stuttering
  imports
    Semantics.IRStepThms
begin

inductive stutter:: "IRGraph  MapState  Params  FieldRefHeap  ID  ID  bool" ("_ _ _ _  _  _" 55)
  for g m p h where

  StutterStep:
  "g, p  (nid,m,h)  (nid',m,h)
    g m p h  nid  nid'" |

  Transitive:
  "g, p  (nid,m,h)  (nid'',m,h);
    g m p h  nid''  nid'
    g m p h  nid  nid'"

lemma stuttering_successor:
  assumes "(g, p  (nid, m, h)  (nid', m, h))"
  shows "{P'. (g m p h  nid  P')} = {nid'}  {nid''. (g m p h  nid'  nid'')}"
proof -
  have nextin: "nid'  {P'. (g m p h  nid  P')}"
    using assms StutterStep by fast
  have nextsubset: "{nid''. (g m p h  nid'  nid'')}  {P'. (g m p h  nid  P')}"
    by (metis Collect_mono assms stutter.Transitive)
  have "n  {P'. (g m p h  nid  P')} . n = nid'  n  {nid''. (g m p h  nid'  nid'')}"
    by (metis (no_types, lifting) Pair_inject assms mem_Collect_eq stutter.simps stepDet)
  then show ?thesis
    using nextin nextsubset by (auto simp add: mk_disjoint_insert)
qed

end