У вас есть перестановки, если и только если
- удаление элементов
list1
из list2
приводит к пустому списку, и - удалениеэлементы
list2
из list1
создают пустой список.
Если бы у вас была функция (назовем ее «без»), которая удалила все элементы одного списка из другого списка, вы могли быwrite
(define (permutation? xs ys)
(and (empty? (without xs ys))
(empty? (without ys xs))))
Предполагая, что у вас есть функция remove-first
, которая удаляет первый экземпляр элемента из списка, вы можете определить without
, используя сгиб:
(define (without xs ys)
(foldl (lambda (x ls) (remove-first x ls)) ys xs))
Осталось только remove-first
:
(define (remove-first x xs)
(cond ((empty? xs) '())
((equal? x (first xs)) (rest xs))
(else (cons (first xs) (remove-first x (rest xs))))))
(В вашей схеме remove-first
может быть уже доступно как remove
.)