<div dir="ltr">I had a lot of difficulties with exercise 195, 196, 197. I'm posting my solution to exercise 197 to get a chance to get feedback. How would have you represented the FSM from exercise 100?<div><br></div><div><div>;Exercise 197. Consider the following data representation for finite state machines:<br></div><div><div>(define-struct fsm (initial transitions final))</div><div>(define-struct transition (current key next))</div><div><br></div><div>; An FSM.v2 is a structure: </div><div>;   (make-fsm FSM-State LOT FSM-State)</div><div>; A LOT is one of: </div><div>; – empty </div><div>; – (cons Transition.v3 LOT)</div><div>; A Transition.v3 is a structure: </div><div>;   (make-transition FSM-State KeyEvent FSM-State)</div><div><br></div><div>;Represent the FSM from exercise 100 in this context.</div><div>;Design the function fsm-simulate, which accepts an FSM.v2 and runs it on a player’s key strokes. If the sequence of key strokes force the FSM.v2 to reach a final state, fsm-simulate stops. Hint The function uses the initial field of the given fsm structure to keep track of the current state.</div><div><br></div><div>;(*) Solution</div><div><br></div><div><div>(define-struct fsm (initial transitions final))</div><div>(define-struct transition (current key next))</div><div><br></div><div>; An FSM.v2 is a structure: </div><div>;   (make-fsm FSM-State LOT FSM-State)</div><div>; A LOT is one of: </div><div>; – empty </div><div>; – (cons Transition.v3 LOT)</div><div>; A Transition.v3 is a structure: </div><div>;   (make-transition FSM-State KeyEvent FSM-State)</div><div><br></div><div>; a(b|c)*d</div><div><br></div><div>(define AA "start, expect to see an 'a' next")</div><div>(define BC "expect to see: 'b', 'c', or 'd'")</div><div>(define DD "encountered a 'd', finished")</div><div>(define ER "error, user pressed illegal key")</div><div><br></div><div>(define fsm-exe100</div><div>  (make-fsm AA</div><div>            (list (make-transition AA "a" BC)</div><div>                  (make-transition BC "b" BC)</div><div>                  (make-transition BC "c" BC)</div><div>                  (make-transition BC "d" DD)</div><div>                  (make-transition AA "d" DD))</div><div>            DD))</div><div><br></div><div>; code begins<br></div><div><br></div><div>(define CANVAS (empty-scene 300 20))</div><div><br></div><div>(define (show-state a-fsm)</div><div>  (place-image (text (fsm-initial a-fsm) 14 "black")</div><div>               100 10 CANVAS))</div><div><br></div><div>; FSM -> SimulationState.v2 </div><div>; match the keys pressed by a player with the given FSM</div><div>(define (fsm-simulate a-fsm)</div><div>   (big-bang a-fsm</div><div>             (to-draw show-state)</div><div>             (on-key find-next-state)</div><div>             (stop-when last-state?)))</div><div><br></div><div>; SimulationState.v2 -> Boolean</div><div>(define (last-state? world-fsm)</div><div>  (string=? (fsm-initial world-fsm) (fsm-final world-fsm)))</div><div><br></div><div>(check-expect (not (last-state? fsm-exe100)) true)</div><div><br></div><div>; Transition.v3 Transition.v3 -> Boolean</div><div>(define (transition=? t1 t2)</div><div>  (and </div><div>   (string=? (transition-current t1) (transition-current t2))</div><div>   (string=? (transition-key t1) (transition-key t2))</div><div>   (string=? (transition-next t1) (transition-next t2))))</div><div><br></div><div>; FSM.v2 KeyEvent -> FSM.v2</div><div>; produces the machine with the next state associated with ke</div><div>(define (find-next-state a-fsm ke)</div><div>  (make-fsm (find (fsm-transitions a-fsm) (fsm-initial a-fsm) ke)</div><div>            (fsm-transitions a-fsm)</div><div>            (fsm-final a-fsm)))</div><div><br></div><div>; [List-of transition] FSM-State KeyEvent -> FSM-State</div><div>; finds the next FSM-State in the transition where 'current' is located</div><div>(define (find ls current ke)</div><div>  (cond </div><div>    [(empty? ls) (error (string-append "not found: " ke " " current))]</div><div>    [else (cond </div><div>            [(and (string=? current (transition-current (first ls)))</div><div>                  (key=? ke (transition-key (first ls))))</div><div>             (transition-next (first ls))]</div><div>            [else </div><div>             (find (rest ls) current ke)])]))</div><div><br></div><div>(check-error (find (fsm-transitions fsm-exe100) AA "b"))</div><div>(check-expect (find (fsm-transitions fsm-exe100) AA "a") BC)</div><div>(check-expect (find (fsm-transitions fsm-exe100) BC "b") BC)</div><div>(check-expect (find (fsm-transitions fsm-exe100) BC "c") BC)</div><div>(check-expect (find (fsm-transitions fsm-exe100) BC "d") DD)</div><div><br></div><div>(check-error (find-next-state fsm-exe100 "b"))</div><div>(check-expect (find-next-state fsm-exe100 "a") (make-fsm BC (fsm-transitions fsm-exe100) DD))</div><div><br></div><div>(check-expect (find-next-state </div><div>               (find-next-state fsm-exe100 "a") "b") </div><div>              (make-fsm BC (fsm-transitions fsm-exe100) DD))</div><div><br></div><div>(check-expect (find-next-state </div><div>               (find-next-state </div><div>                (find-next-state fsm-exe100 "a") "b") "c")</div><div>              (make-fsm BC (fsm-transitions fsm-exe100) DD))</div><div><br></div><div>(check-expect (find-next-state </div><div>               (find-next-state </div><div>                (find-next-state </div><div>                 (find-next-state fsm-exe100 "a") "b") "c") "d")</div><div>              (make-fsm DD (fsm-transitions fsm-exe100) DD))</div><div><br></div><div>(check-expect (find-next-state </div><div>                 (find-next-state fsm-exe100 "a") "d")</div><div>              (make-fsm DD (fsm-transitions fsm-exe100) DD))</div></div></div></div><div><br></div></div>