Theory Reaching_Definitions
theory Reaching_Definitions imports Bit_Vector_Framework begin
section ‹Reaching Definitions›
type_synonym ('n,'v) def = "'v * 'n option * 'n"
type_synonym ('n,'v) analysis_assignment = "'n ⇒ ('n,'v) def set"
subsection ‹What is defined on a path›
fun def_action :: "'v action ⇒ 'v set" where
"def_action (x ::= a) = {x}"
| "def_action (Bool b) = {}"
| "def_action Skip = {}"
abbreviation def_edge :: "('n,'v action) edge ⇒ 'v set" where
"def_edge == λ(q1, α, q2). def_action α"
definition def_of :: "'v ⇒ ('n,'v action) edge ⇒ ('n,'v) def" where
"def_of == (λx (q1, α, q2). (x, Some q1, q2))"
definition def_var :: "('n,'v action) edge list ⇒ 'v ⇒ 'n ⇒ ('n,'v) def" where
"def_var π x start = (if (∃e ∈ set π. x ∈ def_edge e)
then (def_of x (last (filter (λe. x ∈ def_edge e) π)))
else (x, None, start))"
definition def_path :: "('n list × 'v action list) ⇒ 'n ⇒ ('n,'v) def set" where
"def_path π start = ((λx. def_var (LTS.transition_list π) x start) ` UNIV)"
subsection ‹Reaching Definitions in Datalog›