(defun samesetp (list1 list2)
(cond
((null list1) (null list2))
((eq list2 (remove (car list1) list2 :count 1)) nil)
(t (samesetP (cdr list1) (remove (car list1) list2 :count 1))))
)
)
Сначала давайте отформатируем это правильно:
(defun samesetp (list1 list2)
(cond ((null list1) (null list2))
((eq list2 (remove (car list1) list2 :count 1)) nil)
(t (samesetP (cdr list1) (remove (car list1) list2 :count 1)))))
Если вы дважды используете форму и хотите изменить ее, вам нужно сохранить значение. Пусть это конструкция для этого. Если он не помещается в один КОНД, тогда вам нужен второй.
(defun samesetp (list1 list2)
(cond ((null list1) (null list2))
(t (let ((list3 (remove (car list1) list2 :count 1)))
(cond ((eq list2 list3) nil)
(t (samesetP (cdr list1) list3)))))))
Теперь эквалайзер нельзя использовать для сравнения списков. Используйте EQUAL.
(defun samesetp (list1 list2)
(cond ((null list1) (null list2))
(t (let ((list3 (remove (car list1) list2 :count 1)))
(cond ((equal list2 list3) nil)
(t (samesetP (cdr list1) list3)))))))
COND здесь избыточен, используйте IF:
(defun samesetp (list1 list2)
(if (null list1)
(null list2)
(let ((list3 (remove (car list1) list2 :count 1)))
(if (equal list2 list3)
nil
(samesetP (cdr list1) list3)))))
Теперь вам нужно только заставить функцию делать то, что было задано в домашнем задании. Но это все равно твоя домашняя работа.