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

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