Exemplo n.º 1
0
    def testEmptyClosure(self):
        nfa = NFA('01')

        s0 = nfa.new_state(initial=True)

        closure = nfa.closure(s0)
        self.assertIn(s0, closure, "Closure start state should be in closure")
Exemplo n.º 2
0
    def setUp(self):
        """
        Define one NFA a that accept all strings in the regular language '00*1'
        Define a second NFA accepting all string in the regular language '11*0'
        """
        fa = NFA('01')
        sa0 = fa.new_state(initial=True, name='sa0')
        sa1 = fa.new_state(name='sa1')
        sa2 = fa.new_state(final=True, name='sa2')

        fa.new_edge(sa0, '0', sa1)
        fa.new_edge(sa1, '0', sa1)
        fa.new_edge(sa1, '1', sa2)

        self.assertTrue(fa.test_input('01'), 'String "01" not accepted')
        self.assertFalse(fa.test_input('00'), 'String "00" not rejected')

        fb = NFA('01')
        sb0 = fb.new_state(initial=True, name='sb0')
        sb1 = fb.new_state(name='sb1')
        sb2 = fb.new_state(final=True, name='sb2')

        fb.new_edge(sb0, '1', sb1)
        fb.new_edge(sb1, '1', sb1)
        fb.new_edge(sb1, '0', sb2)

        self.assertTrue(fb.test_input('10'), 'String "10" not accepted')
        self.assertFalse(fb.test_input('11'), 'String "11" not rejected')

        self.nfa1 = fa
        self.nfa2 = fb
Exemplo n.º 3
0
    def testClosure(self):
        nfa = NFA('01')

        s0 = nfa.new_state(initial=True)
        s1 = nfa.new_state()
        s2 = nfa.new_state()
        s3 = nfa.new_state(final=True)
        s4 = nfa.new_state()

        nfa.new_edge(s0, '0', s1)
        nfa.new_edge(s0, Epsilon, s2)
        nfa.new_edge(s1, '0', s3)
        nfa.new_edge(s1, Epsilon, s4)
        nfa.new_edge(s2, '1', s2)
        nfa.new_edge(s2, Epsilon, s3)

        closure = nfa.closure(s0)
        self.assertIn(s0, closure, "Closure start state s0 should be in closure")
        self.assertNotIn(s1, closure, "State s1 should not be in closure")
        self.assertIn(s2, closure, "State s2 not in closure")
        self.assertIn(s3, closure, "State s3 not in closure")
        self.assertNotIn(s4, closure, "State s4 should not be in closure")
Exemplo n.º 4
0
class TestSimpleDFA(unittest.TestCase):
    def setUp(self):
        self.fa = NFA('012')

    def test_instantiation(self):
        self.assertFalse(self.fa.no_of_states, 'States not empty at start')

    def test_add_state(self):
        """Newly created state should not have any transitions"""
        sid = self.fa.new_state()
        for s, p in self.fa.get_edges_from_state(sid).items():
            self.assertFalse(p, 'Found edge ({}, {}) in newly added state {}'.format(s, p, sid))

    def test_edge(self):
        fa = self.fa
        sid = fa.new_state()
        fa.new_edge(sid, '0', sid)
        edges = fa.get_edges_from_state(sid)
        q = edges['0']
        self.assertTrue(sid in q, 'Expected edge not found in {} for state {}'.format(q, sid))
        self.assertTrue(q - {sid} == set(), 'Unexpected edges found in {} for state {}'.format(q, sid))

    def test_has_edge(self):
        fa = self.fa
        s0 = fa.new_state()
        s1 = fa.new_state()
        s2 = fa.new_state()
        self.assertFalse(fa.has_edge(s0, s0), 'Should not have an edge s0->s0')
        self.assertFalse(fa.has_edge(s0, s1), 'Should not have an edge s0->s1')
        self.assertFalse(fa.has_edge(s0, s2), 'Should not have an edge s0->s2')
        self.assertFalse(fa.has_edge(s1, s1), 'Should not have an edge s1->s1')
        self.assertFalse(fa.has_edge(s1, s2), 'Should not have an edge s1->s2')
        self.assertFalse(fa.has_edge(s1, s0), 'Should not have an edge s1->s0')
        self.assertFalse(fa.has_edge(s2, s2), 'Should not have an edge s2->s2')
        self.assertFalse(fa.has_edge(s2, s1), 'Should not have an edge s2->s1')
        self.assertFalse(fa.has_edge(s2, s0), 'Should not have an edge s2->s0')

        fa.new_edge(s0, '0', s1)
        self.assertFalse(fa.has_edge(s0, s0), 'Should not have an edge s0->s0')
        self.assertTrue(fa.has_edge(s0, s1), 'Should have an edge s0->s1')
        self.assertFalse(fa.has_edge(s0, s2), 'Should not have an edge s0->s2')
        self.assertFalse(fa.has_edge(s1, s1), 'Should not have an edge s1->s1')
        self.assertFalse(fa.has_edge(s1, s2), 'Should not have an edge s1->s2')
        self.assertFalse(fa.has_edge(s1, s0), 'Should not have an edge s1->s0')
        self.assertFalse(fa.has_edge(s2, s2), 'Should not have an edge s2->s2')
        self.assertFalse(fa.has_edge(s2, s1), 'Should not have an edge s2->s1')
        self.assertFalse(fa.has_edge(s2, s0), 'Should not have an edge s2->s0')
        fa.new_edge(s0, '1', s2)
        self.assertFalse(fa.has_edge(s0, s0), 'Should not have an edge s0->s0')
        self.assertTrue(fa.has_edge(s0, s1), 'Should have an edge s0->s1')
        self.assertTrue(fa.has_edge(s0, s2), 'Should have an edge s0->s2')
        self.assertFalse(fa.has_edge(s1, s1), 'Should not have an edge s1->s1')
        self.assertFalse(fa.has_edge(s1, s2), 'Should not have an edge s1->s2')
        self.assertFalse(fa.has_edge(s1, s0), 'Should not have an edge s1->s0')
        self.assertFalse(fa.has_edge(s2, s2), 'Should not have an edge s2->s2')
        self.assertFalse(fa.has_edge(s2, s1), 'Should not have an edge s2->s1')
        self.assertFalse(fa.has_edge(s2, s0), 'Should not have an edge s2->s0')
        fa.new_edge(s0, '1', s0)
        self.assertTrue(fa.has_edge(s0, s0), 'Should have an edge s0->s0')
        self.assertTrue(fa.has_edge(s0, s1), 'Should have an edge s0->s1')
        self.assertTrue(fa.has_edge(s0, s2), 'Should have an edge s0->s2')
        self.assertFalse(fa.has_edge(s1, s1), 'Should not have an edge s1->s1')
        self.assertFalse(fa.has_edge(s1, s2), 'Should not have an edge s1->s2')
        self.assertFalse(fa.has_edge(s1, s0), 'Should not have an edge s1->s0')
        self.assertFalse(fa.has_edge(s2, s2), 'Should not have an edge s2->s2')
        self.assertFalse(fa.has_edge(s2, s1), 'Should not have an edge s2->s1')
        self.assertFalse(fa.has_edge(s2, s0), 'Should not have an edge s2->s0')
        fa.new_edge(s1, '0', s1)
        fa.new_edge(s1, '1', s0)
        fa.new_edge(s1, '1', s2)
        fa.new_edge(s2, '0', s0)
        self.assertTrue(fa.has_edge(s0, s0), 'Should have an edge s0->s0')
        self.assertTrue(fa.has_edge(s0, s1), 'Should have an edge s0->s1')
        self.assertTrue(fa.has_edge(s0, s2), 'Should have an edge s0->s2')
        self.assertTrue(fa.has_edge(s1, s1), 'Should have an edge s1->s1')
        self.assertTrue(fa.has_edge(s1, s2), 'Should have an edge s1->s2')
        self.assertTrue(fa.has_edge(s1, s0), 'Should have an edge s1->s0')
        self.assertFalse(fa.has_edge(s2, s2), 'Should not have an edge s2->s2')
        self.assertFalse(fa.has_edge(s2, s1), 'Should not have an edge s2->s1')
        self.assertTrue(fa.has_edge(s2, s0), 'Should have an edge s2->s0')

    def test_del_state(self):
        """Deleting a state should remove all edges to that state"""
        fa = self.fa
        s0 = fa.new_state()
        s1 = fa.new_state()
        s2 = fa.new_state()
        fa.new_edge(s0, '0', s1)
        fa.new_edge(s0, '1', s0)
        fa.new_edge(s0, '1', s2)
        fa.new_edge(s1, '0', s1)
        fa.new_edge(s1, '1', s0)
        fa.new_edge(s1, '1', s2)
        fa.new_edge(s2, '0', s0)

        fa.del_state(s0)
        self.assertEqual(fa.no_of_states, 2, 'Wrong number of states after delete ({})'.format(fa.no_of_states))
        edges = fa.get_edges_from_state(s1)
        self.assertFalse(s0 in [q for q in edges.values()], 'State {} remains a destination after delete')
        self.assertTrue(fa.has_edge_on_symbol(s1, '1', s2), 'Transition s1->s2 over 1 was deleted')
        self.assertFalse(fa.has_edge_on_symbol(s2, '0', s0), 'Transition s2->s0 over 1 not removed by delete')

    def test_process(self):
        fa = self.fa
        s0 = fa.new_state(initial=True, final=True)
        s1 = fa.new_state()

        fa.new_edge(s0, '0', s0)
        fa.new_edge(s0, '1', s1)
        fa.new_edge(s1, '0', s1)
        fa.new_edge(s1, '1', s0)

        vectors = {
            'accepting': [
                '0',
                '00',
                '000',
                '0110',
                '01010',
                '001100',
                '0011',
                '11000000',
                '11',
                '1111',
                '111111'],
            'rejecting': [
                '1',
                '01',
                '001',
                '10',
                '100',
                '111',
                '11111',
                '1111111',
            ]
        }

        for v in vectors['accepting']:
            self.assertTrue(fa.test_input(v), 'String "{}" was not accepted as it should'.format(v))

        for v in vectors['rejecting']:
            self.assertFalse(fa.test_input(v), 'String "{}" was not rejected as it should'.format(v))