Добрый день, товарисчи.
есть код на scheme, который решает задачу:
1.Напишите функцию, (f F1), которая выдает логическую формулу F2, получающуюся из логической формулы F1 внесением всех операторов отрицания внутрь конъюнкций и дизъюнкций.
пример входных данных:
(f '(~ (& (~ (v b (& c d))) (v c (~ d)))))
'(v (v b (& c d)) (& (~ c) d))
нужна помощь, как переписать этот код на homelisp?
а конкретней, вот эту функцию normal-args?
(define (S? sym)
(cond ((eq? sym 'v)
#t)
((eq? sym '&)
#t)
((eq? sym '~)
#t)
(else
#f)));;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define (arity s)
(if (eq? s '~)
1
2));;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define (normal-args-count? p)
(= (length (cdr p))
(arity (car p))));;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define (normal-args? p)
(if (normal-args-count? p)
(let iter ((args (cdr p))
(cnt (arity (car p))))
(cond ((= cnt 0)
#t)
((and (not (list? (car args)))
(S? (car args)))
#f)
(else
(iter (cdr args) (- cnt 1)))))
#f));;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define (get-f s)
(cond ((eq? s 'v)
'&)
((eq? s '&)
'v)));;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define (f F1)
(define (process F1)
(let ((s (car F1)))
(if (S? s)
(cond ((not (normal-args? F1))
(error "process -- некорректная формула:" F1))
((eq? s '~)
(f (cadr F1)))
(else
(list (get-f s)
(f (list '~ (cadr F1)))
(f (list '~ (caddr F1))))))
(error "process -- переданный символ не является связкой:" s))))
(cond ((null? F1)
'())
((list? F1)
(let ((s (car F1)))
(if (S? s)
(cond ((not (normal-args? F1))
(error "f -- некорректная формула:" F1))
((eq? s '~)
(if (list? (cadr F1))
(process (cadr F1))
F1))
(else
(list s (f (cadr F1)) (f (caddr F1)))))
(error "f -- переданный символ не является связкой:" s))))
(else
F1)))