(load "~/public_html/symbolic/03/matcher.scm")
(define match:succeed-true
(lambda (x y) (= y 1)))
(define match:succeed-dictionary
(lambda (x y) `(succeed ,x)))
(define (match:element-restricted variable restriction?)
(define (element-match data dictionary succeed)
(and (pair? data) (let ((vcell (match:lookup variable dictionary))) (if vcell
(and (equal? (match:value vcell) (car data))
(succeed dictionary 1))
(and (restriction? (car data))
(succeed (match:bind variable (car data) dictionary)
1))))))
element-match)
(define (match:predicate pattern)
(caddr pattern))
(define (match:->combinators pattern)
(define (compile pattern)
(cond ((match:element? pattern)
(if (= (length pattern) 2)
(match:element (match:variable-name pattern))
(match:element-restricted (match:variable-name pattern)
(match:predicate pattern))))
((match:segment? pattern)
(match:segment (match:variable-name pattern)))
((list? pattern)
(apply match:list (map compile pattern)))
(else (match:eqv pattern))))
(compile pattern))
((match:->combinators `(a
(? b ,(lambda (x) (eqv? (car x)
1)))
(?? c)
c))
'((a (1 2 3) 2 c))
'()
match:succeed-dictionary)
((match:->combinators `(a
(? b ,(lambda (x) (eqv? (car x)
2)))
(?? c)
c))
'((a (1 2 3) 2 c))
'()
match:succeed-dictionary)
(define (sin-squared? pattern)
((match:->combinators `((square (sin (? b)))))
`((,pattern))
'()
match:succeed-true))
(define (cos-squared? pattern)
((match:->combinators `((square (cos (? b)))))
`((,pattern))
'()
match:succeed-true))
((match:->combinators `((?? a)
(? x ,sin-squared?)
(?? b)
(? y ,cos-squared?)
(?? c)))
'((+ aa bb
(square (sin xx))
cc dd
(square (cos yy))
ee ff))
'()
match:succeed-dictionary)
((match:->combinators `((?? a)
(? x ,sin-squared?)
(?? b)
(? y ,cos-squared?)
(?? c)))
'((+ aa bb
(square (cos xx))
cc dd
(square (cos yy))
ee ff))
'()
match:succeed-dictionary)
||#
(define (match:reversed-segment variable)
(define (reversed-segment-match data dictionary succeed)
(and (list? data)
(let ((vcell (match:lookup variable dictionary)))
(and vcell
(let* ((val (match:value vcell))
(len (length val)))
(and (>= (length data)
len)
(equal? (list-head data len)
(reverse val))
(succeed dictionary len)))))))
reversed-segment-match)
(define (match:reversed-segment? pattern)
(and (pair? pattern)
(eq? (car pattern) '$$)))
(define (match:->combinators pattern)
(define (compile pattern)
(cond ((match:element? pattern)
(if (= (length pattern) 2)
(match:element (match:variable-name pattern))
(match:element-restricted (match:variable-name pattern)
(match:predicate pattern))))
((match:segment? pattern)
(match:segment (match:variable-name pattern)))
((match:reversed-segment? pattern)
(match:reversed-segment (match:variable-name pattern)))
((list? pattern)
(apply match:list (map compile pattern)))
(else (match:eqv pattern))))
(compile pattern))
(define (even-palindrome? x)
((match:->combinators '((?? x) ($$ x)))
(list x)
'()
match:succeed-true))
((match:->combinators '((?? x) ($$ x)))
'((a b c c b a))
'()
match:succeed-dictionary)
(even-palindrome? '(a b c c b a))
(even-palindrome? '(a b c c b x))
||#