Или, если вы хотите сделать это в старой школе, вы можете просто написать несколько небольших функций.
Я искренне надеюсь, что вы не используете это для домашней работы.
(define (unordered-union-set set1 set2)
(cond ((null? set2) set1)
(else
(if (in-set? (car set2) set1)
(unordered-union-set set1 (cdr set2))
(cons (car set2) (unordered-union-set (cdr set2) set1))))))
(define (in-set? item set)
(cond ((null? set) #f)
((equal? item (car set)) #t)
(else (in-set? item (cdr set)))))
(define (set-equal? set1 set2)
(if (equal? (length set1) (length set2))
(if (equal? (length set1) (length (unordered-union-set set1 set2)))
#t
#f)
#f))
Использованиеравно установленный?на любых двух наборах.
Это работает на основе некоторой простой теории множеств.Если объединение двух наборов эквивалентной мощности приводит к набору с количеством элементов, эквивалентным количеству элементов первого или последнего набора, наборы эквивалентны.
Моя точка зрения заключается в том, чтобы сказать, что существуетдля этого нет простого оператора, но длинная сложная процедура не требуется, если вы используете трюк с объединением множеств.
Моя реализация не имеет SRFI 1, но я очень сомневаюсь, что lset = будет быстрее этой функции.
Но теперь, когда я прочитал ваши комментарии, вам нужно, чтобы они были действительны для '(1 1 2) и' (2 1).Поскольку это не наборы, этот метод не будет работать, но его не сложно реализовать.Так что, на самом деле, эта процедура эквивалентна lset =.