/// <summary> /// Returns an enumerator of k random witnesses, or unbounded (default) if k is not positive. /// If the language is empty then the enumeration is empty. /// </summary> public IEnumerable <Sequence <T> > GenerateWitnesses(int k = 0) { Automaton <Sequence <T> > reach_aut = MkReachAut(); if (reach_aut.IsEmpty) { yield break; } else { int i = 0; while (true) { var path = new List <Sequence <T> >(reach_aut.ChoosePathToSomeFinalState(new Chooser())); var witness = Sequence <T> .AppendAll(path.ToArray()); yield return(witness); if (k > 0) { i += 1; if (i == k) { break; } } } yield break; } }
static string GetMember(Z3Provider z3p, Automaton <Expr> C) { //z3p.Chooser.RandomSeed = 123; var sExpr = new List <Expr>(C.ChoosePathToSomeFinalState(z3p.Chooser)).ToArray(); string s = new String(Array.ConvertAll(sExpr, m => z3p.GetCharValue(z3p.MainSolver.FindOneMember(m).Value))); return(s); }
/// <summary> /// Gets the atom of a predicate. /// </summary> public Automaton <S> GetAtom(Automaton <S> psi) { if (!IsAtomic) { throw new AutomataException(AutomataExceptionKind.BooleanAlgebraIsNotAtomic); } if (psi.IsEmpty) { return(psi); } var path = new List <S>(psi.ChoosePathToSomeFinalState(new Chooser())); var moves = new List <Move <S> >(); for (int i = 0; i < path.Count; i++) { moves.Add(Move <S> .Create(i, i + 1, solver.GetAtom(path[i]))); } var atom = Automaton <S> .Create(solver, 0, new int[] { path.Count }, moves); return(atom); }
static string GetMember(Z3Provider z3p, Automaton<Expr> C) { //z3p.Chooser.RandomSeed = 123; var sExpr = new List<Expr>(C.ChoosePathToSomeFinalState(z3p.Chooser)).ToArray(); string s = new String(Array.ConvertAll(sExpr, m => z3p.GetCharValue(z3p.MainSolver.FindOneMember(m).Value))); return s; }
/// <summary> /// Choose a path of symbolic terms from the initial state to some final state. /// Uses Solver.Chooser to control the random choices. /// </summary> public IEnumerable <TERM> ChoosePathToSomeFinalState() { return(automaton.ChoosePathToSomeFinalState(Solver.Chooser)); }