Možným riešením je vytvoriť funkcie, pomocou ktorých otestujeme každý podzoznam, či vyhovuje podmienkam, že má 3 prvky a sú to čísla, prípadne, že to je zoznam a nie atóm. Potom v hlavnej funkcií budeme prechádzať hlavným zoznamom a na každý jeho prvok budeme aplikovať spomínané testy (v podmienke AND).
Aby sme overili, či sú to trojice použijeme napr. funkciu sucet.
(defun pocet (zoz)
(cond ((null zoz) 0)
(T (+ 1 (pocet (rest zoz))))
)
)
Test, či má zoznam na hornej úrovni iba čísla.
(defun testcisla (zoz)
(cond ((null zoz) T)
((NUMBERP (first zoz)) (testcisla (rest zoz)))
(T NIL)
)
)
Funkcia bude správna ak
zoz bude obsahovať zoznamy alebo atómy.
Ak by mal obsahovať aj bodka-dvojice, treba ju doplniť.
Napríklad vhodným použitím predikátu mylistp definovaného
v príklade vyraz.
Princíp testu: ak má
podzoznam 3 prvky, tak potom to musia byt čísla a to má
platiť aj o ostatných podzoznamoch.
Pre prázdny
zoznam vráti T, ak by to nevyhovovalo špecifikácií, treba ta
použiť v inej funkcií ktorá najprv otestuje či zoz nie je
prázdny.
(defun trojice (zoz)
(cond ((null zoz) T)
((ATOM zoz) NIL)
((ATOM (first zoz)) NIL)
((= 3 (pocet (first zoz))) (AND (testcisla (first zoz)) (trojice (rest zoz))))
(T NIL)
)
)
Príklad použitia:
(trojice '((1 2 4) (5 2 7))) -> T
(trojice '((1 2 3) (1 2 x))) -> NIL
(trojice '(x)) -> NIL
(trojice '((1 2 3) x)) -> NIL