예제 #1
0
 def testPodeObterUmEstadoAPartirDoSeuNome(self):
   estado_q0 = Estado('q0', set([Transicao('a', 'q0')]), True, False)
   estado_q1 = Estado('q1', set([Transicao('b', 'q0')]), False, True)
   automato = AutomatoFinito( alfabeto = set(['a', 'b']),
                              estados  = set([estado_q0,estado_q1]))
   self.assertEqual(estado_q0, automato.obterEstado('q0'))
   self.assertEqual(estado_q1, automato.obterEstado('q1'))
예제 #2
0
 def testSabeQuaisSaoSeusEstadosMortos(self):
   alfabeto = set(['a', 'b'])
   estados = set()
   estado_morto = Estado('q2', set([Transicao('a', 'q2'), Transicao('b', 'q2')]), False, False) 
   estados.add(Estado('q0', set([Transicao('a', 'q1')]), True, True))
   estados.add(Estado('q1', set([Transicao('a', 'q0'), Transicao('b', 'q2')]), False, False))
   estados.add(estado_morto)
   automato = AutomatoFinito(alfabeto, estados)
   self.assertEqual(1, len(automato.obterEstadosMortos()))
   self.assertTrue(estado_morto in automato.obterEstadosMortos())
예제 #3
0
 def testSabeQuaisSaoSeusEstadosInalcancaveis(self):
   alfabeto = set(['a'])
   estados = set()
   estado_inalcancavel = Estado('q2', set([Transicao('a', 'q1')]), False, False) 
   estados.add(Estado('q0', set([Transicao('a', 'q1')]), True, True))
   estados.add(Estado('q1', set([Transicao('a', 'q0')]), False, False))
   estados.add(estado_inalcancavel)
   automato = AutomatoFinito(alfabeto, estados)
   self.assertEqual(1, len(automato.obterEstadosInalcancaveis()))
   self.assertTrue(estado_inalcancavel in automato.obterEstadosInalcancaveis())
예제 #4
0
 def construirAutomatoB(self):
   self.alfabeto_automato_b = set(['b', 'c'])
 
   self.estado_inicial_b = Estado('q1', 
                                   set([Transicao('b', 'q0'), Transicao('c', 'q2')]), 
                                   True, False)
   
   self.estados_finais_automato_b = set()
   self.estados_finais_automato_b.add(Estado('q2', set([Transicao('b', 'q2')]), False, True))    
   
   self.estados_automato_b = set()
   self.estados_automato_b.add(Estado('q0', set([Transicao('c', 'q0'), Transicao('c', 'q1'), Transicao('b', 'q2')]), False, False))
   self.estados_automato_b.add(self.estado_inicial_b)
   [self.estados_automato_b.add(estado) for estado in self.estados_finais_automato_b]
   
   self.automato_nao_det = AutomatoFinito(self.alfabeto_automato_b, self.estados_automato_b)
예제 #5
0
 def construirAutomatoA(self):
   self.alfabeto_automato_a = set(['a', 'b', 'c'])    
   self.estado_inicial_a = Estado('q0', 
                                   set([Transicao('a', 'q1'), Transicao('b', 'q0'), Transicao('c', 'q2')]), 
                                   True, False)
       
   self.estados_finais_automato_a = set()
   self.estados_finais_automato_a.add(Estado('q2', set([Transicao('a', 'q2')]), False, True))
   self.estados_finais_automato_a.add(Estado('q3', set([Transicao('b', 'q3')]), False, True))
   
   self.estados_automato_a = set()
   self.estados_automato_a.add(self.estado_inicial_a)
   [self.estados_automato_a.add(estado) for estado in self.estados_finais_automato_a]
   self.estados_automato_a.add(Estado('q1', 
                                      set([Transicao('a', 'q2'), Transicao('b', 'q3')]), 
                                      False, False))
   
   self.automato_det = AutomatoFinito(self.alfabeto_automato_a, self.estados_automato_a)
예제 #6
0
class TesteAutomatoFinito(unittest.TestCase):

  def construirAutomatoA(self):
    self.alfabeto_automato_a = set(['a', 'b', 'c'])    
    self.estado_inicial_a = Estado('q0', 
                                    set([Transicao('a', 'q1'), Transicao('b', 'q0'), Transicao('c', 'q2')]), 
                                    True, False)
        
    self.estados_finais_automato_a = set()
    self.estados_finais_automato_a.add(Estado('q2', set([Transicao('a', 'q2')]), False, True))
    self.estados_finais_automato_a.add(Estado('q3', set([Transicao('b', 'q3')]), False, True))
    
    self.estados_automato_a = set()
    self.estados_automato_a.add(self.estado_inicial_a)
    [self.estados_automato_a.add(estado) for estado in self.estados_finais_automato_a]
    self.estados_automato_a.add(Estado('q1', 
                                       set([Transicao('a', 'q2'), Transicao('b', 'q3')]), 
                                       False, False))
    
    self.automato_det = AutomatoFinito(self.alfabeto_automato_a, self.estados_automato_a)
    
  def construirAutomatoB(self):
    self.alfabeto_automato_b = set(['b', 'c'])
  
    self.estado_inicial_b = Estado('q1', 
                                    set([Transicao('b', 'q0'), Transicao('c', 'q2')]), 
                                    True, False)
    
    self.estados_finais_automato_b = set()
    self.estados_finais_automato_b.add(Estado('q2', set([Transicao('b', 'q2')]), False, True))    
    
    self.estados_automato_b = set()
    self.estados_automato_b.add(Estado('q0', set([Transicao('c', 'q0'), Transicao('c', 'q1'), Transicao('b', 'q2')]), False, False))
    self.estados_automato_b.add(self.estado_inicial_b)
    [self.estados_automato_b.add(estado) for estado in self.estados_finais_automato_b]
    
    self.automato_nao_det = AutomatoFinito(self.alfabeto_automato_b, self.estados_automato_b)
  
  
  def setUp(self):
    self.construirAutomatoA()
    self.construirAutomatoB()
    
  def testSabeQuaisSaoSeusEstados(self):
    estados_a = self.automato_det.obterEstados()
    self.assertEqual(estados_a, self.estados_automato_a) 
    
  def testSabeQuaisNaoSaoSeusEstados(self):
    estados_a = self.automato_det.obterEstados()
    self.assertNotEqual(estados_a, self.estados_automato_b) 
           
  def testSabeQuaisSaoSeusEstadosFinais(self):
    estados_a = self.automato_det.obterEstadosFinais()
    self.assertEqual(estados_a, self.estados_finais_automato_a)
  
  def testSabeQuaisNaoSaoSeusEstadosFinais(self):
    estados_a = self.automato_det.obterEstadosFinais()
    self.assertNotEqual(estados_a, self.estados_finais_automato_b) 
    
  def testSabeQualEhOSeuEstadoInicial(self):
    inicial = self.automato_det.obterEstadoInicial()
    self.assertEqual(inicial, self.estado_inicial_a)
  
  def testSabeQualNaoEhOSeuEstadoInicial(self):
    inicial = self.automato_det.obterEstadoInicial()
    self.assertNotEqual(inicial, self.estado_inicial_b)
    
  def testSabeQualEhOSeuAlfabeto(self):
    alfabeto = self.automato_det.obterAlfabeto()
    self.assertEqual(alfabeto, self.alfabeto_automato_a)
  
  def testSabeQualNaoEhOSeuAlfabeto(self):
    alfabeto = self.automato_det.obterAlfabeto()
    self.assertNotEqual(alfabeto, self.alfabeto_automato_b)
  
  def testSabeSeEhDeterministico(self):
    self.assertTrue(self.automato_det.ehDeterministico())
    
  def testSabeSeNaoEhDeterministico(self):
    self.assertFalse(self.automato_nao_det.ehDeterministico())
    
  def testRetornaUmaCopiaDoSeuConjuntoDeEstados(self):
    estados = self.automato_det.obterEstados()
    self.assertEqual(estados, self.automato_det.obterEstados())
    estados.pop()
    self.assertNotEqual(estados, self.automato_det.obterEstados())
    
  def testRetornaUmaCopiaDoSeuAlfabeto(self):
    alfabeto = self.automato_det.obterAlfabeto()
    self.assertEqual(alfabeto, self.automato_det.obterAlfabeto())
    alfabeto.pop()
    self.assertNotEqual(alfabeto, self.automato_det.obterAlfabeto())
    
  def testSeNaoPossuiEstadoInicialDisparaExcecaoErroConstruindoAF(self):
    self.assertRaises(ErroConstruindoAF,
                      AutomatoFinito,
                      alfabeto = set(['a', 'b']),
                      estados = set([Estado('q0', set([Transicao('a', 'q0')]), False, False)]))
    
  def testSePossuiMaisDeUmEstadoInicialDisparaExcecaoErroConstruindoAF(self):
    self.assertRaises(ErroConstruindoAF,
                      AutomatoFinito,
                      alfabeto = set(['a', 'b']),
                      estados = set([Estado('q0', set([Transicao('a', 'q0')]), True, False),
                                     Estado('q1', set([Transicao('b', 'q0')]), True, False)]))
    
  def testSeAlgumaTransicaoPossuiSimboloQueNaoPertenceAoAlfalbetoDisparaExcecaoErroConstruindoAF(self):
    self.assertRaises(ErroConstruindoAF,
                      AutomatoFinito,
                      alfabeto = set(['a', 'b']),
                      estados = set([Estado('q0', set([Transicao('c', 'q0')]), True, True)]))
    
  def testSeAlgumaTransicaoPossuiEstadoDestinoQueNaoPertenceAoConjuntoDeEstadosDisparaExcecaoErroConstruindoAF(self):
    self.assertRaises(ErroConstruindoAF,
                      AutomatoFinito,
                      alfabeto = set(['a', 'b']),
                      estados = set([Estado('q0', set([Transicao('a', 'q1')]), True, True)]))
    
  def testPodeObterUmEstadoAPartirDoSeuNome(self):
    estado_q0 = Estado('q0', set([Transicao('a', 'q0')]), True, False)
    estado_q1 = Estado('q1', set([Transicao('b', 'q0')]), False, True)
    automato = AutomatoFinito( alfabeto = set(['a', 'b']),
                               estados  = set([estado_q0,estado_q1]))
    self.assertEqual(estado_q0, automato.obterEstado('q0'))
    self.assertEqual(estado_q1, automato.obterEstado('q1'))
    
  def testSeNaoExisteEstadoComNomeInformadoRetornaNone(self):
    estado_q0 = Estado('q0', set([Transicao('a', 'q0')]), True, False)
    automato = AutomatoFinito( alfabeto = set(['a', 'b']),
                               estados  = set([estado_q0]))
    self.assertEqual(None, automato.obterEstado('q1'))
    
  def testTransicaoPossuiRepresentacaoComoString(self):
    estado_q0 = Estado('q0', set([Transicao('a', 'q0')]), True, False)
    self.assertEqual(str(AutomatoFinito( alfabeto = set(['a', 'b']), estados  = set([estado_q0]))), 
                     str(AutomatoFinito( alfabeto = set(['a', 'b']), estados  = set([estado_q0]))))
    
  def testSabeSeEhCompleto(self):
    self.assertTrue(construirAFDCompleto().ehCompleto())
  
  def testSabeSeEhImcompleto(self):
    self.assertFalse(construirAFDImcompleto().ehCompleto())
    
  def testSabeQuaisSaoSeusEstadosInalcancaveis(self):
    alfabeto = set(['a'])
    estados = set()
    estado_inalcancavel = Estado('q2', set([Transicao('a', 'q1')]), False, False) 
    estados.add(Estado('q0', set([Transicao('a', 'q1')]), True, True))
    estados.add(Estado('q1', set([Transicao('a', 'q0')]), False, False))
    estados.add(estado_inalcancavel)
    automato = AutomatoFinito(alfabeto, estados)
    self.assertEqual(1, len(automato.obterEstadosInalcancaveis()))
    self.assertTrue(estado_inalcancavel in automato.obterEstadosInalcancaveis())
  
  
  def testSeNaoPossuiEstadosInalcancaveisRetornaUmConjuntoVazio(self):
    automato = construirAFDSemEstadosMortosOuInalcancaveis()
    self.assertEqual(set(), automato.obterEstadosInalcancaveis())
    
  def testSabeQuaisSaoSeusEstadosMortos(self):
    alfabeto = set(['a', 'b'])
    estados = set()
    estado_morto = Estado('q2', set([Transicao('a', 'q2'), Transicao('b', 'q2')]), False, False) 
    estados.add(Estado('q0', set([Transicao('a', 'q1')]), True, True))
    estados.add(Estado('q1', set([Transicao('a', 'q0'), Transicao('b', 'q2')]), False, False))
    estados.add(estado_morto)
    automato = AutomatoFinito(alfabeto, estados)
    self.assertEqual(1, len(automato.obterEstadosMortos()))
    self.assertTrue(estado_morto in automato.obterEstadosMortos())
  
  def testSeNaoPossuiEstadosMortosRetornaUmConjuntoVazio(self):
    automato = construirAFDSemEstadosMortosOuInalcancaveis()
    self.assertEqual(set(), automato.obterEstadosMortos())
    
  def testSabeQuaisSaoSeusClassesDeEquivalencia(self):
    ce_afd, afd = construirAFDComCincoEstadosETresClassesDeEquivalencia()
    conjuntos_equivalencia = afd.obterClassesDeEquivalencia()
    self.assertEqual(5, len(afd.obterEstados()))
    self.assertEqual(3, len(conjuntos_equivalencia))
    self.assertEqual(ce_afd.sort(), conjuntos_equivalencia.sort())
    
  def testSabeSeNaoEhMinimo(self):
    self.assertFalse(construirAFDNaoMinimo().ehMinimo())
    
  def testSabeSeEhMinimo(self):
    self.assertTrue(construirAFDMinimo().ehMinimo())
    
  def testSeTentarObterClassesDeEquivalenciaDeUmAFNDDisparaUmaExcecaoDeOperacaoIlegal(self):
    afnd = construirAFND()
    self.assertRaises(AFOperacaoIlegal, afnd.obterClassesDeEquivalencia)
  
  def testSeTentarObterClassesDeEquivalenciaDeUmAFDImcompletoDisparaUmaExcecaoDeOperacaoIlegal(self):
    afd_imcompleto = construirAFDImcompleto()
    self.assertRaises(AFOperacaoIlegal, afd_imcompleto.obterClassesDeEquivalencia)
    
  def testSeUmAFDPossuiApenasUmEstadoEleJaEhMinimo(self):
    afd = construirAFDQueGeraEpsilon()
    self.assertTrue(afd.ehMinimo())
    
  def testAFNDNaoReconhecePalavra(self):
    afnd = construirAFND()
    self.assertRaises(AFOperacaoIlegal, afnd.reconhecePalavra, 'qualquer')
    
  def testSabeSeReconheceUmaPalavra(self):
    afd = construirAFDComABOndeAsEhPar()
    self.assertTrue(afd.reconhecePalavra('bbbb'))
    self.assertTrue(afd.reconhecePalavra('abbbba'))
    self.assertTrue(afd.reconhecePalavra('ababb'))
    self.assertTrue(afd.reconhecePalavra('babba'))
    self.assertTrue(afd.reconhecePalavra('babab'))
  
  def testSabeSeNaoReconheceUmaPalavra(self):
    afd = construirAFDComABOndeAsEhPar()
    self.assertFalse(afd.reconhecePalavra('babb'))
    self.assertFalse(afd.reconhecePalavra('abbabba'))
    self.assertFalse(afd.reconhecePalavra('abaaaa'))
    self.assertFalse(afd.reconhecePalavra('bbba'))
    self.assertFalse(afd.reconhecePalavra('abbb'))
  
  def testSabeSeReconheceEpsilon(self):
    afd = construirAFDComABOndeAsEhPar()
    self.assertTrue(afd.reconhecePalavra(EPSILON))
    
  def testSabeSeNaoReconheceEpsilon(self):
    afd = construirAFDComABOndeBsEhImpar()
    self.assertFalse(afd.reconhecePalavra(EPSILON))
예제 #7
0
 def testSeNaoExisteEstadoComNomeInformadoRetornaNone(self):
   estado_q0 = Estado('q0', set([Transicao('a', 'q0')]), True, False)
   automato = AutomatoFinito( alfabeto = set(['a', 'b']),
                              estados  = set([estado_q0]))
   self.assertEqual(None, automato.obterEstado('q1'))