Theory Dispatch_Carrier
theory Dispatch_Carrier
imports
"Voblint_Domain.Int_Lattice"
"Voblint_Domain.Order_Lattice"
"Voblint_CFG.CFG_Def"
begin
section ‹What each domain's published value needs to be shown and listed›
text ‹
A run result carries every published value in one tagged union,
‹abstract_value›, which ‹MCP_Carrier› generates from the
analysis manifest with one constructor per registered analysis. What the union
needs from each domain is domain content and stays here: how an order value is
listed, and an injective key for every domain's value.
An order value is listed as its pairs, or \<^const>‹None› where the state is
unreachable, so that a key can tell two apart.
›
definition order_pairs :: "relc ⇒ (vname × vname) list option" where
"order_pairs d = (case d of RelBot ⇒ None | RelC ps ⇒ Some (sorted_list_of_set ps))"
text ‹
A listed order reads as the order it lists. The listing and not the order is what
the union carries, since only a finite listing has an injective key.
›
definition order_view_string :: "(vname × vname) list option ⇒ String.literal" where
"order_view_string v = to_string (case v of None ⇒ RelBot | Some ps ⇒ RelC (set ps))"
text ‹
What one analysis shows of a state, as Goblint's report shows each component of its
combined state on its own: a pointwise analysis a value per variable, an analysis whose
state relates variables one value for the whole state.
›