|   #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)) | 
|     |