CUBA
cuba.hh
1 
8 #ifndef CUBA_CUBA_HH_
9 #define CUBA_CUBA_HH_
10 
11 #include "prop.hh"
12 #include "generator.hh"
13 
14 using namespace ruba;
15 
16 namespace cuba {
17 
22 class base_cuba {
23 public:
24  base_cuba(const string& initl, const string& final, const string& filename);
25  virtual ~base_cuba();
26  virtual void context_unbounded_analysis(const size_k k_bound = 0) = 0;
27 
28 protected:
29  bool reachable;
37  vector<set<visible_state>> generators;
40  vector<vector<bool>> reachable_T;
41 
42 private:
43  visible_state top_mapping(const explicit_state& tau);
44 };
45 
49 class symbolic_cuba: public base_cuba {
50 public:
51  symbolic_cuba(const string& initl, const string& final,
52  const string& filename);
53  ~symbolic_cuba();
54 
55  virtual void context_unbounded_analysis(const size_k k_bound = 0);
56 private:
57 
59  store_automaton create_init_automaton(const pushdown_automaton& P,
60  const pda_state q_I, const pda_stack& w);
61  store_automaton post_kleene(const store_automaton& A,
62  const pushdown_automaton& P);
63 
65  bool context_bounded_analysis(const size_k k, const symbolic_state& cfg_I);
66  set<fsa_state> project_Q(const store_automaton& A);
67  set<fsa_state> BFS_visit(const fsa_state& root,
68  const unordered_map<fsa_state, deque<fsa_state>>& adj,
69  const fsa_state_set& initials);
70  symbolic_state compose(const pda_state& _q, const store_automaton& Ai,
71  const vector<store_automaton>& automata, const size_n& idx);
72  store_automaton rename(const store_automaton& A, const pda_state& q_I);
73  store_automaton anonymize(const store_automaton& A, const pda_state& q_I,
74  const bool& is_rename = false);
75  store_automaton anonymize_by_split(const store_automaton& A,
76  const pda_state& q_I);
77  store_automaton anonymize_by_rename(const store_automaton& A,
78  const pda_state& q_I);
79 
81  bool is_recongnizable(const store_automaton& A, const thread_state& c);
82  bool is_equivalent(const store_automaton& A1, const store_automaton& A2);
83  store_automaton iunion(const store_automaton& A1,
84  const store_automaton& A2);
85  store_automaton intersect(const store_automaton& A1,
86  const store_automaton& A2);
87  store_automaton complement(const store_automaton& A);
88  store_automaton cross_product(const vector<store_automaton>& W);
89 
91  bool converge(const vector<deque<symbolic_state>>& R, const size_k k,
92  vector<set<visible_state>>& top_R);
93  bool is_convergent();
94  uint top_mapping(const deque<symbolic_state>& R,
95  vector<set<visible_state>>& topped_R);
96  vector<visible_state> top_mapping(const symbolic_state& tau);
97  set<pda_alpha> top_mapping(const store_automaton& A, const pda_state q);
98  vector<vector<pda_alpha>> cross_product(const vector<set<pda_alpha>>& tops);
99 };
100 
102 using antichain = deque<explicit_state_tid>;
103 
107 class explicit_cuba: public base_cuba {
108 public:
109  explicit_cuba(const string& initl, const string& final,
110  const string& filename);
111 
112  virtual ~explicit_cuba();
113 
114  virtual void context_unbounded_analysis(const size_k k_bound = 0);
115 private:
116 
117  bool k_bounded_reachability(const size_k k_bound,
118  const explicit_state& c_I);
119  antichain step(const explicit_state_tid& tau, const bool is_switch);
120  void step(const pda_state& q, const stack_vec& W, const uint tid,
121  antichain& successors);
122  bool update_R(vector<vector<antichain>>& R, const size_k k,
123  const explicit_state_tid& c);
124 
126  bool converge(const vector<antichain>& R, const size_k k,
127  vector<set<visible_state>>& top_R);
128  bool is_convergent();
129  bool is_reachable(const explicit_state_tid& tau, const size_k k,
130  vector<vector<antichain>>& R);
131  void marking(const pda_state& s, const pda_alpha& l);
132 
133  visible_state top_mapping(const explicit_state_tid& tau);
134 
136  bool finite_context_reachability(const size_n tid);
137  bool finite_context_reachability(const pushdown_automaton& PDA,
138  const thread_visible_state& s, stack<pda_alpha>& W,
139  map<thread_visible_state, bool>& visit,
140  map<thread_visible_state, bool>& trace);
141 };
142 }
143 /* namespace cuba */
144 
145 #endif /* CUBA_CUBA_HH_ */
uint pda_alpha
define the stack symbol of PDSs
Definition: pda.hh:19
Definition: cuba.cc:10
vector< vector< bool > > reachable_T
Definition: cuba.hh:40
Definition: cpda.hh:352
Definition: cpda.hh:233
Definition: cuba.hh:22
symbolic_cuba: A symbolic version for context-unbounded analysis.
Definition: cuba.hh:49
Definition: cpda.hh:369
ushort size_n
the size of threads
Definition: cpda.hh:25
concurrent_pushdown_automata CPDA
concurrent pushdown system
Definition: cuba.hh:35
Definition: cpda.cc:10
explicit_state initl_c
explicit initial state
Definition: cuba.hh:31
vector< set< visible_state > > generators
generators: used for determining the convergence
Definition: cuba.hh:37
Definition: pda.hh:404
ushort size_k
the size of context switches
Definition: cpda.hh:27
Definition: cpda.hh:139
explicit_cuba: An explicit version for context-unbounded analysis.
Definition: cuba.hh:107
Definition: pda.hh:497
deque< explicit_state_tid > antichain
To store unordering explicit states.
Definition: cuba.hh:102
uint pda_state
define the control state of PDSs
Definition: pda.hh:17
vector< pushdown_automaton > concurrent_pushdown_automata
Definition: cpda.hh:37
set< fsa_state > fsa_state_set
a set of fsa_state
Definition: fsa.hh:16
Definition: cpda.hh:45
Definition: pda.hh:158
visible_state final_c
explicit target state
Definition: cuba.hh:33
vector< pda_stack > stack_vec
the set of stacks in CPDS
Definition: cpda.hh:40