@@ -16,6 +16,7 @@ Author: Daniel Kroening, dkr@amazon.com
1616#include < util/run.h>
1717#include < util/std_expr.h>
1818#include < util/std_types.h>
19+ #include < util/string2int.h>
1920
2021#include < ebmc/ebmc_error.h>
2122#include < trans-word-level/next_symbol.h>
@@ -46,12 +47,13 @@ void buechi_transt::rename_state_symbol(const symbol_exprt &new_state_symbol)
4647
4748exprt hoa_label_to_expr (
4849 const hoat::labelt &label,
49- const ltl_sva_to_stringt <l_sva_to_string)
50+ const ltl_sva_to_stringt <l_sva_to_string,
51+ const hoat::ap_mapt &ap_map)
5052{
5153 std::vector<exprt> operands;
5254 operands.reserve (label.get_sub ().size ());
5355 for (auto &sub : label.get_sub ())
54- operands.push_back (hoa_label_to_expr (sub, ltl_sva_to_string));
56+ operands.push_back (hoa_label_to_expr (sub, ltl_sva_to_string, ap_map ));
5557
5658 if (label.id () == " t" )
5759 {
@@ -78,8 +80,17 @@ exprt hoa_label_to_expr(
7880 }
7981 else
8082 {
81- // atomic proposition, given as number
82- return ltl_sva_to_string.atom (label.id_string ());
83+ // Atomic proposition, given as number. This is the numbering
84+ // from the "AP" header, which then maps to a string "aX", which
85+ // is our atom number. These may or may not match.
86+ auto spot_ap_number = safe_string2size_t (label.id_string ());
87+
88+ auto ap_map_it = ap_map.find (spot_ap_number);
89+ if (ap_map_it == ap_map.end ())
90+ throw ebmc_errort{} << " failed to find atom " << label.id ()
91+ << " in AP header" ;
92+
93+ return ltl_sva_to_string.atom (ap_map_it->second );
8394 }
8495}
8596
@@ -150,6 +161,7 @@ ltl_to_buechi(const exprt &property, message_handlert &message_handler)
150161 hoa.buechi_acceptance_cleanup ();
151162
152163 auto max_state_number = hoa.max_state_number ();
164+ auto ap_map = hoa.parse_AP ();
153165 auto state_type = range_typet{0 , max_state_number};
154166 const auto buechi_state = symbol_exprt{" buechi::state" , state_type};
155167 const auto buechi_next_state =
@@ -220,7 +232,7 @@ ltl_to_buechi(const exprt &property, message_handlert &message_handler)
220232 {
221233 auto pre = equal_exprt{
222234 buechi_state, from_integer (state.first .number , state_type)};
223- auto cond = hoa_label_to_expr (edge.label , ltl_sva_to_string);
235+ auto cond = hoa_label_to_expr (edge.label , ltl_sva_to_string, ap_map );
224236 error_disjuncts.push_back (and_exprt{pre , cond});
225237 }
226238 }
@@ -242,7 +254,7 @@ ltl_to_buechi(const exprt &property, message_handlert &message_handler)
242254 {
243255 if (edge.dest_states .size () != 1 )
244256 throw ebmc_errort () << " edge must have one destination state" ;
245- auto cond = hoa_label_to_expr (edge.label , ltl_sva_to_string);
257+ auto cond = hoa_label_to_expr (edge.label , ltl_sva_to_string, ap_map );
246258 auto post = equal_exprt{
247259 buechi_next_state,
248260 from_integer (edge.dest_states .front (), state_type)};
0 commit comments