Inak povedané vo výslednom zozname budú všetky tie prvky, ktoré sú na najvyššej úrovni len raz.
Možným riešením je
vytvoriť si funkciu, ktorá testuje či je prvok v zozname
prítomný len raz a do výsledku potom zaraďujeme len také.
Túto funkciu potom možno použiť vo funkcií
vylúč(zoznam1,zoznam2) ktorá vylúči zo zoznamu1 všetky
prvky ktoré sú v zozname2 viac ako 2x. V hlavnej funkcií potom
výsledok dostaneme zavolaním funkcie vylúč s parametrami
vylúč(zoznam, zoznam).
; Vráti T, ak sa prvok nachádza menej ako 2x.
; Použitie pomocného parametra c, v ktorom počítam výskyt prvku,
; zefektívňuje funkciu, pretože ak je prvok v zozname 2x, už nehľadám ďalej.
; C sa má inicializovať na 0.
(defun less2 (sv c zoz)
(cond ((= c 2) NIL)
((null zoz) T)
((equal sv (first zoz)) (less2 sv (+ c 1) (rest zoz)))
(T (less2 sv c (rest zoz)))
)
)
; Funkcia vylúč vylúči zo zoz1 všetky prvku, ktoré sa
; v zoz2 nachádzajú viac ako raz.
(defun vyluc (zoz1 zoz2)
(cond ((null zoz1) NIL)
((less2 (first zoz1) 0 zoz2) (cons (first zoz1) (vyluc (rest zoz1) zoz2)))
(T (vyluc (rest zoz1) zoz2))
)
)
; Hlavná funkcia v ktorej realizujeme riešenie nášho problému.
(defun unique (zoz)
(vyluc zoz zoz)
)
; Príklady:
(unique '(1 2 3 (2) 1 3 7 7)) ; -> (2 (2))
(unique '(1 a 2 b 3 a b a a)) ; -> (1 2 3)