Finden Sie (deterministische endliche) direkte Produktautomaten in Python

Überblick

Finden Sie den direkten Produktautomaten. Verwenden Sie automata-lib, um deterministische endliche Automaten in Python zu verarbeiten.

pip install automata-lib

Ich habe auf den folgenden Artikel verwiesen. Implementierung eines deterministischen endlichen Automaten in Python zur Bestimmung von Vielfachen von 3

Umgebung

python 3.8 windows 10

Ich denke, dass alles im 3. System wahrscheinlich funktionieren wird.

Code

directproduct.py



from automata.fa.dfa import DFA

SYMBOL_FORMAT = lambda s0, s1 : f'({s0}, {s1})'

def directproduct(dfa0:DFA, dfa1:DFA) -> DFA:
    new_input_symbols : set = dfa0.input_symbols | dfa1.input_symbols
    new_initial_state : str = SYMBOL_FORMAT(dfa0.initial_state, dfa1.initial_state)
    new_final_state : set = set([SYMBOL_FORMAT(f0, f1) for f0 in list(dfa0.final_states) for f1 in list(dfa1.final_states)])

    new_states : set = set()
    new_trans : dict = {}
    for s0 in list(dfa0.states):
        for s1 in list(dfa1.states):
            state = SYMBOL_FORMAT(s0, s1)
            new_states.add(state)
            new_trans[state] = {
                s : SYMBOL_FORMAT(dfa0.transitions[s0][s], dfa1.transitions[s1][s]) for s in list(new_input_symbols)
            }
    
    return DFA(
        states = new_states,
        input_symbols = new_input_symbols,
        transitions = new_trans,
        initial_state = new_initial_state,
        final_states = new_final_state
    )

def main():
    #Automat, der ein Vielfaches von 3 akzeptiert
    modulo_three = DFA(
        states = {'a', 'b', 'c'},
        input_symbols = {'0', '1'},
        transitions = {
            'a': {'0': 'a', '1': 'b'},
            'b': {'0': 'c', '1': 'a'},
            'c': {'0': 'b', '1': 'c'}
        },
        initial_state = 'a',
        final_states = {'a'}
    )
    #Automat, der ein Vielfaches von 2 akzeptiert
    modulo_two = DFA(
        states = {'d', 'e'},
        input_symbols = {'0', '1'},
        transitions = {
            'd' : {'0' : 'd', '1' : 'e'},
            'e' : {'0' : 'd', '1' : 'e'}
        },
        initial_state = 'd',
        final_states = {'d'}
    )
    #Akzeptiere Vielfache von 2 und 3=Automat, der ein Vielfaches von 6 akzeptiert
    modulo_six = directproduct(modulo_three, modulo_two)

    print('Input number > ', end='')
    num : int = int(input())
    entry : str = format(num, 'b')
    if modulo_six.accepts_input(entry):
        print("Result: Accepted")
    else:
        print("Result: Rejected")

if __name__ == '__main__':
    main()

Ein kleiner Kommentar

Die Funktion SYMBOL_FORMAT definiert Statusbenennungskonventionen. Die Direktproduktfunktion ist das Hauptmerkmal dieses Artikels. Es ist so einfach wie die Berechnung jedes Parameters wie definiert. Ich würde gerne wissen, ob es den schnellsten Algorithmus gibt.

Die Hauptfunktion wird ausgeführt, indem der direkte Produktautomat "Automat, der Vielfache von 6 akzeptiert" aus "Automat, der Vielfache von 3 akzeptiert" und "Automat, der Vielfache von 2 akzeptiert" ermittelt wird.

Ausführungsbeispiel

Input number > 18
Result: Accepted

Da 18 ein Vielfaches von 6 ist, wird es akzeptiert.

Input number > 15
Result: Rejected

15 ist kein Vielfaches von 6 und wird nicht akzeptiert.

Recommended Posts

Finden Sie (deterministische endliche) direkte Produktautomaten in Python
Finde Fehler in Python
Finden Sie die Reihenfolge / Kombination in Python
Lassen Sie uns das Umfangsverhältnis mit Python finden
Implementieren Sie einen deterministischen endlichen Automaten in Python, um Vielfache von 3 zu bestimmen
Suchen Sie nach Dateien wie Linux Find in Python
Suchen und überprüfen Sie die inverse Matrix in Python
Quadtree in Python --2
Python in der Optimierung
CURL in Python
Metaprogrammierung mit Python
Python 3.3 mit Anaconda
Geokodierung in Python
SendKeys in Python
Metaanalyse in Python
Unittest in Python
Minimale Implementierung von Union Find in Python
Epoche in Python
Zwietracht in Python
Deutsch in Python
DCI in Python
Quicksort in Python
nCr in Python
Finden Sie den Bruchteil des in Python eingegebenen Werts heraus
Finden Sie in Python Primzahlen mit einem möglichst kurzen Code
Plink in Python
Konstante in Python
Finden Sie die Lösung der Gleichung n-ter Ordnung mit Python
FizzBuzz in Python
SQLite in Python
Schritt AIC in Python
LINE-Bot [0] in Python
CSV in Python
Reverse Assembler mit Python
Reflexion in Python
Konstante in Python
nCr in Python.
Format in Python
Scons in Python 3
[Python] Finden Sie die Translokationsmatrix in Einschlussnotation
Puyopuyo in Python
Python in Virtualenv
PPAP in Python
Quad-Tree in Python
Reflexion in Python
Chemie mit Python
Hashbar in Python
DirectLiNGAM in Python
LiNGAM in Python
In Python reduzieren
In Python flach drücken
Suchen Sie den Teil 575 aus Wikipedia in Python
Finden Sie die Hermite-Matrix und ihre eindeutigen Werte in Python
Finden Sie das Datum dieser Woche in einem beliebigen Format mit Python
Sortierte Liste in Python
Clustertext in Python
AtCoder # 2 jeden Tag mit Python