public void CheckMinimization()
        {
            CharSetSolver solver = new CharSetSolver();
            var           moves  = new List <Move <BDD> >();

            moves.Add(new Move <BDD>(0, 1, solver.True));
            moves.Add(new Move <BDD>(1, 2, solver.True));
            var sfa1 = ThreeAutomaton <BDD> .Create(solver, 0, new int[] { 0 }, new int[] { 2 }, moves);

            var min = sfa1.Minimize(solver);

            Assert.IsTrue(min.StateCount == 4);
        }
        public void CheckComplement()
        {
            CharSetSolver solver = new CharSetSolver();
            var           moves  = new List <Move <BDD> >();

            moves.Add(new Move <BDD>(0, 1, solver.True));
            moves.Add(new Move <BDD>(1, 2, solver.True));
            var sfa = ThreeAutomaton <BDD> .Create(solver, 0, new int[] { 0 }, new int[] { 2 }, moves);

            var csfa = sfa.MkComplement();

            Assert.IsFalse(sfa.GetBiggestLanguageSFA().Intersect(csfa.GetBiggestLanguageSFA(), solver).IsEmpty);
            Assert.IsTrue(sfa.GetSmallestLanguageSFA().Intersect(csfa.GetSmallestLanguageSFA(), solver).IsEmpty);
        }
        public void CheckBigSmall()
        {
            CharSetSolver solver = new CharSetSolver();
            var           moves  = new List <Move <BDD> >();

            moves.Add(new Move <BDD>(0, 1, solver.True));
            moves.Add(new Move <BDD>(1, 2, solver.True));
            var sfa = ThreeAutomaton <BDD> .Create(solver, 0, new int[] { 0 }, new int[] { 2 }, moves);

            var big   = sfa.GetBiggestLanguageSFA();
            var small = sfa.GetSmallestLanguageSFA();

            Assert.IsTrue(small.Minus(big, solver).IsEmpty);
            Assert.IsFalse(big.Minus(small, solver).IsEmpty);
        }
        public void CheckEquivalence()
        {
            CharSetSolver solver = new CharSetSolver();
            var           moves  = new List <Move <BDD> >();

            moves.Add(new Move <BDD>(0, 1, solver.True));
            moves.Add(new Move <BDD>(1, 2, solver.True));
            var sfa1 = ThreeAutomaton <BDD> .Create(solver, 0, new int[] { 0 }, new int[] { 2 }, moves);

            var c = solver.MkCharConstraint('c');

            moves = new List <Move <BDD> >();
            moves.Add(new Move <BDD>(0, 1, c));
            moves.Add(new Move <BDD>(1, 2, solver.True));
            moves.Add(new Move <BDD>(0, 3, solver.MkNot(c)));
            moves.Add(new Move <BDD>(3, 2, solver.True));
            var sfa2 = ThreeAutomaton <BDD> .Create(solver, 0, new int[] { 0 }, new int[] { 2 }, moves);

            Assert.IsTrue(sfa1.IsEquivalentWith(sfa2, solver));
        }
        public void CheckDeMorgan()
        {
            CharSetSolver solver = new CharSetSolver();
            var           moves  = new List <Move <BDD> >();
            var           c      = solver.MkCharConstraint('a');

            moves.Add(new Move <BDD>(0, 1, c));
            moves.Add(new Move <BDD>(1, 2, solver.True));
            var sfa1 = ThreeAutomaton <BDD> .Create(solver, 0, new int[] { 0 }, new int[] { 2 }, moves);


            moves = new List <Move <BDD> >();
            moves.Add(new Move <BDD>(0, 1, c));
            moves.Add(new Move <BDD>(1, 2, solver.True));
            moves.Add(new Move <BDD>(0, 3, solver.MkNot(c)));
            moves.Add(new Move <BDD>(3, 2, solver.True));
            var sfa2 = ThreeAutomaton <BDD> .Create(solver, 0, new int[] { 0 }, new int[] { 2 }, moves);

            var inters = sfa1.Intersect(sfa2, solver);
            var union  = sfa1.Union(sfa2, solver);

            var u2 = sfa1.MkComplement().Intersect(sfa1.MkComplement(), solver).MkComplement();
        }