Solution of Ahmet GUL
;sequentte top level formulasi "not" olanlari bulur
(define (not-var arg)
(filter (lambda (x) (and (list? x)
(equal? (car x) 'not)))
arg))
;sequentte top level formulasi "not" olmayanlari bulur
(define (not-yok arg)
(filter (lambda (x) (or (not (list? x))
(not (equal? (car x) 'not))))
arg))
;sequentte top level formulasi "and" olanlari bulur
(define (and-var arg)
(filter (lambda (x) (and (list? x)
(equal? (car x) 'and)))
arg))
;sequentte top level formulasi "and" olmayanlari bulur
(define (and-yok arg)
(filter (lambda (x) (or (not (list? x))
(not (equal? (car x) 'and))))
arg))
;sequentte top level formulasi "or" olanlari bulur
(define (or-var arg)
(filter (lambda (x) (and (list? x)
(equal? (car x) 'or)))
arg))
;sequentte top level formulasi "or" olmayanlari bulur
(define (or-yok arg)
(filter (lambda (x) (or (not (list? x))
(not (equal? (car x) 'or))))
arg))
;sequentte top level formulasi ">" olanlari bulur
(define (ok-var arg)
(filter (lambda (x) (and (list? x)
(equal? (car x) '>))) arg))
;sequentte top level formulasi ">" olmayanlari bulur
(define (ok-yok arg)
(filter (lambda (x) (or (not (list? x))
(not (equal? (car x) '>))))
arg))
;argumanlarinin axiom olup olmadigini kontrol eder
(define (axiom? arg1 arg2)
(cond ((null? arg1) #f)
((member (car arg1) arg2) #t)
(else (axiom? (cdr arg1) arg2))))
;r5 kuralini tek elemanli listlere uygular
(define (r5-helper arg)
(cond ((not (list? arg)) arg)
((null? arg) arg)
((equal? (car arg) '>) (append (list 'or
(list 'not (cadr arg)))
(cddr arg)))
(else arg)))
;r5-helper yardimiyla r5 kuralini her casit liste uygular
(define (r5 arg)
(map r5-helper arg))
;r1 kuralini uygular
(define (r1 arg1 arg2)
(append (not-yok arg1)
(map (lambda (x) (cadr x)) (not-var arg2))))
;r2 kuralinin sol taraf icin gecerli olanini uygular
(define (r2-sol arg)
(append (and-yok arg)
(birlesme (map cdr (and-var arg)))))
;r2 kuralinin sag taraf icin gecerli olanini uygular
(define (r2-sag arg)
(append (or-yok arg)
(birlesme (map cdr (or-var arg)))))
;listenin icindeki sublistleri birlestirir
(define (birlesme arg)
(if (null? arg) arg
(append (birlesme (cdr arg)) (car arg))))
;r3 kuralini uygular
(define (r3 arg)
(map (lambda (x) (cons x (append (cdr (or-var arg))
(or-yok arg))))
(cdar (or-var arg))))
;r4 kuralini uygular
(define (r4 arg)
(map (lambda (x) (cons x (append (cdr (and-var arg))
(and-yok arg)))) (cdar (and-var arg))))
;ilk argumanini parcalayarak teker teker wange ilk arguman olarak yollar
(define (r3-gonderme arg1 arg2)
(and (wang (car arg1) arg2)
(if (null? (cdr arg1)) #t
(r3-gonderme (cdr arg1) arg2))))
;ikinci argumanini parcalayarak teker teker wange ikinci arguman olarak yollar
(define (r4-gonderme arg1 arg2)
(and (wang arg1 (car arg2))
(if (null? (cdr arg2)) #t
(r4-gonderme arg1 (cdr arg2)))))
;bir listin icinde sublist olup olmadigina bakar (r7 icin)
(define (list-var-mi arg )
(cond ((null? arg) #t)
((list? (car arg)) #f)
(else (list-var-mi (cdr arg)))))
;tabiki muhtesem WANG
(define (wang arg1 arg2)
(cond ((and (axiom? arg1 arg2)
(list-var-mi (append arg1 arg2))) #t)
((not (null? (not-var (append arg1 arg2)))) (wang (r1 arg1 arg2) (r1 arg2 arg1)))
((not (null? (and-var arg1))) (wang (r2-sol arg1) arg2))
((not (null? (or-var arg2))) (wang arg1 (r2-sag arg2)))
((not (null? (ok-var (append arg1 arg2)))) (wang (r5 arg1) (r5 arg2)))
((not (null? (or-var arg1))) (r3-gonderme (r3 arg1) arg2))
((not (null? (and-var arg2))) (r4-gonderme arg1 (r4 arg2)))
(else #f)))