Wie Sie repräsentieren eine einfache finite-state-Maschine in Ocaml?
Ich geschrieben habe, einige state machine in C++ und Java, aber nie in einer funktionalen Sprache wie Ocaml
Problem ist, ich weiß nicht, ob ich kann, passen nur code von dem Objekt, Sprachen, Versionen, da in Ocaml records und Varianten, die mächtiger sind als Klasse;
So, ich brauche eine event-driven-finite state machine (hierarchische wie in UML), leicht konfigurierbar
Könnte jemand erfahren in dem Bereich post-ein einfaches Beispiel dazu ? Nur um zu vermeiden die häufigsten fallen
Dank 🙂
BEARBEITEN 16/03 : Ist es möglich, dies zu tun, ohne mutable state ?
Und ich möchte, um es zu Kapseln richtig unter dem Namen "FSM", sollte ich wählen Sie ein Modul oder eine Klasse ?
- mögliche Duplikate von Automaten in ocaml
Du musst angemeldet sein, um einen Kommentar abzugeben.
In der Regel erstellen Sie einen Datensatz entspricht einem Zustand des Automaten, und Sie haben eine andere Art für das Ereignis auslösen der übergang zu einem anderen Zustand. In dem Zustand aufnehmen, haben Sie eine Karte zu finden, für jeden Fall, der neue Staat.
Nehmen wir an, deine übergänge ausgelöst werden durch strings:
Hier, ich nahm an, dass unbekannte Ereignisse bleiben auf dem gleichen Stand, aber man konnte ein Fehlerstatus in der Platte...
Es hängt davon ab, wie Sie zum Betrieb des FSM, z.B., wenn Sie brauchen, um in der Lage sein, zu speichern, seinen Zustand und später fortsetzen, oder wenn Sie nur wollen, führen Sie es sofort. Im letzteren Fall ist es trivial, um es zu tun, als ein Bündel von tail-rekursiven Funktionen.
Nehmen wir beispielsweise an, die regexp
C((A|B)*CD)*
-- die folgenden sich gegenseitig rekursive Funktionen sind eine direkte Umsetzung von der jeweiligen FSM erkennt, dass eine Liste mit dazu passenden regexp (wenn ich Sie nicht machen keine Fehler 🙂 ):Jeder Funktion entspricht genau einem Zustand des Automaten und setzt die transition-Funktion. Die Anwendung
s1 : alphabet list -> bool
läuft die FSM auf das argument.PS: Beachten Sie, wie dies ist eine Anwendung zu demonstrieren, den nutzen und die Eleganz der tail-call-Optimierung...
Es ist eine ausgezeichnete Antwort, die zeigt, Ausdruckskraft und Eleganz von OCaml in der Vertretung der finite-state-Maschine hier:
Automaten in ocaml
Weitere schwere verwenden, könnten Sie versuchen, einen Blick auf einige finite state machine library wie fsm Bibliothek hier.
Habe ich vor kurzem erstellt eine FSM-Modul in OCaml die Sie hier finden können hier
Habe ich einige spezielle Anforderungen für meine FSM-Implementierung, die es nicht ganz so schön zu sehen wie einige der anderen hingewiesen, dass hier, aber ich denke, die Art und Weise erklären Sie die FSM selbst ist ganz nett und erklärend. Die Besondere Anforderung ist, dass ich in der Lage sein, code zu erzeugen, in HDL (hardware description language) aus einer deklarativen Beschreibung der FSM sind neben der Fähigkeit zur Simulation der FSM operation in den OCaml-version. Weil ich brauchte, um Prädikat-Ausdrücke statt des übergangs Funktionen (andernfalls würde, wie ich zu übersetzen, eine Funktion, um einen string?) Dies vor allem, die Sie konzentrieren sich auf die FSM-Modul es und die erstellen und eval_fsm Funktionen gibt.
Hier ist ein Beispiel der Verwendung:
(Bitte entschuldigen Sie die ";;" enden - ich wollte in der Lage sein, um cut & fügen Sie diesen code in REPL)
Einige der code hier ist in der Logic-Projekt auf meinem github (fsm.ml ist Teil des Projekts). Der Prädikat-Ausdruck ist entweder T oder F (true oder false). Wenn true, dann wird der übergang gemacht wird vom gegenwärtigen Zustand in den nächsten Zustand. Const T bedeutet immer der übergang. Ein Ausdruck wie:
Bedeutet, dass, wenn beide voll und Seife sind T (true), dann wird der Ausdruck zu true ausgewertet wird.