home *** CD-ROM | disk | FTP | other *** search
- ;;;; This file contains the matching program.
-
- (DEFUN MATCH (P D ASSIGNMENTS)
- (COND ((AND (NULL P) (NULL D)) ;Succeed.
- (COND ((NULL ASSIGNMENTS) T)
- (T ASSIGNMENTS)))
- ((OR (NULL P) (NULL D)) NIL) ;Fail.
- ((OR (EQUAL (FIRST P) '?) ;Match ? pattern.
- (EQUAL (FIRST P) (FIRST D))) ;Identical elements.
- (MATCH (REST P) (REST D) ASSIGNMENTS))
- ((EQUAL (FIRST P) '+) ;Match + pattern.
- (OR (MATCH (REST P) (REST D) ASSIGNMENTS)
- (MATCH P (REST D) ASSIGNMENTS)))
- ((ATOM (FIRST P)) NIL) ;Losing atom.
- ((EQUAL (PATTERN-INDICATOR (FIRST P)) '>) ;Match $>$ variable.
- (MATCH (REST P) (REST D)
- (SHOVE-GR (PATTERN-VARIABLE (FIRST P))
- (FIRST D)
- ASSIGNMENTS)))
- ((EQUAL (PATTERN-INDICATOR (FIRST P)) '<) ;Substitute variable.
- (MATCH (CONS (PULL-VALUE (PATTERN-VARIABLE (FIRST P)) ASSIGNMENTS)
- (REST P))
- D
- ASSIGNMENTS))
- ((EQUAL (PATTERN-INDICATOR (FIRST P)) '+) ;Match + variable.
- (LET ((NEW-ASSIGNMENTS (SHOVE-PL (PATTERN-VARIABLE (FIRST P))
- (FIRST D)
- ASSIGNMENTS)))
- (OR (MATCH (REST P) (REST D) NEW-ASSIGNMENTS)
- (MATCH P (REST D) NEW-ASSIGNMENTS))))
- ((AND (EQUAL (PATTERN-INDICATOR (FIRST P)) ;Match restriction.
- 'RESTRICT)
- (EQUAL (RESTRICTION-INDICATOR (FIRST P)) '?)
- (TEST (RESTRICTION-PREDICATES (FIRST P)) (FIRST D)))
- (MATCH (REST P) (REST D) ASSIGNMENTS))))
-
- ;;; This section contains selector procedures.
-
- (DEFUN PATTERN-INDICATOR (L)
- (FIRST L))
-
- (DEFUN PATTERN-VARIABLE (L)
- (SECOND L))
-
- (DEFUN MATCH-VALUE (KEY A-LIST)
- (SECOND (ASSOC KEY A-LIST)))
-
- (DEFUN PULL-VALUE (VARIABLE A-LIST)
- (SECOND (ASSOC VARIABLE A-LIST)))
-
- ;;; This section contains mutator procedures.
-
- (DEFUN SHOVE-GR (VARIABLE ITEM A-LIST)
- (APPEND A-LIST (LIST (LIST VARIABLE ITEM))))
-
- (DEFUN SHOVE-PL (VARIABLE ITEM A-LIST)
- (COND ((NULL A-LIST) (LIST (LIST VARIABLE (LIST ITEM))))
- ((EQUAL VARIABLE (FIRST (FIRST A-LIST)))
- (CONS (LIST VARIABLE (APPEND (SECOND (FIRST A-LIST))
- (LIST ITEM)))
- (REST A-LIST)))
- (T (CONS (FIRST A-LIST)
- (SHOVE-PL VARIABLE ITEM (REST A-LIST))))))
-
- (DEFUN RESTRICTION-INDICATOR (PATTERN-ITEM) (SECOND PATTERN-ITEM))
-
- (DEFUN RESTRICTION-PREDICATES (PATTERN-ITEM) (REST (REST PATTERN-ITEM)))
-
- ;;; This is the auxiliary procedure for testing datum elements to
- ;;; see if they satisfy the given predicates.
-
- (DEFUN TEST (PREDICATES ARGUMENT)
- (COND ((NULL PREDICATES) T) ;All tests T?
- ((FUNCALL (FIRST PREDICATES) ARGUMENT) ;This test T?
- (TEST (REST PREDICATES) ARGUMENT))
- (T NIL))) ;This test NIL?
-
- ;;; These are some representative predicates.
-
- (DEFUN COLORP (WORD) (MEMBER WORD '(RED WHITE BLUE)))
-
- (DEFUN BAD-WORD-P (WORD) (MEMBER WORD '(SHUCKS DARN)))
-
-
-