Theory Dom_Kildall
section ‹A kildall's algorithm for computing dominators›
theory Dom_Kildall
imports Dom_Semi_List "HOL-Library.While_Combinator" "Jinja.SemilatAlg"
begin
text ‹A kildall's algorithm for computing dominators.
It uses the ideas and the framework of kildall's algorithm implemented in Jinja \<^cite>‹"Kildall-AFP"›,
and modifications are needed to make it work for a fast algorithm for computing dominators›
type_synonym state_dom = "nat list "
primrec propa ::
"'s binop ⇒ (nat × 's) list ⇒ 's list ⇒ nat list ⇒ 's list * nat list"
where
"propa f [] τs wl = (τs,wl)"
| "propa f (q'# qs) τs wl = (let (q,τ) = q';
u = (τ ⊔⇘f⇙ τs!q);
wl' = (if u = τs!q then wl
else (insort q (remove1 q wl)))
in propa f qs (τs[q := u]) wl')"
definition iter ::
"'s binop ⇒ 's step_type ⇒ 's list ⇒ nat list ⇒ 's list × nat list"
where
"iter f step τs w =
while (λ(τs,w). w ≠ [])
(λ(τs,w). let p = hd w
in propa f (step p (τs!p)) τs (tl w))
(τs,w)"
definition unstables :: "state_dom ord ⇒ state_dom step_type ⇒ state_dom list ⇒ nat list"
where
"unstables r step τs = sorted_list_of_set {p. p < size τs ∧ ¬ stable r step τs p}"
definition kildall :: "state_dom ord ⇒state_dom binop ⇒ state_dom step_type ⇒ state_dom list ⇒ state_dom list" where
"kildall r f step τs = fst(iter f step τs (unstables r step τs))"
lemma init_worklist_is_sorted: "sorted (unstables r step τs)"
by (simp add:sorted_less_sorted_list_of_set unstables_def)
context cfg_doms
begin
definition transf :: "node ⇒ state_dom ⇒ state_dom " where
"transf n input ≡ (n # input)"
definition exec :: "node ⇒ state_dom ⇒ (node × state_dom) list"
where "exec n xs = map (λpc. (pc, (transf n xs))) (rev (sorted_list_of_set(succs n)))"
lemma transf_res_is_rev: "sorted (rev ns) ⟹ n > hd ns ⟹ sorted (rev ((transf n ( ns))))"
by (induct ns) (auto simp add:transf_def sorted_wrt_append)
abbreviation "start ≡ [] # (replicate (length (g_V G) - 1) ( (rev[0..<length(g_V G)])))"
definition dom_kildall :: "state_dom list ⇒ state_dom list"
where "dom_kildall = kildall (fst (snd nodes_semi)) (snd (snd nodes_semi)) exec"
definition dom:: "nat ⇒ nat ⇒ bool" where
"dom i j ≡(let res = (dom_kildall start) !j in i ∈ (set res) ∨ i = j )"
lemma dom_refl: "dom i i"
by (unfold dom_def) simp
definition strict_dom :: "nat ⇒ nat ⇒ bool" where
"strict_dom i j ≡ (let res = (dom_kildall start) !j in i ∈ set res)"
lemma strict_domI1: "(dom_kildall ([] # (replicate (length (g_V G) - 1) ( (rev[0..<length(g_V G)])))))!j = res ⟹ i ∈ set res ⟹ strict_dom i j"
by (auto simp add:strict_dom_def )
lemma strict_domD:
"strict_dom i j ⟹
dom_kildall (( [] # (replicate (length (g_V G) - 1) ( (rev[0..<length(g_V G)])))))!j = a ⟹
i ∈ set a"
by (auto simp add:strict_dom_def )
lemma sdom_dom: "strict_dom i j ⟹ dom i j"
by (unfold strict_dom_def) (auto simp add:dom_def)
lemma not_sdom_not_dom: "¬strict_dom i j ⟹ i ≠ j ⟹ ¬dom i j"
by (unfold strict_dom_def) (auto simp add:dom_def)
lemma dom_sdom: "dom i j ⟹ i ≠ j ⟹ strict_dom i j"
by (unfold dom_def) (auto simp add:dom_def strict_dom_def)
end
end