Možným riešením je použiť dve funkcie zruš zruší daný prvok zo zoznamu a minim nájde minimum, čo bude ten prvok ktorý ako argument odovzdá funkcií zruš na zrušenie. Kvôli pohodlnej inicializácií môžeme obe funkcie volať ešte z ďalšej (hlavnej) funkcie.
; Táto implementácia zrus, zruší prvý výskyt prvku.
; Predpokladáme, že v postupnosti sa číslo ktoré mám zrušiť neopakuje.
; Respektíve, že minimum bude len jedno. Ak by sa malo
; opakovať, treba pozmeniť funkciu zrus, aby zrušila všetky výskyty prvku.
; V akcia pri 2 podmienke v cond by potom malo miesto (rest zoz)
; byť (zrus c (rest zoz)).
(defun zrus (c zoz)
(cond ((null zoz) NIL)
((= c (first zoz)) (rest zoz))
(T (cons (first zoz) (zrus c (rest zoz))))
)
)
; Výhodne použitie je inicializovať minim prvým prvkom a nechať
; ju hľadať vo zvyšku.
(defun minim (min zoz)
(cond ((null zoz) min)
((> min (first zoz)) (minim (first zoz) (rest zoz)))
(T (minim min (rest zoz)))
)
)
; Predpokladáme, že postupnosť čísel je neprázdna, kvôli inicializácií
; funkcie minim. Ak by mala byt prázdna možno vo funkcií zrusmin
; pridať ešte test tejto možnosti.
; Hlavná funkcia.
(defun zrusmin (zoz)
(zrus (minim (first zoz) (rest zoz)) zoz)
)
; Príklad:
(zrusmin '(4 1 2 6 5)) -> (4 2 6 5)