#lang plai-typed (define-type Step [straight (distance : number)] [right] [left] [rand (option-1 : Program) (option-2 : Program) ]) (define-type-alias Program (listof Step)) ;; Template: ;(define (move-count (program : Program)) : ... ; (cond [(empty? program) ...] ; [(cons? program) ... (step-count (first program)) ; ... (move-count (rest program)) ...])) (define (u-turn? (step : Step) (prev : Step)) : boolean (type-case Step step [straight (distance) #f] [left () (left? prev)] [right () (right? prev)] [rand (option-1 option-2) (or (any-uturns option-1 prev) (any-uturns option-2 prev))])) (module+ test (test (u-turn? (straight 2) (left)) #f) (test (u-turn? (left) (left)) #t) (test (u-turn? (right) (left)) #f) (test (u-turn? (right) (right)) #t) (test (u-turn? (rand (list (left) (left)) (list (straight 2))) (left)) #t) (test (u-turn? (rand (list (straight 2)) (list (straight 1))) (left)) #f)) ;; Template: ;(define (step-count [step : Step]) : ... ; (type-case Step step ; [straight (distance) ...] ; [left () ...] ; [right () ...] ; [rand (option-1 option-2) ; ... (move-count option-1) ... (move-count option-2) ... ] )) (define (any-uturns (program : Program) (prev : Step)) : boolean (cond [(empty? program) #f] [(cons? program) (or (u-turn? (first program) prev) (any-uturns (rest program) (first program)))])) (test (any-uturns empty (left)) #f) (test (any-uturns (list (left)) (left)) #t) (test (any-uturns (list (left) (left)) (left)) #t)