Mitmesugused arvude ja numbritega seotud ülesanded aitavad aru erinevatest võimalustest Prologis ülesande tingimuste kirjeldamiseks ja asjaoludest, mis mõjustavad programmi kiirust.
1. Teha programm, mis leiab kolmekohalise arvu, mille tagurpidi kirjutamisel saadud arv on esialgsest 396 võrra väiksem; näiteks 965 - 569 = 396.
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 on 65 ja selle 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 . Kuna me tahame kasutada seda predikaati kõigi arvude Algus ja Lopp vahel olevate arvude genereerimiseks, ei või siin kasutada lõiget !; kui järgnevas definitsioonis esimene lause oleks kujul vahel(A,A,L):-!, tuleks esimese argumendi väärtuseks vaid A ja predikaat lõpetaks pärast seda töö, s.t. me ei saaks ülejäänud väärtusi.
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).
See viimane lause on vajalik vaid selleks, et Prolog saaks lõpetada; esimese lause lõpus olev fail sunnib Prolog-i tagurdama (backtrack) ja leidma kõik lahendid; kui rohkem lahendeid ei leidu, lõpetab teine lause töö.
Teine lahendus . Otsime kolmekohalise arvu numbreid N1, N2, N3 ; algul tuleb muidugi selgitada, mis on number; seda võiks teha kas "otse" deklareerides
Lahendus on veel sirgjoonelisem kui eelmine:
2. Samal viisil saab lahendada ka krüptoritme, näiteks
| EIN + EIN + EIN + EIN ----- VIER |
ONE + ONE + ONE + ONE ----- FOUR |
SEND + MORE ----- MONEY |
VATER + MUTTER ------ ELTERN |
GAUSS + RIESE ------ EUKLID |
FORTY + TEN + TEN ------ SIXTY |
(sellel krüptoritmil on vaid 1 lahend!).
Ülalesitatud "jõumeetodil" lahendus on tegelikult väga aeglane, sest Prolog peab läbi uurima peaaegu kõik 10^5 lahendusvarianti (kõigi viie muutuja kümme võimalikku väärtust). Palju kiirema lahenduse saame, kui jälgime protseduuri, mida inimesed kasutavad tulba kujul liitmisel:
| EIN + EIN + EIN + EIN CD ----- VIER |
| SEND + MORE ------ MONEY |
Tee programm, mis leiab kõrvalolevas arvlabyrindis silmusteta tee, millel läbitud
ruutude kogusumma oleks etteantud arv (näiteks 69).
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 agu kõrvaloleval joonisel
(nn "maagiline ruut"; neid kasutatakse näiteks katsete planeerimisel)
| **# x ## ----- *#*# *## ----- ##### |
%%% x %% ----- %%%% %%%% ------ %%%%%% |
©2004
Jaak Henno