Bonjour, j'implémente en ce moment une machine à état hiérarchique en caml. Une machine à état hiérarchique est une machine à état donc chaque état peut contenir une machine à état.
Cette machine à état permet de contrôler le comportement d'un agent.
Je tente de réaliser cela avec un mix d'objet et de type somme en caml.
J'ai donc une classe agent et une classe state qui elle représente mon état.
State a un état parent (celui qui le contient), un état enfant (la machine à état qu'il contient et l'état de "départ" auquel il est lié. On y a diverses actions qui feront l'objet de la question 2.
Les transitions permettent de construire un arbre composant des conditions et des évènements.
Première question : J'ai une belle syntaxe error.. Le problème est que mes définitions de type sont tous interdépendantes mais que je ne parviens pas à faire en sorte de lui faire manger tout cela d'un seul coup.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 class agent = object val mutable startState = new state; end and transition = Condition of (agent -> bool) | Event of (agent -> bool) | ConditionOr of (agent -> bool) | ConditionAnd of (agent -> bool) | ConditionXor of (agent -> bool) | ConditionNor of (agent -> bool) and stateOuRien = State of state | None and state = object val mutable parentstate = State( new state); val mutable substate = State( new state); val mutable transitions = []; val mutable begin_action = (function a-> a#startState = new state); val mutable action = (function a-> a#startState = new state); val mutable end_action = (function a-> a#startState = new state); end;;
Y a t-il une astuce ?
Seconde question : Je suis en train de lui imposer une notion que je pense un peu limite. En effet, mon
val mutable end_action = (function a-> a#startState = new state);
correspond au type block qu'on trouve dans les langages objets avancés (Smalltalk, Ruby, Lisaac, ...). En gros, c'est une propriétés de ma classe dans laquelle j'aimerai affecter/changer une fonction quand bon me semble.
Question subsidiaire : j'ai du mal à lui faire comprendre quel type je veux exactement pour mes propriétés, s'il y avait un moyen de simplement lui définir un type (propriétés : type ) comme dans les langages objets classique, je suis preneur..
Merci !
Partager