Установить, а не перечислить в мире Лиспа?

В теории множеств у нас есть {x, y, z}, который совпадает с {z, y, x}, который совпадает с... {y, x, z}, {z, x, y}... Теперь в Лиспе (Scheme и т. д.) список не допускает такого сопоставления. Порядок имеет значение. Вопрос: Существует ли в Lisp/Scheme эквивалент набора «порядок не имеет значения»?

Просто предполагаю, что я мог бы просто создать список, скажем, (x y z), а затем иметь какой-то механизм member?, например, Являетесь ли вы участником? механизма.

...Бьюсь об заклад, я не единственный, кто задавался этим вопросом...


person 147pm    schedule 24.04.2016    source источник
comment
SRFI-1 содержит несколько операций над списками.   -  person jkiiski    schedule 24.04.2016
comment
stackoverflow.com/q/165767/1116364   -  person Daniel Jour    schedule 24.04.2016
comment
Я не думаю, что это дубликат. Это более глубокий вопрос о природе и теории Лиспа, а не о Common Lisp или множествах как структуре данных.   -  person    schedule 24.04.2016
comment
@Rei Есть ли эквивалент Lisp/Scheme для набора «порядок не имеет значения»? Поскольку ИМО является главным вопросом здесь, я, безусловно, думаю, что это дубликат. Вопрос касается наличия/использования наборов в Lisp (хотя и не указано, какие именно, это было бы слишком широко). Речь идет не об использовании наборов для Лиспа (то есть в качестве замены в качестве фундаментальной структуры данных).   -  person Daniel Jour    schedule 24.04.2016
comment
Нет, он ссылается на математическое значение слова «множество». Он думает (правильно, возможно, наивно), что лисповские списки упорядочены, т. е. упорядоченное множество, поэтому естественным образом вытекает его вопрос: являются лилисповские списки множествами в математическом смысле? если нет, то есть ли что-нибудь в lisp, как в языке/обозначении, обобщающем списки? Не реализация, не библиотека. С математической точки зрения этот вопрос имеет смысл; однако большинство программистов настолько отвыкли от математики, что не могут понять первоначального значения терминов, используемых в CS. Так что это не дубликат, это хороший теоретический вопрос.   -  person    schedule 24.04.2016


Ответы (1)


Если вы говорите о common lisp, у него есть куча функций, которые работают со списками, как если бы они были множествами:

(member 'b '(a b c d)) => (B C)

Вы также можете использовать member_if. Есть также некоторые другие функции для операций над множествами:

(union '(a b c) '(f a d)) => (C B F A D)

(intersection '(a b c) '(f a d)) => (A)

(set-difference '(a b c) '(b c d)) => (A)

person coredump    schedule 24.04.2016