pub fn translate(lts: &LabelledTransitionSystem<String>, formula: &StateFrm) -> Result<ParityGame, MercError> {
// Warn about any labels that are used in the formula but do not correspond to any label in the LTS.
let mut algorithm: Translation<'_, _, ()> = Translation::new(lts, &labels, &equation_system);
// Construct the parity game from the collected vertices and edges, where the `()` edge label is ignored.
/// Produces a warning for each label that is used in the formula but does not correspond to any label in the LTS.
pub fn translate_regular_formulas(formula: StateFrm, identifier_generator: &mut FreshStateVarGenerator) -> StateFrm {
pub fn new(lts: &'a L, parsed_labels: &'a Vec<MultiAction>, equation_system: &'a ModalEquationSystem) -> Self {
// We store (state, formula, N) into the queue, where N is the vertex number assigned to this pair. This means
self.set_vertex(vertex_index, Player::Odd, Priority::new(0)); // The priority and owner do not matter here
self.translate_modality_vertex(s, *operator, formula, expr, vertex_index, labelling, combine_labelling)?;
/// Translates a modality vertex (s, [a]Ψ) or (s, <a>Ψ) into the variability parity game vertex and its outgoing edges.
fn translate_equation<F>(&mut self, s: StateIndex, equation_index: usize, vertex_index: VertexIndex, labelling: &F)
// (s, μ X. Ψ) →_P odd, (s, Ψ[x := μ X. Ψ]), 2 * floor(AD(Ψ)/2) + 1. In Rust division is already floor.
// (s, ν X. Ψ) →_P even, (s, Ψ[x := ν X. Ψ]), 2 * floor(AD(Ψ)/2). In Rust division is already floor.
RegFrm::Choice { lhs, rhs } => match_regular_formula(lhs, action) || match_regular_formula(rhs, action),
ActFrmBinaryOp::Union => match_action_formula(lhs, action) || match_action_formula(rhs, action),
ActFrmBinaryOp::Intersect => match_action_formula(lhs, action) && match_action_formula(rhs, action),
let lts = read_aut(include_bytes!("../../../examples/lts/abp.aut") as &[u8], Vec::new()).unwrap();
let formula = UntypedStateFrmSpec::parse(include_str!("../../../examples/vpg/running_example.mcf")).unwrap();