Solution of Ilker Erek DURAN
;ilker erek duran 1202902
;============================================================================
;YARDIMCI FONKSIYONLAR
(define (bul f lst)
(filter (lambda (x) (if (list? x) (equal? f (car x)) '())) lst))
(define (bulma f lst)
(filter (lambda (x) (not (if (list? x) (equal? f (car x)) '()))) lst))
(define (cikar a lst)
(filter (lambda (x) (not (equal? a x))) lst))
;============================================================================
;R1
(define (r1-left-lst1 lst1 lst2)
(bulma 'not lst1))
(define (r1-left-lst2 lst1 lst2)
(append (map cadr (bul 'not lst1))
lst2))
(define (r1-right-lst1 lst1 lst2)
(append (map cadr (bul 'not lst2))
lst1))
(define (r1-right-lst2 lst1 lst2)
(bulma 'not lst2))
(define (r1-help lst)
(list (r1-right-lst1 (r1-left-lst1 (car lst) (cadr lst))
(r1-left-lst2 (car lst) (cadr lst)))
(r1-right-lst2 (r1-left-lst1 (car lst) (cadr lst))
(r1-left-lst2 (car lst) (cadr lst)))))
;nary R1
(define (r1 lst)
(if (null? (bul 'not (car lst))) (r1-help lst)
(r1 (r1-help lst))))
;============================================================================
;R2
(define (replace arg)
(if (null? arg) '()
(cons (car arg)
(replace (cdr arg)))))
(define (fonk lst)
(if (null? lst) '()
(append (replace (cdar lst))
(fonk (cdr lst)))))
(define (r2-left lst)
(append (fonk (bul 'and lst))
(bulma 'and lst)))
(define (r2-right lst)
(append (fonk (bul 'or lst))
(bulma 'or lst)))
(define (r2 lst)
(list (r2-left (car lst))
(r2-right (cadr lst))))
;============================================================================
;R3
(define (r3-help lst1 lst2)
(cond ((null? lst1) (cons (list '() lst2)
'()) )
((and (list? (car lst1))
(equal? (caar lst1) 'or))
(map (lambda (x) (list (cons x (cdr lst1)) lst2))
(cdar lst1)) )
(else (map (lambda (x) (list (cons (car lst1) (car x))
(cadr x)))
(r3-help (cdr lst1) lst2)) ) ) )
(define (r3 lst)
(r3-help (car lst) (cadr lst)))
;============================================================================
;R4
(define (r4-help lst1 lst2)
(cond ((null? lst2) (cons (list lst1 '())
'()) )
((and (list? (car lst2))
(equal? (caar lst2) 'and))
(map (lambda (y) (list lst1 (cons y (cdr lst2))))
(cdar lst2)) )
(else (map (lambda (x) (list (car x)
(cons (car lst2) (cadr x))))
(r4-help lst1 (cdr lst2))) ) ) )
(define (r4 lst)
(r4-help (car lst) (cadr lst)))
;============================================================================
;R5
(define (r5-help arg)
(list 'or
(list 'not (cadr arg))
(caddr arg)))
(define (r5-left lst1)
(if (null? (bul '> lst1)) lst1
(append (map r5-help (bul '> lst1))
(bulma '> lst1))))
(define (r5-right lst2)
(if (null? (bul '> lst2)) lst2
(append (map r5-help (bul '> lst2))
(bulma '> lst2))))
(define (r5 lst)
(list (r5-left (car lst))
(r5-right (cadr lst))))
;============================================================================
;R6
(define (int lst1 lst2)
(map (lambda (x) (member x lst2)) lst1))
(define (bos lst)
(cond ((null? lst) '())
((null? (car lst)) (bos (cdr lst)))
((list? (car lst)) (append (bos (car lst)) (bos (cdr lst))))
(else lst)))
(define (r6-help lst1 lst2)
(not (null? (bos (int lst1 lst2)))))
(define (r6 lst)
(r6-help (car lst) (cadr lst)))
;============================================================================
;R7
(define (no-con-help lst)
(if (null? lst) #t
(and (not (list? (car lst)))
(no-con-help (cdr lst)))))
(define (no-con lst)
(and (no-con-help (car lst))
(no-con-help (cadr lst))))
(define (r7 lst)
(if (no-con lst) (r6 lst)
#f))
;============================================================================
;WANG
(define (wang lst1 lst2)
(wang-help (list lst1 lst2)))
(define (wang-help lst)
(cond ((r6 lst))
((not (null? (bul '> (car lst))))
(wang-help (r5 lst)))
((not (null? (bul '> (cadr lst))))
(wang-help (r5 lst)))
((not (null? (bul 'and (car lst))))
(wang-help (r2 lst)))
((not (null? (bul 'or (cadr lst))))
(wang-help (r2 lst)))
((not (null? (bul 'not (car lst))))
(wang-help (r1 lst)))
((not (null? (bul 'not (cadr lst))))
(wang-help (r1 lst)))
((not (null? (bul 'or (car lst))))
(wang-r3 (r3 lst)))
((not (null? (bul 'and (cadr lst))))
(wang-r4 (r4 lst)))
(else (r7 lst))))
(define (wang-r3 lst)
(if (null? lst) #t
(and (wang-help (car lst))
(wang-r3 (cdr lst)))))
(define (wang-r4 lst)
(if (null? lst) #t
(and (wang-help (car lst))
(wang-r3 (cdr lst)))))