| #lang racket | 
|  | 
| ;; modeling the transitions in non-deterministic finite-state machines | 
|  | 
| (require redex) | 
|  | 
| ;; ----------------------------------------------------------------------------- | 
| ;; syntax | 
|  | 
| (define-language L | 
| [FSM (rule ...)] | 
| [rule [state -> input -> state]] | 
| [state variable-not-otherwise-mentioned] | 
| [input variable-not-otherwise-mentioned]) | 
|  | 
| ;; ----------------------------------------------------------------------------- | 
| ;; the reduction system | 
|  | 
| (module+ test | 
| (define fsm1 (term ([a -> x -> b] | 
| [a -> y -> c] | 
| [b -> x -> a]))) | 
|  | 
| (test-->> -->fsm | 
| (term [,fsm1 | 
| a | 
| (x x y)]) | 
| (term [,fsm1 | 
| c | 
| ()])) | 
| (test-->> -->fsm | 
| (term [,fsm1 | 
| a | 
| (x x y x)]) | 
| (term [,fsm1 | 
| c | 
| (x)])) | 
|  | 
| (define fsm2 (term ([a -> x -> b] | 
| [a -> y -> c] | 
| [a -> y -> d] | 
| [b -> x -> a] | 
| [d -> x -> b]))) | 
| (test-->>∃ -->fsm | 
| (term [,fsm2 | 
| a | 
| (x x y x)]) | 
| (term [,fsm2 | 
| b | 
| ()]))) | 
|  | 
| (define -->fsm | 
| (reduction-relation | 
| L | 
| #:domain [FSM state (input ...)] | 
| (--> [FSM state_1 (input_0 input_1 ...)] | 
| [FSM state_2 (input_1 ...)] | 
| (where (_ ... [state_1 -> input_0 -> state_2] _ ...) | 
| FSM)))) | 
|  | 
| (module+ test | 
| (test-results)) | 
|  |