(defun position-name (p) (intern (concat "p" (+ 1 (round (car p)) (* 5 (round (cadr p)))))) ) (defun next-dirs (state) (let* ((v (robot-position state)) (sym (position-name v))) (set- '(n w s e) (get (position-name v) 'walls)))) (defun next-state (dir state) (let ((v (robot-position state))) (case dir (n (list 'robot 'at (v+ '(0 -1) v))) (w (list 'robot 'at (v+ '(-1 0) v))) (s (list 'robot 'at (v+ '(0 1) v))) (e (list 'robot 'at (v+ '(1 0) v)))))) (defun next-states (state) (let ((dirs (next-dirs state)) result) (dolist (d dirs) (setq result (cons (next-state d state) result))) result))となって,場所ベクトルからシンボルを取り出し, シンボルから壁の無い方向を集合演算で取り出す というような形で計算をする.
> (next-states '(robot at (2 2))) ((robot at (1 2))) > (next-states '(robot at (2 3))) ((robot at (2 4))) > (next-states '(robot at (1 3))) ((robot at (1 4)) (robot at (0 3)))