Thanks to this post of Tim Thornton, I see a very good way to code FSM:
http://timthornton.net/blog/id/538fa6f2f09a16ba0674813d
I'd summarise it as following:
A finite state automaton has a number of states and each state has a name plus many transition rules. He structures it in racket as following:
(struct automaton (current-state states))
(struct state (name actions))
(struct action (event result))
A simple automaton can be like this:
(define simple-fsm (fsm 'A
(list (fstate 'A (list (action 0 'A)
(action 1 'B)))
(fstate 'B (list (action 0 'B)
(action 1 'A))))))
The automaton is in state A which has 2 transition rules:
- if event 1 happens, the automaton jumps to state B,
- if event 0 happens, it stays in state A.
Then he writes some functions to update the automaton after each event (in the post). Plus this function he omits (I guess):
(define fsm-update-state old-fsm new-state)
(struct-copy automaton old-fsm [current-state new-state]))
HERE IS THE QUESTION:
Using this way, after each event, there'd be a NEW automaton created. So I'm worried about scaling. I'd like to generate 100 automata. In each cycle, I'd pair the automata to interact for 50 times. Which means that there'd be 100 new automata created for every single cycle. And I'd like to run at least 1000 cycles.
Would there be any problem with scaling? If yes, is there a way around this?
Any kind of comments and suggestions are welcomed and appreciated,
Thank you really much,
Chi
You might want to take a look at https://github.com/mromyers/automata
specifically, https://github.com/mromyers/automata/blob/master/examples.rkt
and https://github.com/mromyers/automata/blob/master/machines.rkt
I more or less just use the definition that was in my textbook: you provide a transition function, and the DFA or NFA just uses stream-fold to get the extended transition. I used a bunch of generics stuff to try to generalize everything past the point of practicality, but it's still reasonably fast.
It's not documented, but use (in-machine? M seq) to check for acceptance, (extended-transition M start seq) for final state(s).
There's also a minimization function and nfa->dfa conversion in there, but they might have some bugs.
--
You received this message because you are subscribed to the Google Groups "Racket Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to racket-users...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
Sorry for the duplicate, this was sent yesterday, and only arived just now.
--
You received this message because you are subscribed to a topic in the Google Groups "Racket Users" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/racket-users/4o1goSwrLHA/unsubscribe.
To unsubscribe from this group and all its topics, send an email to racket-users...@googlegroups.com.
You received this message because you are subscribed to the Google Groups "Racket Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to racket-users...@googlegroups.com.
But I'd like to post that the question of how to require a module then evaluate a command is answered here:
https://groups.google.com/forum/#!topic/racket-users/byL7W1yktas
by Daniel.
Thank you so much for all your help and patience,
chi
The AP is implemented as an co-processor (with up to 8 chips) for a PC, and currently has a C-based API development environment and API. It could sorely use a Racket interface and development environment.
Byron
- why you use [i (in-range 10)] in all for loop? what's the difference with [i 10]. they both produce stream, right?
(they say it does just one more iteration before breaking the loop)
On Wednesday, 14 October 2015 05:53:03 UTC+2, Linh Chi Nguyen wrote:
> Isnt this the reason we should add 0 at the beginning of the list?
>