Theory RefMappings

theory RefMappings
imports Traces
(*  Title:      HOL/HOLCF/IOA/RefMappings.thy
    Author:     Olaf Müller
*)

section ‹Refinement Mappings in HOLCF/IOA›

theory RefMappings
imports Traces
begin

default_sort type

definition move :: "('a, 's) ioa ⇒ ('a, 's) pairs ⇒ 's ⇒ 'a ⇒ 's ⇒ bool"
  where "move ioa ex s a t ⟷
    is_exec_frag ioa (s, ex) ∧ Finite ex ∧
    laststate (s, ex) = t ∧
    mk_trace ioa ⋅ ex = (if a ∈ ext ioa then a ↝ nil else nil)"

definition is_ref_map :: "('s1 ⇒ 's2) ⇒ ('a, 's1) ioa ⇒ ('a, 's2) ioa ⇒ bool"
  where "is_ref_map f C A ⟷
   ((∀s ∈ starts_of C. f s ∈ starts_of A) ∧
     (∀s t a. reachable C s ∧ s ─a─C→ t ⟶ (∃ex. move A ex (f s) a (f t))))"

definition is_weak_ref_map :: "('s1 ⇒ 's2) ⇒ ('a, 's1) ioa ⇒ ('a, 's2) ioa ⇒ bool"
  where "is_weak_ref_map f C A ⟷
    ((∀s ∈ starts_of C. f s ∈ starts_of A) ∧
      (∀s t a. reachable C s ∧ s ─a─C→ t ⟶
        (if a ∈ ext C then (f s) ─a─A→ (f t) else f s = f t)))"


subsection ‹Transitions and moves›

lemma transition_is_ex: "s ─a─A→ t ⟹ ∃ex. move A ex s a t"
  apply (rule_tac x = " (a, t) ↝ nil" in exI)
  apply (simp add: move_def)
  done

lemma nothing_is_ex: "a ∉ ext A ∧ s = t ⟹ ∃ex. move A ex s a t"
  apply (rule_tac x = "nil" in exI)
  apply (simp add: move_def)
  done

lemma ei_transitions_are_ex:
  "s ─a─A→ s' ∧ s' ─a'─A→ s'' ∧ a' ∉ ext A ⟹ ∃ex. move A ex s a s''"
  apply (rule_tac x = " (a,s') ↝ (a',s'') ↝nil" in exI)
  apply (simp add: move_def)
  done

lemma eii_transitions_are_ex:
  "s1 ─a1─A→ s2 ∧ s2 ─a2─A→ s3 ∧ s3 ─a3─A→ s4 ∧ a2 ∉ ext A ∧ a3 ∉ ext A ⟹
    ∃ex. move A ex s1 a1 s4"
  apply (rule_tac x = "(a1, s2) ↝ (a2, s3) ↝ (a3, s4) ↝ nil" in exI)
  apply (simp add: move_def)
  done


subsection ‹‹weak_ref_map› and ‹ref_map››

lemma weak_ref_map2ref_map: "ext C = ext A ⟹ is_weak_ref_map f C A ⟹ is_ref_map f C A"
  apply (unfold is_weak_ref_map_def is_ref_map_def)
  apply auto
  apply (case_tac "a ∈ ext A")
  apply (auto intro: transition_is_ex nothing_is_ex)
  done

lemma imp_conj_lemma: "(P ⟹ Q ⟶ R) ⟹ P ∧ Q ⟶ R"
  by blast

declare if_split [split del]
declare if_weak_cong [cong del]

lemma rename_through_pmap:
  "is_weak_ref_map f C A ⟹ is_weak_ref_map f (rename C g) (rename A g)"
  apply (simp add: is_weak_ref_map_def)
  apply (rule conjI)
  text ‹1: start states›
  apply (simp add: rename_def rename_set_def starts_of_def)
  text ‹1: start states›
  apply (rule allI)+
  apply (rule imp_conj_lemma)
  apply (simp (no_asm) add: rename_def rename_set_def)
  apply (simp add: externals_def asig_inputs_def asig_outputs_def asig_of_def trans_of_def)
  apply safe
  apply (simplesubst if_split)
   apply (rule conjI)
   apply (rule impI)
   apply (erule disjE)
   apply (erule exE)
  apply (erule conjE)
  text ‹‹x› is input›
   apply (drule sym)
   apply (drule sym)
  apply simp
  apply hypsubst+
  apply (frule reachable_rename)
  apply simp
  text ‹‹x› is output›
   apply (erule exE)
  apply (erule conjE)
   apply (drule sym)
   apply (drule sym)
  apply simp
  apply hypsubst+
  apply (frule reachable_rename)
  apply simp
  text ‹‹x› is internal›
  apply (frule reachable_rename)
  apply auto
  done

declare if_split [split]
declare if_weak_cong [cong]

end