![]() |
![]() |
![]() |
![]() |
Esimene lahendus. Otsime kohe kolmekohalist arvu X ja leiame selle numbrid N1, N2, N3 , kasutades süsteemipredikaati mod, mis annab mooduliga jagamisel saadava jäägi, näiteks 965 mod 100 tuleb 65, mille esialgsest arvust lahutamisel saamegi sajaliste numbri.
Et arvutuste alates arvul X juba väärtus oleks, kasutame (lõpprekursiivset!) generaatorit vahel(Algus,X,Lopp), mis genereerib kõk arvud vahemikus Algus...Lopp.
vahel(A,A,L).
vahel(A,X,L) :-
Et predikaat arvuta esitaks kõik lahendused, sunnitakse see pärast järjekordse tingimust rahuldava arvu leidmist ja väljastamist süsteemipredikaadiga fail (selle väärtus on alati FALSE) tagurdama (s.t. algab backtracking). Kui kõik lahendid on leitud, lõpetab predikaadi arvuta viimane lause töö ("puhtalt", s.t. ilma ebaõnnestumiseta).
arvuta:-
arvuta.
Teine lahendus. Otsime kolmekohalise arvu numbreid N1, N2, N3; algul tuleb muidugi selgitada, mis on number; seda võiks teha kas "otse" deklareerides
num(0).
num(1).
...
kuid võib ka kasutada ülalkirjeldatud predikaati vahel:
num(X):-
Lahendus on veel sirgjoonelisem kui eelmine:
arvuta1 :-
arvuta1.
num(N2),
2. Ka krüptogrammide, näiteks
EIN SEND VATER FOURTY
+ EIN + MORE + MUTTER TEN
+ EIN ------ ------- TEN
+ EIN MONEY ELTERN -------
------ SIXTY
VIER
lahendamine (iga täht tähistab mingit numbrit 0..9, erinevad tähed tähistavad erinevaid numbreid ja arvud ei alga 0-ga) on eelmise lahenduse sarnane, näiteks ülaltoodud esimese krüptogrammi lahendid leiab predikaat:
leia(E,I,N,V,R):-
(sellel krüptogrammil on vaid 1 lahend!).
Ûlesandeid.
1. Tee predikaadid ülaltoodud teiste krüptogrammide lahendamiseks.
2. Tee programm, mis leiab kõrvalolevas arvlabyrindis silmusteta tee, millel läbitud ruutude kogusumma oleks 59.
3. Tee programm, mis paigutab 3x3 maatriksisse numbrid 1..9 (kõik erinevad) nii, et numbrite summa kõigis horisontaal- ja vertikaalridades oleks sama, näiteks nii:
8 1 6 3 5 7 4 9 2(nn maagiline ruut, selliseid kasutatakse katsete planeerimises).