home *** CD-ROM | disk | FTP | other *** search
- ;;;; This file contains search procedures.
-
- ;;; This is the node-expansion procedure.
-
- (DEFUN EXPAND (PATH)
- (LET ((REVERSED-PATH (REVERSE PATH)))
- (MAPCAR 'REVERSE
- (REMOVE-IF '(LAMBDA (NEW-PATH)
- (MEMBER (FIRST NEW-PATH) (REST NEW-PATH)))
- (MAPCAR '(LAMBDA (NEIGHBOR) (CONS NEIGHBOR REVERSED-PATH))
- (GET (FIRST REVERSED-PATH) 'NEIGHBORS))))))
-
- ;;; These are the depth-first search procedures.
-
- (DEFUN START-DEPTH (START GOAL)
- (DEPTH (LIST (LIST START))
- GOAL))
-
- (DEFUN DEPTH (QUEUE GOAL)
- (IF (NULL QUEUE)
- NIL
- (IF (EQUAL GOAL (FIRST (LAST (FIRST QUEUE))))
- (FIRST QUEUE)
- (DEPTH (APPEND (EXPAND (FIRST QUEUE))
- (REST QUEUE))
- GOAL))))
-
- ;;; These are the breadth-first search procedures.
-
- (DEFUN START-BREADTH (START GOAL)
- (BREADTH (LIST (LIST START))
- GOAL))
-
- (DEFUN BREADTH (QUEUE GOAL)
- (IF (NULL QUEUE)
- NIL
- (IF (EQUAL GOAL (FIRST (LAST (FIRST QUEUE))))
- (FIRST QUEUE)
- (BREADTH (APPEND (REST QUEUE)
- (EXPAND (FIRST QUEUE)))
- GOAL))))
- ;;; These are the best-first search procedures. They won't work
- ;;; until GC LISP gets SORT.
-
- (DEFUN START-BEST (START GOAL)
- (BEST (LIST (LIST START))
- GOAL))
-
- (DEFUN BEST (QUEUE GOAL)
- (IF (NULL QUEUE)
- NIL
- (IF (EQUAL GOAL (FIRST (LAST (FIRST QUEUE))))
- (FIRST QUEUE)
- (BEST (SORT (APPEND (EXPAND (FIRST QUEUE))
- (REST QUEUE))
- '(LAMBDA (X Y) (CLOSERP X Y GOAL)))
- GOAL))))
-
- (DEFUN CLOSERP (X Y WRT)
- (< (DISTANCE2 (FIRST X) WRT)
- (DISTANCE2 (FIRST Y) WRT)))
-
- (DEFUN DISTANCE2 (A B)
- (let* ((PA (GET A 'POSITION))
- (PB (GET B 'POSITION)))
- (+ (SQUARE (- (FIRST PA) (FIRST PB)))
- (SQUARE (- (FIRST (REST PA)) (FIRST (REST PB)))))))
-
- (DEFUN SQUARE (X) (* X X))
-