Základom môže byť všeobecná schéma spracovania na ľubovolnej úrovni.
Výsledkom má byť jednoduchý zoznam (množina) atómov.
Predpokladáme, že NIL je prázdny zoznam a nechápeme ho tu ako atóm.

Pri vytváraní výsledného zoznamu môžme použiť funkciu myappend, ktorá zlúči 2 zoznamy tak, že výsledný nebude obsahovať viacnásobný výskyt atómov.


(defun myappend (zoz1 zoz2)
 (append (vyhod zoz1 zoz2) zoz2)
)

; Príklad:
(myappend '(1 X 2 Y 3) '(1 2 3 Z)) ; -> (X Y 1 2 3 Z)

; Vyhod sa použije v myappend. Vyhodí zo zoz1 všetky prvky čo sú v zoz2.
(defun vyhod (zoz1 zoz2)
 (cond ((null zoz1) NIL)
       ((isin (first zoz1) zoz2) (vyhod (rest zoz1) zoz2))
       (T (cons (first zoz1) (vyhod (rest zoz1) zoz2)))
 )
)

; Isin vráti T, ak sa prvok nachádza v zozname (používa sa vo funkcii vyhod).
(defun isin (p zoz)
 (cond ((null zoz) NIL)
       ((equal p (first zoz)) T)
       (T (isin p (rest zoz)))
 )
)

; Hlavná funkcia.
(defun atomy (sv)
 (cond ((NULL sv) NIL)
       ((ATOM sv) (cons sv NIL))
       (T (myappend (atomy (first sv)) (atomy (rest sv))))
 )
)

; Príklady:
(atomy '(1 2 (1 1 (2 1) 1 1)))   ; -> (2 1)
(atomy '(1 2 (1 (3 X) ((1) X)))) ; -> (2 3 1 X)

Autori[ ZADANIE | AKO ZAČAŤ | RIEŠENIE ]
Posledná aktualizácia 4. 9. 2001
back  home  next