def B():
    aut = automaton.automaton(
        epsilons=[],
        states=[0, 1, 2], initials=[0], finals=[0, 1],
        transitions=[(0, 'a', 2), (2, 'b', 0), (0, 'a', 1)])

    return aut
Exemple #2
0
def intersection(aut1, aut2):
    # On renome les etats des deux automates
    aut1.renumber_the_states()
    aut2.translate(aut1.get_maximal_id() + 1)

    aut = automaton.automaton()
    alphabet = aut1.get_alphabet()
    # On cree une liste pour mettre les couples de sommets traites et a traiter
    setStates = []
    # pour chaque etat initial de l'automate 1
    for s1 in aut1.get_initial_states():
        # pour chaque etat initial de l'automate 2
        for s2 in aut2.get_initial_states():
            # on ajoute les couple d'état initiaux
            setStates.append((s1, s2))
    # on parcours enfin notre liste de couples de sommets
    # pour chaque couple
    for S in setStates:
        # pour chaque lettre
        for lettre in alphabet:
            # on divise notre couple en deux
            sub_etat1 = list(S)[0]
            sub_etat2 = list(S)[1]
            # on cherche les etats d'arrives pour chaque partie de notre couple
            s1 = aut1.delta(lettre, [sub_etat1])
            s2 = aut2.delta(lettre, [sub_etat2])
            if s1:
                sub_stat1 = list(s1)[0]
            else:
                sub_stat1 = 0
            if s2:
                sub_stat2 = list(s2)[0]
            else:
                sub_stat2 = 0
            # on rajoute la transition du couple lu par la lettre en cours vers les sommets trouves
            aut.add_transition((S, lettre, (sub_stat1, sub_stat2)))
            # si l'etat/couple n'existe pas dans la liste, on le rajoute
            if (sub_stat1, sub_stat2) not in setStates:
                setStates.append((sub_stat1, sub_stat2))
        # on lit tous nos couples
        for S in aut.get_states():
            # on divise en deux
            sub_etat1 = list(S)[0]
            sub_etat2 = list(S)[1]
            # si les deux etats du couple sont respectivement etats finaux de leur automate
            if sub_etat1 in aut1.get_final_states():
                if sub_etat2 in aut2.get_final_states():
                    # on rajoute le couple en etat final
                    aut.add_final_state(S)
                    # on lit tous nos couples
        for S in aut.get_states():
            # on divise en deux
            sub_etat1 = list(S)[0]
            sub_etat2 = list(S)[1]
            # si les deux etats du couple sont respectivement etats initiaux de leur automate
            if sub_etat1 in aut1.get_initial_states():
                if sub_etat2 in aut2.get_initial_states():
                    # on rajoute le couple en etat initial
                    aut.add_initial_state(S)
    return aut
def A():
    aut = automaton.automaton(
        epsilons=[],
        states=[0, 1], initials=[0], finals=[0],
        transitions=[(0, 'a', 1), (1, 'b', 0)])

    return aut
Exemple #4
0
def main():
    automate = automaton.automaton(
        epsilons = [],
        states=['E','a1','a2','a3','a4','a5','b1','b2','b3','b4','b5'],initials=['E'],finals=['a3','b2','b5','a5'],
        transitions=[('E','a','a1'),('a1','a','a1'),('a1','a','a2'),('a1','b','b1'),('b1','b','b1'),('a2','b','b2'),('b1','a','a1'),('b1','a','a2'),('a2','a','a3'),('E','b','b1'),('E','a','a2'),('E','b','b4'),('E','b','b3'),('E','a','a4'),('a4','a','a4'),('a4','b','b3'),('b3','b','b3'),('b3','a','a4'),('b3','b','b4'),('a4','b','b4'),('b4','b','b5'),('b4','a','a5')])
    automate.display(title="Automate",wait=False)
    minimiser(automate).display(title="Minimise",wait=False)
Exemple #5
0
def automate ():
	alphabet = ['a' ,'b' ,'c' ,'d' ]
	epsilons = []
	initiaux = [(0 ,0)]
	etats = []
	finaux = []
	transitions = []
	for a_moins_b in [0, 1, -1]:
		for c_moins_d in [0, 1, -1]:
			etats.append((a_moins_b, c_moins_d))
			finaux.append((a_moins_b, c_moins_d))
	for origine in etats:
		for lettre in alphabet:
			if lettre == 'a' :
				fin = (origine[0]+1, origine[1])
			elif lettre == 'b' :
				fin = (origine[0]-1, origine[1])
			elif lettre == 'c' :
				fin = (origine[0], origine[1]+1)
			else :
				fin = (origine[0], origine[1]-1)
			if abs(fin[0]) <= 1 and abs(fin[1]) <= 1 :
				transitions.append((origine, lettre, fin))
	return automaton.automaton(
		alphabet, epsilons, etats, initiaux, finaux ,transitions
	)
def expression_vers_automate(E):
    # Bon, c'est parti !
    # Fonction récursive, on prend le premier élément, et on le traite puis on appele la fonction avec le reste de la liste. Mucho large complexidad
    #automate = automaton.automaton()
    #exprToAutRec(E)
    automate = automaton.automaton(initials=['Init'], finals=['Fin'])
    exprToAutRec(E, automate, 0)
    return automate
Exemple #7
0
def union(aut1, aut2):
    aut1.renumber_the_states()
    aut2.translate(aut1.get_maximal_id() + 1)
    aut = automaton.automaton()
    alphabet = aut1.get_alphabet()
    # On cree une liste pour mettre les couples de sommets traites et a traiter
    setStates = []
    # pour chaque etat initial de l'automate 1
    for s1 in aut1.get_initial_states():
        # on l'ajoute en tant que etat initial
        setStates.append((s1, 0))
    # pour chaque etat initial de l'automate 2
    for s2 in aut2.get_initial_states():
        # on l'ajoute en tant que etat initial
        setStates.append((0, s2))
    # pour chaque couple
    for S in setStates:
        # pour chaque lettre
        for lettre in alphabet:
            # on divise notre couple en deux
            sub_etat1 = list(S)[0]
            sub_etat2 = list(S)[1]
            # on cherche les etats d'arrives pour chaque partie de notre couple
            s1 = aut1.delta(lettre, [sub_etat1])
            s2 = aut2.delta(lettre, [sub_etat2])
            if s1:
                sub_stat1 = list(s1)[0]
            else:
                sub_stat1 = 0

            if s2:
                sub_stat2 = list(s2)[0]
            else:
                sub_stat2 = 0
            # si le couple ne mene nul part par aucun des deux sommet du couple
            if not (sub_stat1 == 0 and sub_stat2 == 0):
                aut.add_transition((S, lettre, (sub_stat1, sub_stat2)))
                # si l'etat/couple n'existe pas dans la liste, on le rajoute
                if (sub_stat1, sub_stat2) not in setStates:
                    setStates.append((sub_stat1, sub_stat2))
        # on lit tous nos couples
        for S in aut.get_states():
            # on divise notre couple en deux
            sub_etat1 = list(S)[0]
            sub_etat2 = list(S)[1]
            # si l'un des deux etats du couple est respectivement etat final de son automate
            if sub_etat1 in aut1.get_final_states() or sub_etat2 in aut2.get_final_states():
                # on rajoute le couple en etat final
                aut.add_final_state(S)
        for S in aut.get_states():
            # on divise notre couple en deux
            sub_etat1 = list(S)[0]
            sub_etat2 = list(S)[1]
            # si l'un des deux etats du couple est respectivement etat initial de son automate
            if sub_etat1 in aut1.get_initial_states() or sub_etat2 in aut2.get_initial_states():
                # on rajoute le couple en etat final
                aut.add_initial_state(S)
    return aut
Exemple #8
0
def BulletProcess(phone, content):
    db.execute('select * from b_screen where `phone`=%s', (phone, ))
    result = db.fetchone()
    userid = result[0]
    time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    db.execute(
        'insert into c_bullet (`time`, `content`,`userid`) values (%s, %s, %s)',
        (time, content, userid))
    ContentProcessed = automaton(content)
    return ContentProcessed
Exemple #9
0
def main():
    aut1 = automaton.automaton(
        epsilons=[],
        states=[0, 1], initials=[0], finals=[1],
        transitions=[(0, 'a', 1), (1, 'b', 0)])

    aut1.display()
    toto = mirror(aut1)

    toto.display()
Exemple #10
0
def complement(aut):
    """ Returns the complement of an automate """
    states = aut.get_states()
    finals = set()

    for state in states:
        if not aut.state_is_final(state):
            finals.add(state)

    return automaton.automaton(aut.get_alphabet(), aut.get_epsilons(), states,
                               aut.get_initial_states(), finals, aut.get_transitions())
Exemple #11
0
def main():
    aut = automaton.automaton(
        epsilons=[],
        states=[0, 1, 2, 3], initials=[0], finals=[1, 2],
        transitions=[(0, 'a', 1), (1, 'b', 0), (0, 'b', 2), (1, 'a', 2), (3, 'a', 2)])

    aut.display()

    aut.display(title="Automate origin", wait=False)
    toto = complement(aut)
    toto.display(title="Automate origin's complement", wait=False)
Exemple #12
0
def expression_vers_automate(E):
	"Cree un automate a partir d'une chaine de caractere."

	liste = list ()
	get_expression(E, liste)

	aut = automaton.automaton (
			epsilons = ['0']
		)

	alphabet = list()
	states = list()
	
	while len(liste) > 0 :
		cmpt = liste.pop()
		if not operator.count(cmpt):
			alphabet.append(cmpt)
			if not aut.get_maximal_id():
				i=0
			else:
				i = aut.get_maximal_id() 
				i+=1
			j=i+1	
			aut.add_transition( (i, cmpt, j) )
			states.append([i, j])
		else : 
			if cmpt == "+":
				states.append( plus(aut, states.pop(), states.pop()) )
			if cmpt == ".":
				states.append( produit(aut, states.pop(), states.pop()) )
			if cmpt == "*":
				states.append( star(aut, states.pop()) )

	aut = automaton.automaton(
		alphabet = alphabet,
		epsilons = ['0'],
		states = aut.get_states(), initials = aut.get_initial_states(), finals = aut.get_final_states(),
		transitions = aut.get_transitions()
	)

	return minimiser(aut)
Exemple #13
0
def miroir(aut):
    # on cree un nouvel automate avec les memes etats, le meme alphabet et on echange les etats finaux et initiaux
    aut2 = automaton.automaton(
        alphabet=aut.get_alphabet(),
        states=aut.get_states(),
        finals=aut.get_initial_states(),
        initials=aut.get_final_states(),
    )
    # pour toutes les transitions on echange leur sens
    for t in aut.get_transitions():
        aut2.add_transition((list(t)[2], list(t)[1], list(t)[0]))
    return aut2
def intersection_union(aut1, aut2, inter):
    """ Returns the intersection or the union of aut1 and aut2
    if inter == True, intersection function is done,
    else, union function is done..
    Expect that the automates are already complete (AND? deterministic)
    Their alphabet must be equals else it return None.
    """
    aut_res = automaton.automaton()

    if aut1.get_alphabet() != aut2.get_alphabet():
        return None

    alphabet_res = aut1.get_alphabet()
    stack = []

    print("initialisation à partir des états initiaux")
    for init_aut1 in aut1.get_initial_states():
        for init_aut2 in aut2.get_initial_states():
            init_state_res = (init_aut1, init_aut2)

            aut_res.add_initial_state(init_state_res)
            aut_res.add_state(init_state_res)

            stack += [init_state_res]

    while len(stack) > 0:
        print(stack)
        #current state
        state = stack.pop()

        for letter in alphabet_res:
            # Evite les liaisons inutiles sur un etat sur lui même.
            if not letter in aut1.get_epsilons():
                access_aut1 = list(aut1.delta(letter, [state[0]]))
                access_aut2 = list(aut2.delta(letter, [state[1]]))

                for al in access_aut1:
                    for ar in access_aut2:
                        new_state = (al, ar)

                        # Nouvel etat à gerer (et toutes les transitions ...)
                        if not aut_res.has_state(new_state):
                            stack += [new_state]
                            aut_res.add_state(new_state)

                        aut_res.add_transition(((state[0], state[1]), letter, new_state))

    new_finals_states(aut1, aut2, aut_res, inter)
    # Si 'pour l'intersection' il n'y a pas d'états finaux, alors l'automate est vide.
    if aut_res.get_final_states() != set():
        return aut_res
    else:
        return "Automate VIDE, (intersection)"
Exemple #15
0
def mirror(a):
    self = automaton.automaton(
        alphabet = a.get_alphabet(),
        epsilons = a.get_epsilons(),
        states = a.get_states(),
        initials = a.get_final_states(),
        finals = a.get_initial_states(),     
        )
    transitions = a.get_transitions()
    for t in transitions:
        self.add_transition((t[2], t[1], t[0]))
    return self
Exemple #16
0
def automate2():
       
    alphabet = ['a', 'b', 'c']
    epsilons = []
    states = ['X', 'Y', 'Z'] 
    initials = ['X','Z'] 
    finals = ['Z']
    transitions=[
    ('X','a','X'),('X','c','X'), ('X','b','Y'), ('Y','c','X'), ('Y','b','Y'), ('Y','a','Z'), ('Z','a','Z'), ('Z','c','Z'), ('Z','b','Z'),('X','a','Y')
    ]
    return automaton.automaton(
    alphabet, epsilons, states, initials, finals, transitions)
Exemple #17
0
def expression_vers_automate(E):
    # on utilise ici un algorithme recursif pour analyser chaque partie de l'expression une a une
    e = E[0]
    if e == "+":
        aut = union(expression_vers_automate(E[1][0]), expression_vers_automate(E[1][1]))
    if e == ".":
        aut = concatenation(expression_vers_automate(E[1]), expression_vers_automate(E[2]))
    if e == "*":
        aut = etoile(expression_vers_automate(E[1]))
    if e.isalpha():
        aut = automaton.automaton(epsilons=["0"], initials=[0], finals=[1], transitions=[(0, e, 1)])
    return aut
Exemple #18
0
def mirror(aut):
    """ Returns the mirror of an automate """
    transitions = []
    transitions_aut = aut.get_transitions()

    for transition in transitions_aut:
        transitions += [(transition[2], transition[1], transition[0])]

    initial_states = aut.get_final_states()
    final_states = aut.get_initial_states()

    return automaton.automaton(aut.get_alphabet(), aut.get_epsilons(), aut.get_states(),
                               initial_states, final_states, transitions)
Exemple #19
0
def main():
    aut = automaton.automaton(
        epsilons=[],
        states=[0, 1, 2, 3],
        initials=[0],
        finals=[1, 2],
        transitions=[(0, "a", 1), (1, "b", 0), (0, "b", 2), (3, "a", 2)],
    )

    aut.display(title="Automate origin", wait=False)

    toto = complete(aut)
    toto.display(title="Automate origin's completed", wait=False)
Exemple #20
0
def main():
    #automate = automaton.automaton(
    #    epsilons=[],
    #    states=[0, 1], initials=[0], finals=[1],
    #    transitions=[(0, 'a', 1), (1, 'b', 0)])
    automate3 = automaton.automaton(
        epsilons = [],
        states=['E','a1','a2','a3','a4','a5','b1','b2','b3','b4','b5'],initials=['E'],finals=['a3','b2','b5','a5'],
        transitions=[('E','a','a1'),('a1','a','a1'),('a1','a','a2'),('a1','b','b1'),('b1','b','b1'),('a2','b','b2'),('b1','a','a1'),('b1','a','a2'),('a2','a','a3'),('E','b','b1'),('E','a','a2'),('E','b','b4'),('E','b','b3'),('E','a','a4'),('a4','a','a4'),('a4','b','b3'),('b3','b','b3'),('b3','a','a4'),('b3','b','b4'),('a4','b','b4'),('b4','b','b5'),('b4','a','a5')])

    automate3.display(title="Automate", wait=False)
    automate4 = determiniser(automate3)
    automate4.display(title="Determinise", wait=False)
Exemple #21
0
def automate():
    
    alphabet = ['a', 'b']
    epsilons = []
    states = [0,1, 2,3,4,5,6] 
    initials = [0] 
    finals = [0,3,4,6,7]
    transitions=[
    (0,'a',2), (0,'b',1), (1,'b',1), (1,'a',2), (2,'b',2), (2,'a',3),
    (3,'a',2), (3,'b',6), (7,'b',3), (6,'b',7), (6,'a',5), (5,'a',6),
    (5,'b',5), (7,'a',5), (4,'a',5), (4,'b',4), (2,'b',2)
    ]
    return automaton.automaton(
    alphabet, epsilons, states, initials, finals, transitions
    )
Exemple #22
0
def determinisation(aut):
    # on renome les etats de l'automate pour que ca soit plus simple
    aut.renumber_the_states()
    aut2 = automaton.automaton()
    setStates = []
    # pour chaque etat initial de l'automate
    for i in aut.get_initial_states():
        # on l'ajoute a notre set a parcourir
        setStates.append(i)
    # on freeze l'etat pour pouvoir le rajouter
    initialState = frozenset(setStates)
    aut2.add_initial_state(initialState)
    setStates = [setStates]
    alphabet = aut.get_alphabet()
    # pour chacun de nos etat a parcourir
    for S in setStates:
        # pour chaque lettre
        for lettre in alphabet:
            tmpState = list()
            # pour chaque partie de notre etat (dans le cas d'un couple, liste ..)
            for s in S:
                myDelta = aut.delta(lettre, [s])
                # pour chaque sommet d'arrive par la lettre en cours
                for i in myDelta:
                    # on le rajoute a un set temporaire
                    tmpState.append(i)
            newS2 = frozenset(S)
            # qu'on gele
            tmpState2 = frozenset(tmpState)
            if tmpState2 != frozenset():
                # pour le rajouter en tant que etat d'arrive de la nouvelle transistion cree.
                aut2.add_transition((newS2, lettre, tmpState2))
            # si l'etat d'arrive n'exite pas dans notre liste a parcourir
            if tmpState not in setStates:
                # alors on le rajoute
                setStates.append((tmpState))
    # pour chaque etat du nouvel automate
    for S in aut2.get_states():
        # pour chaque partie de l'etat
        for s in S:
            # si il est etat final dans le premier automate
            if s in aut.get_final_states():
                # alors on le rajoute a nos etats finaux du nouvel automate
                aut2.add_final_state(S)
                break
    return aut2
Exemple #23
0
def union_intersection_aux(auto1, auto2):
    
    self = automaton.automaton()
    transitions1 = auto1.get_transitions()
    transitions2 = auto2.get_transitions()
    
    for t1 in transitions1:
        for t2 in transitions2:
            if t1[1] == t2[1]:
                self.add_transition(((t1[0], t2[0]), t1[1] ,(t1[2], t2[2])))
                if not(self.has_state((t1[0], t2[0]))):
                    self.add((t1[0], t2[0]))
                if not(self.has_state((t1[2], t2[2]))):
                    self.add((t1[2], t2[2]))
                if auto1.state_is_initial(t1[0]) and auto2.state_is_initial(t2[0]):
                    self.add_initial_state((t1[0], t2[0]))
    return self
Exemple #24
0
def determiniser(aut):
    """Retourne un automate déterminisé de l'automate passé en paramètre"""
    #etats = aut.get_states()
    alphabet = aut.get_alphabet()
    #contient les états à traiter
    pile = []
    #contient les états déjà traités
    traites = []
    #contient le graph résultat que l'on construit au fur et à mesure
    resultat = automaton.automaton(alphabet=alphabet)

    #En premier, on crée l'état initial à partir de tous les états initiaux
    etatInitial = tuple(aut.get_initial_states())

    #Et on l'ajoute au graphe
    resultat.add_initial_state(tuple(etatInitial))

    #Et à la pile, car il faut traiter les transitions
    pile += [etatInitial]

    #Tant que la pile a un état à traiter
    for etatCourant in pile:
        for letter in alphabet:
            hasFinalState = False
            delta = list(aut.delta(letter, etatCourant))

            #On regarde s'il y a un état final dans le lot
            for etatTmp in delta:
                if aut.state_is_final(etatTmp):
                    hasFinalState = True
            nouvelEtat = tuple(delta)

            if len(delta) > 0:
                if delta != etatCourant:
                    resultat.add_state(nouvelEtat)
                    resultat.add_transition((tuple(etatCourant), letter, nouvelEtat))
                else:
                    resultat.add_transition((tuple(etatCourant), letter, tuple(etatCourant)))
            traites += [etatCourant]

            #Si il y a un final, on passe l'etat en final
            if hasFinalState:
                resultat.add_final_state(nouvelEtat)
            if nouvelEtat not in traites:
                pile += [nouvelEtat]
    return resultat
Exemple #25
0
def etoile(aut):
    # on cree un nouvel automate avec les memes etats, les memes transitions et le meme alphabet
    aut2 = automaton.automaton(alphabet=aut.get_alphabet(), states=aut.get_states(), transitions=aut.get_transitions())
    # on rajoute un super etat final et un super final
    aut2.add_initial_state("I")
    aut2.add_final_state("F")
    # on rajoute des etats de transitions
    aut2.add_states(["i", "f"])
    # on rajoute les epsilons transitions entre les etats qu'on vient de rajouter
    aut2.add_transitions([("I", "0", "i"), ("I", "0", "F"), ("f", "0", "F"), ("f", "0", "i")])
    # on rajoute les epsilons transition entre l'etats i et les etats initiaux de l'automate de depart
    for i in aut.get_initial_states():
        aut2.add_transition(("i", "0", i))
    # on rajoute les epsilons transition entre l'etats f et les etats finaux de l'automate de depart
    for f in aut.get_final_states():
        aut2.add_transition((f, "0", "f"))
    return aut2
Exemple #26
0
def automate_des_mots_contenant_l_alphabet(alphabet):
	initiaux = [automaton.pretty_set()]
	epsilons = []
	finaux = [automaton.pretty_set(alphabet )]
	etats = set(automaton.pretty_set () )
	pile = [automaton.pretty_set () ]
	transitions = []
	while len (pile) > 0:
		origine = pile.pop ()
		for lettre in alphabet :
			fin = origine.union ([lettre])
			if not (fin in etats):
				etats.add (fin)
				pile.append(fin)
			transitions.append ((origine, lettre, fin))
	return automaton.automaton(
		alphabet , epsilons , etats , initiaux , finaux , transitions
	)
Exemple #27
0
def complement(aut):
    # on determinise et complete l'automate
    aut = determinisation(aut)
    aut = completer(aut)
    # on affiche l'automate apres ces deux etapes
    aut.display("Automate de depart determinise et complete")
    # on cree un nouvel automate avec le meme alphabet, les memes etats (les initiaux reste initiaux), les memes transitions
    aut2 = automaton.automaton(
        alphabet=aut.get_alphabet(),
        states=aut.get_states(),
        transitions=aut.get_transitions(),
        initials=aut.get_initial_states(),
    )
    # Tout les etats qui ne sont pas finaux (sauf le puit) deviennent finaux dans le nouvel automate
    for s in aut.get_states():
        if s not in (aut.get_final_states()) and s != "P":
            aut2.add_final_state(s)
    return aut2
Exemple #28
0
def miroir(aut):
	"Inverse le sens des transitions et inverse les etats finaux et initaux d'un automate."

	i = 0
	new_transitions = []
	transitions = list(aut.get_transitions())

	while i < len(transitions):
		new_transitions.append((transitions[i][2], transitions[i][1], transitions[i][0]))
		i+=1

	aut_mirror = automaton.automaton (
		alphabet = aut.get_alphabet(),
		epsilons = aut.get_epsilons(),
		states = aut.get_states() , initials = aut.get_final_states() , finals = aut.get_initial_states(),
		transitions = new_transitions
	)

	return aut_mirror
Exemple #29
0
def determinisation(aut):
	"Determinise un automate."

	alphabet = list(aut.get_alphabet())
	initials_states = aut.get_initial_states()
	final_states = aut.get_final_states()

	file_sommet = [initials_states]
	liste_nouveaux_sommet = [initials_states]

	liste_transitions = []

	while len(file_sommet) != 0:
		for i in alphabet:
			if aut.delta(i, file_sommet[0]):
				sommet = aut.delta(i, file_sommet[0])
				liste_transitions += [(file_sommet[0], i, sommet)]
				if not sommet in liste_nouveaux_sommet:
					liste_nouveaux_sommet += [sommet]
					file_sommet += [sommet]
		file_sommet.pop(0)

	final = []
	for i in liste_nouveaux_sommet:
		for j in i:
			if j in final_states:
				final += [i]

	aut_deter = automaton.automaton (
		initials = [initials_states],
		finals = final,
		alphabet = alphabet,
		epsilons = aut.get_epsilons(),
		states = liste_nouveaux_sommet,
		transitions = liste_transitions
		)

	
	return aut_deter
Exemple #30
0
def uninter(aut1, aut2, type):
	"Effectue une union ou une intersection suivant la valeur de la variable type."

	alpha = list( aut1.get_alphabet() )

	aut = automaton.automaton ( 
		alphabet = alpha,
		epsilons = aut1.get_epsilons(),
	)

	states1 = list( aut1.get_states() )	
	states2 = list( aut2.get_states() )
	transitions1 = list( aut1.get_transitions() )
	transitions2 = list( aut2.get_transitions() )
	
	for i in range (len (alpha) ):
		for j in range (len (states1) ):
			for k in range (len (states2) ):
				tmp1 = list( aut1.delta( alpha[i], [states1[j]]) )
				tmp2 = list( aut2.delta( alpha[i], [states2[k]]) )
				if tmp1 and tmp2 :
					for l in range (len (tmp1)):
						for m in range (len (tmp2)):
							if not aut.has_state( (states1[j], states2[k]) ):
								aut.add_state((states1[j], states2[k]))

							if type:
								if aut1.state_is_final((states1[j])) or aut2.state_is_final((states2[k])):
									aut.add_final_state((states1[j], states2[k]))
							else :
								if aut1.state_is_final((states1[j])) and aut2.state_is_final((states2[k])):
									aut.add_final_state((states1[j], states2[k]))

							if aut1.state_is_initial((states1[j])) and aut2.state_is_initial((states2[k])):	
								aut.add_initial_state((states1[j], states2[k]))
							aut.add_transition( ((states1[j],states2[k]), alpha[i], (tmp1[l], tmp2[l]) ))
	return aut
Exemple #31
0
def concatenation(aut1, aut2):
    # on renome les etats des deux automates pour que ca soit plus simple
    aut1.renumber_the_states()
    aut2.translate(aut1.get_maximal_id() + 1)
    # on cree un nouvel automate avec les etats, les transitions et l'alphabet de l'automate 1
    aut3 = automaton.automaton(
        alphabet=aut1.get_alphabet(), states=aut1.get_states(), transitions=aut1.get_transitions()
    )
    # on ajoute l'alphabet, les transitions et les etats de l'automate 2
    aut3.add_characters(aut2.get_alphabet())
    aut3.add_states(aut2.get_states())
    aut3.add_transitions(aut2.get_transitions())
    # on cree un super etat initial et un super etat final
    aut3.add_initial_state("I")
    aut3.add_final_state("F")
    # on rajoute les epsilons transitions
    for i in aut1.get_initial_states():
        aut3.add_transition(("I", "0", i))
    for f in aut2.get_final_states():
        aut3.add_transition((f, "0", "F"))
    for f in aut1.get_final_states():
        for i in aut2.get_initial_states():
            aut3.add_transition((f, "0", i))
    return aut3