Операции работы с множествами

  Задача: Реализовать операции работы с множествами:

Пересечение множеств
Объединение множеств
Вычитание множеств
Симметричная разность

  Объединением множеств A и B называется множество

A⋃B={x|x∊A или x∊B}

  Пересечением множеств A и B называется множество

A⋂B={x|x∊A и x∊B}

  Разностью множеств A и B называется множество

A\B={x|x∊A и x∉B}

  Симметрической разностью множеств A и B называется множество

A-B=(A\B)⋃(B\A)

  Для удобства и понятности создаётся класс multitude.

('multitude defclass)
('multitude defvar  list)
('multitude defmethod list  ()  list)
('multitude defmethod multitude (x)
  (nil  setq  list
    (nil  if  ((nil type-of x)  = 'multitude)
      (x  list)
      x)))
('multitude defmethod push  (x)
  (nil  setq  list  (nil  cons  x list)))
('multitude defmethod contain (x)
  (nil  let (found)
    (nil  try
      (list for i
        (nil  if  (x  = i)
          (nil  throw 'break)))
      break (nil  setq  found true))
    found))
('multitude defmethod ⋃ (m)
  (nil  let ((union ('multitude newobject m)))
    (list for*  x
      (nil  if  (nil  not (union  contain x))
        (union  push  x)))
    union))
('multitude defmethod ⋂ (m)
  (nil  let ((inter ('multitude newobject)) (lockinter  ('lock  newobject)))
    (list for x
      (nil  if  (m  contain x)
        (lockinter  progn
          (inter  push  x))))
    inter))
('multitude defmethod \ (m)
  (nil  let ((diff  ('multitude newobject)) (lockdiff ('lock  newobject)))
    (list for x
      (nil  if  (nil  not (m  contain x))
        (lockdiff progn
          (diff push  x))))
    diff))
('multitude defmethod - (m)
  (nil  let ((a (this \ m)) (b  (m  \ this)))
    (a  ⋃ b)))

  Конструктор может принимать аргумент как список или множество.
  Функция contain использует параллельность. Выход из параллельного цикла реализован с помощью исключения.
  Функция реализует последовательный алгоритм. В данной задаче параллельность недоступна.
  В функция может параллельно контролировать нахождение элементов используя функцию contain. Но изменение результата inter защищена замком lockinter.
  Аналогично реализована функция \.
  В функции - параллельность достигается в вычислении переменных a и b.