Изменить код - Lisp
Формулировка задачи:
Добрый вечер, имеется код, который считает такое выражение : ((A ∩ B) – C) ∩ D , где A,B,C,D-множества.
Как его переделать, что бы считало (С - (A ∩ B)) ∩ D ?
Буду очень благодарна за помощь!
(defun func (a b c d &optional (flag '1) (res '()) (temp b) (temp2 '()))
(cond
((equalp flag '1)
(cond
((equalp a nil) (print res) (func a b c d '2 res res res))
((equalp b nil) (func (cdr a) temp c d '1 res temp temp2))
((equalp (car a) (car b)) (func (cdr a) temp c d '1 (cons (car b) res) temp temp2))
(T (func a (cdr b) c d '1 res temp temp2))
)
)
((equalp flag '2)
(cond
((equalp res nil) (func a b (cdr c) d '2 temp2 temp temp2))
((equalp c nil) (print temp2) (func a b c d '3 res d '()))
((equalp (car res) (car c))(func a b (cdr c) d '2 temp temp (remove (car c) temp2)))
(T (func a b c d '2 (cdr res) temp temp2))
)
)
(T
(cond
((equalp res nil) temp2)
((equalp d nil) (func a b c temp '3 (cdr res) temp temp2))
((equalp (car res) (car d)) (func a b c (cdr d) '3 res temp (cons (car res) temp2)))
(T (func a b c (cdr d) '3 res temp temp2))
)
)
)
)Решение задачи: «Изменить код»
textual
Листинг программы
(defun пересечь (x y) (cond ((null x) nil) ((memb (car x) y) (cons (car x) (пересечь (cdr x) y))) (t (пересечь (cdr x) y)))) ==> ПЕРЕСЕЧЬ (пересечь '(1 2 3 4 5 6) '(4 5 6 7 8 9)) ==> (4 5 6) (defun отнять (x y) (cond ((null x) nil) ((memb (car x) y) (отнять (cdr x) y)) (t (cons (car x) (отнять (cdr x) y))))) ==> ОТНЯТЬ (отнять '(1 2 3 4 5 6) '(4 5 6 7 8 9)) ==> (1 2 3) (defun задача (a b c d) (пересечь (отнять c (пересечь a b)) d)) ==> ЗАДАЧА (задача '(1 2 3 4) '(3 4 5 6) '(1 2 3) '(2 3 4)) ==> (2)