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)))))