Theory Comparison
subsection ‹Structural Graph Comparison›
theory
Comparison
imports
IRGraph
begin
text ‹
We introduce a form of structural graph comparison that is able to assert structural
equivalence of graphs which differ in zero or more reference node chains for any given nodes.
›
fun find_ref_nodes :: "IRGraph ⇒ (ID ⇀ ID)" where
"find_ref_nodes g = map_of
(map (λn. (n, ir_ref (kind g n))) (filter (λid. is_RefNode (kind g id)) (sorted_list_of_set (ids g))))"
fun replace_ref_nodes :: "IRGraph ⇒ (ID ⇀ ID) ⇒ ID list ⇒ ID list" where
"replace_ref_nodes g m xs = map (λid. (case (m id) of Some other ⇒ other | None ⇒ id)) xs"
fun find_next :: "ID list ⇒ ID set ⇒ ID option" where
"find_next to_see seen = (let l = (filter (λnid. nid ∉ seen) to_see)
in (case l of [] ⇒ None | xs ⇒ Some (hd xs)))"
inductive reachables :: "IRGraph ⇒ ID list ⇒ ID set ⇒ ID set ⇒ bool" where
"reachables g [] {} {}" |
"⟦None = find_next to_see seen⟧ ⟹ reachables g to_see seen seen" |
"⟦Some n = find_next to_see seen;
node = kind g n;
new = (inputs_of node) @ (successors_of node);
reachables g (to_see @ new) ({n} ∪ seen) seen' ⟧ ⟹ reachables g to_see seen seen' "
code_pred (modes: i ⇒ i ⇒ i ⇒ o ⇒ bool) [show_steps,show_mode_inference,show_intermediate_results]
reachables .
inductive nodeEq :: "(ID ⇀ ID) ⇒ IRGraph ⇒ ID ⇒ IRGraph ⇒ ID ⇒ bool" where
"⟦ kind g1 n1 = RefNode ref; nodeEq m g1 ref g2 n2 ⟧ ⟹ nodeEq m g1 n1 g2 n2" |
"⟦ x = kind g1 n1;
y = kind g2 n2;
is_same_ir_node_type x y;
replace_ref_nodes g1 m (successors_of x) = successors_of y;
replace_ref_nodes g1 m (inputs_of x) = inputs_of y ⟧
⟹ nodeEq m g1 n1 g2 n2"
code_pred [show_modes] nodeEq .
fun diffNodesGraph :: "IRGraph ⇒ IRGraph ⇒ ID set" where
"diffNodesGraph g1 g2 = (let refNodes = find_ref_nodes g1 in
{ n . n ∈ Predicate.the (reachables_i_i_i_o g1 [0] {}) ∧ (case refNodes n of Some _ ⇒ False | _ ⇒ True) ∧ ¬(nodeEq refNodes g1 n g2 n)})"
fun diffNodesInfo :: "IRGraph ⇒ IRGraph ⇒ (ID × IRNode × IRNode) set" (infix "∩⇩s" 20)
where
"diffNodesInfo g1 g2 = {(nid, kind g1 nid, kind g2 nid) | nid . nid ∈ diffNodesGraph g1 g2}"
fun eqGraph :: "IRGraph ⇒ IRGraph ⇒ bool" (infix "≈⇩s" 20)
where
"eqGraph isabelle_graph graal_graph = ((diffNodesGraph isabelle_graph graal_graph) = {})"
end