mCRL2
Loading...
Searching...
No Matches
invariant_checker.h
Go to the documentation of this file.
1// Author(s): Luc Engelen
2// Copyright: see the accompanying file COPYING or copy at
3// https://github.com/mCRL2org/mCRL2/blob/master/COPYING
4//
5// Distributed under the Boost Software License, Version 1.0.
6// (See accompanying file LICENSE_1_0.txt or copy at
7// http://www.boost.org/LICENSE_1_0.txt)
8//
9/// \file mcrl2/invariant_checker.h
10/// \brief Add your file description here.
11
12// Interface to class Invariant_Checker
13
14#ifndef MCRL2_LPS_INVARIANT_CHECKER_H
15#define MCRL2_LPS_INVARIANT_CHECKER_H
16
17#include "mcrl2/data/detail/prover/bdd_prover.h"
18#include "mcrl2/data/detail/prover/bdd2dot.h"
19#include "mcrl2/lps/stochastic_specification.h"
20
21/// The class Invariant_Checker is initialized with an LPS using the constructor Invariant_Checker::Invariant_Checker.
22/// After initialization, the function Invariant_Checker::check_invariant can be called any number of times to check
23/// whether an expression of sort Bool passed as argument a_invariant is an invariant of this LPS. A new instance of the
24/// class Invariant_Checker has to be created for each new LPS that has to be checked.
25///
26/// The class Invariant_Checker uses an instance of the class BDD_Prover to check whether a formula is a valid invariant
27/// of an mCRL2 LPS. The constructor Invariant_Checker::Invariant_Checker initializes the BDD based prover with the
28/// parameters a_rewrite_strategy, a_time_limit, a_path_eliminator, a_solver_type and the data specification of the LPS
29/// passed as parameter a_lps. The parameter a_rewrite_strategy specifies which rewrite strategy is used by the prover's
30/// rewriter. It can be set to either GS_REWR_JITTY or GS_REWR_JITTYC. The parameter
31/// a_time_limit specifies the maximum amount of time in seconds to be spent by the prover on proving a single expression.
32/// If a_time_limit is set to 0, no time limit will be enforced. The parameter a_path_eliminator specifies whether or not
33/// path elimination is applied. When path elimination is applied, the prover uses an SMT solver to remove inconsistent
34/// paths from BDDs. The parameter a_solver_type specifies which SMT solver is used for path elimination. Either the SMT
35/// solver ario (http://www.eecs.umich.edu/~ario/) or cvc-lite (http://www.cs.nyu.edu/acsys/cvcl/) can be used. To use one
36/// of these solvers, the directory containing the corresponding executable must be in the path. If the parameter
37/// a_path_eliminator is set to false, the parameter a_solver_type is ignored. The parameter a_apply_induction indicates
38/// whether or not induction on list will be applied.
39///
40/// The parameter a_dot_file_name specifies whether a file in dot format of the resulting BDD is saved each time the
41/// prover cannot determine whether an expression is a contradiction or a tautology. If the parameter is set to 0, no .dot
42/// files are saved. If a string is passed as parameter a_dot_file_name, this string will be used as the prefix of the
43/// filenames. An instance of the class BDD2Dot is used to save these files in dot format.
44///
45/// If the parameter a_counter_example is set to true, a so called counter example will be printed to stderr each time a
46/// summand is encountered that violates the invariant. A counter example is a valuation for which the expression to be
47/// proven does not hold. If the parameter a_all_violations is set to true, the invariant checker will not stop as soon as
48/// a violation of the invariant is found, but will report all violations instead.
49///
50/// Given an LPS,
51///
52/// P(d: D) = ...
53/// + sum ei: Ei. ci(d, ei) -> ai(fi(d, ei)) . P(gi(d, ei))
54/// + ...;
55///
56/// an instance of the class Invariant_Checker will generate a formula of the form
57///
58/// inv(d) /\ ci(d, ei) => inv(gi(d, ei))
59///
60/// for each of the summands, where inv() is the expression passed as parameter a_invariant. If this expression passed as
61/// parameter a_invariant holds for the initial state and all the generated formulas are tautologies according to the
62/// prover, it is an invariant.
63
64namespace mcrl2
65{
66namespace lps
67{
68namespace detail
69{
70
71template <typename Specification>
73{
74 typedef typename Specification::process_type process_type;
77
78 private:
79 const Specification& f_spec;
88 void save_dot_file(std::size_t a_summand_number);
89 bool check_init(const data::data_expression& a_invariant);
90 bool check_summand(const data::data_expression& a_invariant, const action_summand_type& a_summand, const std::size_t a_summand_number);
91 bool check_summands(const data::data_expression& a_invariant);
92 public:
93
94 /// precondition: the argument passed as parameter a_lps is a valid mCRL2 LPS
95 /// precondition: the argument passed as parameter a_time_limit is greater than or equal to 0. If the argument is equal
96 /// to 0, no time limit will be enforced
97 Invariant_Checker(
98 const Specification& a_lps,
99 data::rewriter::strategy a_rewrite_strategy = data::jitty,
100 int a_time_limit = 0,
101 bool a_path_eliminator = false,
103 bool a_apply_induction = false,
104 bool a_counter_example = false,
105 bool a_all_violations = false,
106 const std::string& a_dot_file_name = std::string()
107 );
108
109 /// precondition: the argument passed as parameter a_invariant is a valid expression in internal mCRL2 format
110 bool check_invariant(const data::data_expression& a_invariant);
111};
112
113// Class Invariant_Checker ------------------------------------------------------------------------
114// Class Invariant_Checker - Functions declared private -----------------------------------------
115
116template <typename Specification>
118{
120 {
121 data::data_expression v_counter_example(f_bdd_prover.get_counter_example());
122 assert(v_counter_example.defined());
123 mCRL2log(log::info) << " Counter example: " << data::pp(v_counter_example) << "\n";
124 }
125}
126
127// --------------------------------------------------------------------------------------------
128
129template <typename Specification>
130void Invariant_Checker<Specification>::save_dot_file(std::size_t a_summand_number)
131{
132 if (!f_dot_file_name.empty())
133 {
134 std::string v_file_name=f_dot_file_name;
135
136 if (a_summand_number == (std::size_t)-1) // Dangerous
137 {
138 v_file_name += "-init.dot";
139 }
140 else
141 {
142 v_file_name += "-" + std::to_string(a_summand_number) + ".dot";
143 }
144 f_bdd2dot.output_bdd(f_bdd_prover.get_bdd(), v_file_name);
145 }
146}
147
148// --------------------------------------------------------------------------------------------
149
150template <typename Specification>
151bool Invariant_Checker<Specification>::check_init(const data::data_expression& a_invariant)
152{
153 data::mutable_map_substitution<> v_substitutions;
154 const data::variable_list& d = f_spec.process().process_parameters();
155 const data::data_expression_list& e = f_init.expressions();
156 auto di = d.begin();
157 auto ei = e.begin();
158 for (; di != d.end(); ++di, ++ei)
159 {
160 v_substitutions[*di] = *ei;
161 }
162
163 data::data_expression b_invariant = data::replace_variables_capture_avoiding(a_invariant, v_substitutions);
164 f_bdd_prover.set_formula(b_invariant);
165 if (f_bdd_prover.is_tautology() == data::detail::answer_yes)
166 {
167 return true;
168 }
169 else
170 {
171 if (f_bdd_prover.is_contradiction() != data::detail::answer_yes)
172 {
174 save_dot_file((std::size_t)(-1));
175 }
176 return false;
177 }
178}
179
180// --------------------------------------------------------------------------------------------
181
182template <typename Specification>
183bool Invariant_Checker<Specification>::check_summand(
184 const data::data_expression& a_invariant,
185 const action_summand_type& a_summand,
186 const std::size_t a_summand_number)
187{
188 using namespace data::sort_bool;
189 const data::data_expression& v_condition = a_summand.condition();
190
191 data::mutable_map_substitution<> v_substitutions;
192
193 for (const data::assignment& a: a_summand.assignments())
194 {
195 v_substitutions[a.lhs()] = a.rhs();
196 }
197
198 const data::data_expression v_subst_invariant = data::replace_variables_capture_avoiding(a_invariant, v_substitutions);
199
200 const data::data_expression v_formula = implies(and_(a_invariant, v_condition), v_subst_invariant);
201 f_bdd_prover.set_formula(v_formula);
202 if (f_bdd_prover.is_tautology() == data::detail::answer_yes)
203 {
204 mCRL2log(log::verbose) << "The invariant holds for summand " << a_summand_number << "." << std::endl;
205 return true;
206 }
207 else
208 {
209 mCRL2log(log::info) << "The invariant does not hold for summand " << a_summand_number << std::endl;
210 if (f_bdd_prover.is_contradiction() != data::detail::answer_yes)
211 {
213 save_dot_file(a_summand_number);
214 }
215 return false;
216 }
217}
218
219// --------------------------------------------------------------------------------------------
220
221template <typename Specification>
222bool Invariant_Checker<Specification>::check_summands(const data::data_expression& a_invariant)
223{
224 bool v_result = true;
225 std::size_t v_summand_number = 1;
226
227 for (auto i = f_summands.begin(); i != f_summands.end() && (f_all_violations || v_result); ++i)
228 {
229 v_result = check_summand(a_invariant, *i, v_summand_number) && v_result;
230 v_summand_number++;
231 }
232 return v_result;
233}
234
235// Class Invariant_Checker<Specification> - Functions declared public --------------------------------------------
236
237template <typename Specification>
238Invariant_Checker<Specification>::Invariant_Checker(
239 const Specification& a_lps,
240 data::rewriter::strategy a_rewrite_strategy, int a_time_limit, bool a_path_eliminator, data::detail::smt_solver_type a_solver_type,
241 bool a_apply_induction, bool a_counter_example, bool a_all_violations, std::string const& a_dot_file_name
242):
243 f_spec(a_lps),
244 f_bdd_prover(a_lps.data(), data::used_data_equation_selector(a_lps.data()), a_rewrite_strategy, a_time_limit, a_path_eliminator, a_solver_type, a_apply_induction)
245{
246 f_init = a_lps.initial_process();
247 f_summands = a_lps.process().action_summands();
248 f_counter_example = a_counter_example;
249 f_all_violations = a_all_violations;
250 f_dot_file_name = a_dot_file_name;
251}
252
253// --------------------------------------------------------------------------------------------
254
255template <typename Specification>
256bool Invariant_Checker<Specification>::check_invariant(const data::data_expression& a_invariant)
257{
258 bool v_result = true;
259
260 if (check_init(a_invariant))
261 {
262 mCRL2log(log::verbose) << "The invariant holds for the initial state." << std::endl;
263 }
264 else
265 {
266 mCRL2log(log::info) << "The invariant does not hold for the initial state." << std::endl;
267 v_result = false;
268 }
269 if ((f_all_violations || v_result))
270 {
271 if (check_summands(a_invariant))
272 {
273 mCRL2log(log::verbose) << "The invariant holds for all summands." << std::endl;
274 }
275 else
276 {
277 mCRL2log(log::info) << "The invariant does not hold for all summands." << std::endl;
278 v_result = false;
279 }
280 }
281 if (v_result)
282 {
283 mCRL2log(log::info) << "The invariant holds for this LPS." << std::endl;
284 }
285 else
286 {
287 mCRL2log(log::info) << "The invariant does not hold for this LPS." << std::endl;
288 }
289
290 return v_result;
291}
292
293} // namespace detail
294} // namespace lps
295} // namespace mcrl2
296
297#endif
aterm_string(const std::string &s)
Constructor that allows construction from a string.
bool operator==(const unprotected_aterm_core &t) const
Comparison operator.
Definition aterm_core.h:83
bool defined() const
Returns true if this term is not equal to the term assigned by the default constructor of aterms,...
Definition aterm_core.h:143
bool operator!=(const unprotected_aterm_core &t) const
Inequality operator on two unprotected aterms.
Definition aterm_core.h:92
\brief Assignment of a data expression to a variable
Definition assignment.h:91
data_expression & operator=(const data_expression &) noexcept=default
The class BDD2Dot offers the ability to write binary decision diagrams to dot files....
Definition bdd2dot.h:30
Base class for storing properties of mCRL2 types. Properties are (key, value) pairs stored as strings...
data_property_map(const std::string &text)
The strings may appear in a random order, and not all of them need to be present.
std::string print(std::string s) const
unsigned int parse_unsigned_int(std::string const &text) const
const std::map< std::string, std::string > & data() const
Returns the stored properties.
std::set< core::identifier_string > names(const Container &v) const
Collects the names of the elements of the container. The name of element x is retrieved by x....
std::string compare(const std::string &property, unsigned int x, unsigned int y) const
Compares two integers, and returns a message if they are different. If if they are equal the empty st...
std::string print(const core::identifier_string &s) const
void parse_text(const std::string &text)
Initializes the property map with text containing lines in KEY = VALUE format.
std::string print(const data::variable &v) const
std::map< std::string, std::string > m_data
Contains a normalized string representation of the properties.
std::string compare(const data_property_map &other) const
Compares this property map with another property map. The function compare_property must be defined p...
std::string compare_property(const std::string &property, const std::string &, const std::string &) const
Compares two values x and y of a given property. This function should be redefined in derived classes...
std::string operator[](const std::string &key) const
Returns the value corresponding to key. Throws an exception if the key is not found.
unsigned int max_key_length() const
Returns the maximum length of the property names.
std::string print(std::size_t n) const
std::set< std::multiset< std::string > > parse_set_multiset_string(std::string const &text) const
std::set< std::string > parse_set_string(std::string const &text) const
std::string to_string() const
Returns a string representation of the properties.
data_property_map()
Default constructor for derived types.
std::string align(const std::string &s, unsigned int n) const
std::string compare(const std::string &property, const std::set< T > &x, const std::set< T > &y) const
Compares two sets and returns a string with the differences encountered. Elements present in the firs...
static std::string add_separators(std::string const &c, typename std::enable_if< atermpp::is_set< Container >::value >::type *=nullptr)
Add start/end separators for non-set container types.
std::string print(const Container &v, typename atermpp::enable_if_container< Container >::type *=nullptr) const
std::string print(const Container &v, bool print_separators, typename atermpp::enable_if_container< Container >::type *=nullptr) const
Rewriter that operates on data expressions.
Definition rewriter.h:81
Identifier generator that stores the identifiers of the context in a set. Using the operator()() and ...
\brief A data variable
Definition variable.h:28
const core::identifier_string & name() const
Definition variable.h:38
const sort_expression & sort() const
Definition variable.h:43
logger(const log_level_t l)
Default constructor.
Definition logger.h:164
LPS summand containing a multi-action.
Algorithm class that can be used to apply the binary algorithm.
Definition binary.h:45
data::assignment_list replace_enumerated_parameters_in_assignments(data::assignment_list v)
Replace assignments in v that are of a finite sort with a vector of assignments to Boolean variables.
Definition binary.h:298
data::data_expression make_if_tree(data::variable_vector new_parameters, const data::data_expression_vector &enumerated_elements)
Build an if-then-else tree of enumerated elements in terms of new parameters.
Definition binary.h:77
binary_algorithm(Specification &spec, DataRewriter &r, const std::string parameter_selection="")
Constructor for binary algorithm.
Definition binary.h:395
void update_deadlock_summand(deadlock_summand &s)
Update a deadlock summand with the new Boolean parameters.
Definition binary.h:370
detail::lps_algorithm< Specification > super
Definition binary.h:47
std::map< data::variable, std::vector< data::data_expression > > m_enumerated_elements
Mapping of variables to all values they can be assigned.
Definition binary.h:62
stochastic_process_initializer update_initial_process(const data::variable_list &parameters, const stochastic_process_initializer &init)
Definition binary.h:381
Specification::process_type process_type
Definition binary.h:48
data::set_identifier_generator m_if_trees_generator
Contains the names of variables appearing in rhs of m_if_trees.
Definition binary.h:68
const std::string m_parameter_selection
Definition binary.h:56
void replace_enumerated_parameters(const std::set< data::variable > &selected_params)
Take a specification and calculate a vector of boolean variables for each process parameter in select...
Definition binary.h:160
data::data_expression_list replace_enumerated_parameters_in_initial_expressions(const data::variable_list &vl, const data::data_expression_list &el)
Replace expressions in v that are of a finite sort with a vector of assignments to Boolean variables.
Definition binary.h:236
void update_action_summand(action_summand &s)
Update an action summand with the new Boolean parameters.
Definition binary.h:355
std::set< data::variable > select_parameters(const std::string parameter_selection) const
Determine which variables should be replaced, based on parameter_selection.
Definition binary.h:119
void run()
Apply the algorithm to the specification passed in the constructor.
Definition binary.h:405
process_type::action_summand_type action_summand_type
Definition binary.h:49
data::mutable_map_substitution m_if_trees
Mapping of variables to corresponding if-tree.
Definition binary.h:65
process_initializer update_initial_process(const data::variable_list &parameters, const process_initializer &init)
Definition binary.h:376
DataRewriter m_rewriter
Rewriter.
Definition binary.h:54
std::map< data::variable, std::vector< data::variable > > m_new_parameters
Mapping of finite variables to boolean vectors.
Definition binary.h:59
void update_action_summand(stochastic_action_summand &s)
Update an action summand with the new Boolean parameters.
Definition binary.h:363
data::enumerator_list_element_with_substitution enumerator_element
Definition binary.h:46
data::enumerator_identifier_generator m_id_generator
Identifier generator for the enumerator.
Definition binary.h:71
Algorithm class for elimination of constant parameters.
Definition constelm.h:26
LPS summand containing a deadlock.
Represents a deadlock.
Definition deadlock.h:26
void save_dot_file(std::size_t a_summand_number)
process_type::action_summand_type action_summand_type
bool check_summand(const data::data_expression &a_invariant, const action_summand_type &a_summand, const std::size_t a_summand_number)
action_summand_vector_type f_summands
bool check_summands(const data::data_expression &a_invariant)
bool check_init(const data::data_expression &a_invariant)
Specification::process_type process_type
std::vector< action_summand_type > action_summand_vector_type
bool check_invariant(const data::data_expression &a_invariant)
precondition: the argument passed as parameter a_invariant is a valid expression in internal mCRL2 fo...
Algorithm class for algorithms on linear process specifications. It can be instantiated with lps::spe...
Stores the following properties of a linear process specification:
std::string compare(const specification_property_map< Specification > &other) const
specification_property_map(const Specification &spec)
Constructor Initializes the specification_property_map with a linear process specification.
std::string compare_property(std::string property, std::string x, std::string y) const
data::detail::data_property_map< specification_property_map > super
std::string print(const process::action &a) const
std::string print(const multi_action &x) const
std::string print(const std::set< std::multiset< process::action_label > > &v) const
std::set< std::multiset< process::action_label > > compute_used_multi_actions(const Specification &spec) const
specification_property_map(const std::string &text)
Constructor. The strings may appear in a random order, and not all of them need to be present.
std::string info() const
Returns a textual overview of some properties of an LPS.
std::size_t compute_tau_summand_count(const Specification &spec) const
std::string print(const process::action_label &l) const
std::set< data::variable > compute_used_free_variables(const Specification &spec) const
std::set< process::action_label > compute_used_action_labels(const Specification &spec) const
invelm_algorithm(Specification &a_lps, const data::rewriter::strategy a_rewrite_strategy=data::jitty, const int a_time_limit=0, const bool a_path_eliminator=false, const data::detail::smt_solver_type a_solver_type=data::detail::solver_type_cvc, const bool a_apply_induction=false, const bool a_simplify_all=false)
detail::lps_algorithm< Specification > super
void simplify_summands(SummandSequence &summands, const data::data_expression &invariant, bool apply_prover)
void run(const data::data_expression &invariant, bool apply_prover)
void simplify_summand(summand_base &s, const data::data_expression &invariant, bool apply_prover)
Adds an invariant to the condition of the summand s, and optionally applies the prover to it.
process_type::action_summand_type action_summand_type
data::detail::BDD_Prover f_bdd_prover
Specification::process_type process_type
\brief A timed multi-action
Linear process specification.
LPS summand containing a multi-action.
\brief A stochastic distribution
Base class for LPS summands.
Definition summand.h:25
data::data_expression & condition()
Returns the condition expression.
Definition summand.h:67
\brief An action label
const core::identifier_string & name() const
Standard exception class for reporting runtime errors.
Definition exception.h:27
#define mCRL2log(LEVEL)
mCRL2log(LEVEL) provides the stream used to log.
Definition logger.h:391
std::string pp(const atermpp::aterm &t)
Transform an aterm to an ascii string.
Definition aterm.h:440
std::string pp(const core::identifier_string &x)
Definition core.cpp:26
std::string pp_format_to_string(const print_format_type pp_format)
Print string representation of pretty print format.
atermpp::aterm_string identifier_string
String type of the LPS library. Identifier strings are represented internally as ATerms.
smt_solver_type
The enumeration type smt_solver_type enumerates all available SMT solvers.
Definition solver_type.h:27
bool compare_property_maps(const std::string &message, const PropertyMap &map1, const std::string &expected_result)
A collection of utilities for lazy expression construction.
data_expression and_(data_expression const &p, data_expression const &q)
Returns an expression equivalent to p or q.
Namespace for system defined sort bool_.
Definition bool.h:32
bool is_false_function_symbol(const atermpp::aterm &e)
Recogniser for function false.
Definition bool.h:119
application and_(const data_expression &arg0, const data_expression &arg1)
Application of function symbol &&.
Definition bool.h:260
application implies(const data_expression &arg0, const data_expression &arg1)
Application of function symbol =>.
Definition bool.h:388
Namespace for all data library functionality.
Definition data.cpp:22
std::vector< assignment > assignment_vector
\brief vector of assignments
Definition assignment.h:149
std::vector< variable > variable_vector
\brief vector of variables
Definition variable.h:89
std::vector< data_expression > data_expression_vector
\brief vector of data_expressions
atermpp::term_list< data_expression > data_expression_list
\brief list of data_expressions
atermpp::term_list< variable > variable_list
\brief list of variables
sort_expression parse_sort_expression(const std::string &text, const data_specification &data_spec=detail::default_specification())
Parses and type checks a sort expression.
Definition parse.h:399
atermpp::term_list< assignment > assignment_list
\brief list of assignments
Definition assignment.h:146
std::string pp(const data::data_expression &x)
Definition data.cpp:52
std::string pp(const data::sort_expression_vector &x)
Definition data.cpp:26
@ warning
Definition logger.h:34
@ verbose
Definition logger.h:37
std::vector< data::variable > find_matching_parameters(const data::variable_list &params, const data::data_specification &dataspec, const std::vector< std::pair< std::string, std::string > > &selections, OutputIterator o)
Find parameter declarations that match a given string.
The main namespace for the LPS library.
Definition constelm.h:21
void lpspp(const std::string &input_filename, const std::string &output_filename, bool print_summand_numbers, core::print_format_type format)
Definition tools.cpp:171
void lpssumelm(const std::string &input_filename, const std::string &output_filename, const bool decluster)
Definition tools.cpp:246
void txt2lps(const std::string &input_filename, const std::string &output_filename)
Definition tools.cpp:310
void lpsuntime(const std::string &input_filename, const std::string &output_filename, const bool add_invariants, const bool apply_fourier_motzkin, const data::rewriter::strategy rewrite_strategy)
Definition tools.cpp:296
std::string pp(const lps::stochastic_specification &x)
Definition lps.cpp:37
void lpssuminst(const std::string &input_filename, const std::string &output_filename, const data::rewriter::strategy rewrite_strategy, const std::string &sorts_string, const bool finite_sorts_only, const bool tau_summands_only)
Definition tools.cpp:259
std::size_t nr_of_booleans_for_elements(std::size_t n)
Definition binary.h:27
bool lpsinvelm(const std::string &input_filename, const std::string &output_filename, const std::string &invariant_filename, const std::string &dot_file_name, data::rewriter::strategy rewrite_strategy, data::detail::smt_solver_type solver_type, const bool no_check, const bool no_elimination, const bool simplify_all, const bool all_violations, const bool counter_example, const bool path_eliminator, const bool apply_induction, const int time_limit)
Definition tools.cpp:86
std::string pp(const lps::deadlock &x)
Definition lps.cpp:27
void lpsparelm(const std::string &input_filename, const std::string &output_filename)
Definition tools.cpp:161
std::string pp(const lps::multi_action &x)
Definition lps.cpp:30
void lpsbinary(const std::string &input_filename, const std::string &output_filename, const std::string &parameter_selection)
Definition tools.cpp:31
lps_rewriter_type
An enumerated type for the available lps rewriters.
void lpsconstelm(const std::string &input_filename, const std::string &output_filename, data::rewriter::strategy rewrite_strategy, bool instantiate_free_variables, bool ignore_conditions, bool remove_trivial_summands, bool remove_singleton_sorts)
Definition tools.cpp:43
void lpsinfo(const std::string &input_filename, const std::string &input_file_message)
Definition tools.cpp:75
void parse_lps< stochastic_specification >(std::istream &from, stochastic_specification &result)
Parses a stochastic linear process specification from an input stream.
Definition parse.h:183
void lpsrewr(const std::string &input_filename, const std::string &output_filename, const data::rewriter::strategy rewrite_strategy, const lps_rewriter_type rewriter_type)
Definition tools.cpp:213
std::string pp_with_summand_numbers(const stochastic_specification &x)
Definition lps.cpp:83
The main namespace for the Process library.
std::string pp(const process::action &x)
Definition process.cpp:35
std::size_t ceil_log2(std::size_t n)
Definition math.h:28
std::string trim_copy(const std::string &text)
Remove all trailing and leading spaces from the input.
std::string remove_whitespace(const std::string &text)
Removes whitespace from a string.
A class that takes a linear process specification and checks all tau-summands of that LPS for conflue...
std::size_t operator()(const atermpp::detail::reference_aterm< T > &t) const