Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
Koodissa oleva :- on implikaationuoli, ja<br />
sääntö sanoo, että olio X on olion Z isovanhempi,<br />
jos X on Y:n vanhempi ja Y on Z:n<br />
vanhempi. Säännön määrittelyssä vanhempi-predikaattien<br />
välissä oleva pilkku<br />
on looginen ja-operaattori. Nyt voimme<br />
suorittaa esimerkiksi seuraavanlaisen<br />
kyselyn:<br />
| ?- isovanhempi(Isovanhempi, Lapsenlapsi).<br />
Prolog-järjestelmä tulostaa uskollisesti<br />
meille kaikki voimassa olevat<br />
isovanhempi–lapsenlapsi-suhteet. Ohjelmoidaan<br />
vielä lisää ja määritellään myös<br />
sukupuoli sekä isoisän sääntö:<br />
mies(veli_matti).<br />
mies(ville_matti).<br />
mies(esko).<br />
mies(antti).<br />
mies(martti).<br />
nainen(anne).<br />
nainen(mailis).<br />
nainen(liisa).<br />
nainen(silja).<br />
% Isoisän määrittelevä sääntö:<br />
isoisa(X, Y) :-<br />
isovanhempi(X, Y), mies(X).<br />
Uuden säännön mukaan X on Y:n isoisä,<br />
jos X on Y:n isovanhempi ja X on mies.<br />
Nyt esimerkiksi seuraava kysely tulostaa<br />
kaikki voimassa olevat isoisä–lapsenlapsi-suhteet:<br />
| ?- isoisa(Isoisa, Lapsenlapsi).<br />
Mennään seuraavaksi hieman pidemmälle.<br />
Kertomafunktion laskeminen on<br />
klassinen esimerkki ohjelmointioppaissa.<br />
Prolog-kielellä se näyttää seuraavalta:<br />
kertoma(X, 1) :-<br />
X =< 1,<br />
!.<br />
kertoma(X, F) :-<br />
Aux is X-1,<br />
kertoma(Aux, FAux),<br />
F is X * FAux,<br />
!.<br />
Esimerkkiohjelman ylemmässä säännössä<br />
sanotaan, että luvun X kertoma on<br />
1, jos X on pienempi tai yhtä suuri kuin<br />
1. Oikeastaan tämä on matemaattisesti<br />
hieman väärin, mutta sen tarkoitus on<br />
varautua siihen virhetapaukseen, että<br />
käyttäjä antaa predikaatille argumentin,<br />
jonka arvo on negatiivinen. Nollan kertomahan<br />
on yksi.<br />
Ohjelmassa jäljempänä olevaa sääntöä<br />
sovelletaan, mikäli aikaisempi ei toimi.<br />
Se sanoo, että luvun X kertoma on F,<br />
jos<br />
1. apumuuttuja Aux saa arvon X-1<br />
2. apumuuttujan Aux kertoma on FAux<br />
3. muuttuja F eli tulos saa arvon X *<br />
FAux.<br />
Molempien sääntöjen lopussa on<br />
!-merkki, joka on niin sanottu cut-primitiivi.<br />
Sitä käytetään teoreemojen todistuksen<br />
ohjailuun.<br />
Nyt kertoma voidaan laskea tai tarkistaa<br />
esimerkiksi seuraavanlaisilla kyselyillä:<br />
| ?- kertoma(5, Kertoma).<br />
Kertoma = 120<br />
| ?- kertoma(5, 120).<br />
yes<br />
Rakennetaan sitten vieläkin monimutkaisempi<br />
ohjelma ja kirjoitetaan tiedostoon<br />
seuraava koodi:<br />
monikko(Sana, Monikko) :-<br />
atom_codes(Sana, Lista),<br />
atom_codes(t, KirjainT),<br />
append(Lista, KirjainT, MonikkoLista),<br />
atom_codes(Monikko, MonikkoLista), !.<br />
yksikko(Monikko, Sana) :-<br />
atom_codes(Monikko, Lista),<br />
atom_codes(t, KirjainT),<br />
append(YksikkoLista, KirjainT, Lista),<br />
atom_codes(Sana, YksikkoLista), !.<br />
Ohjelma toimii seuraavasti: Määritellään<br />
kaksi predikaattia, monikko ja yksikko.<br />
Predikaatti atom_codes(Sana, Lista) sanoo,<br />
että symbolin Sana kirjainten lista on<br />
listassa Lista. Esimerkiksi voisi olla Sana<br />
= "talot", jolloin tulee olemaan Lista =<br />
[t, a, l, o, t]. Hakasulkeilla ilmaistaan<br />
Prolog-kielessä lista.<br />
Nyt voidaan nähdä, että predikaatti<br />
monikko lisää t-kirjaimen sanan Sana loppuun<br />
ja predikaatti yksikko ottaa sanan<br />
Monikko lopussa olevan t-kirjaimen pois.<br />
Jos esimerkiksi olisi Monikko = "autot",<br />
niin predikaatti yksikko laskee tulokseksi<br />
Sana = "auto".<br />
Prologia käytetään paljon luonnollisten<br />
kielten käsittelyyn. Tämä oli yksinkertainen<br />
esimerkki siitä, miten luonnollisen<br />
kielen merkityksellisiä yksiköitä eli<br />
morfeemeja voidaan käsitellä Prologilla.<br />
Miten pääsen alkuun?<br />
Mikäli Prolog ja logiikkaohjelmointi alkoi<br />
kiinnostaa, kannattaa aivan alkajaisiksi<br />
ladata netistä jokin ilmainen Prolog-järjestelmä.<br />
Hyviä ovat esimerkiksi kiinalainen<br />
BProlog, alankomaalainen SWI-<br />
Prolog sekä GNU Prolog. Kaupallisiakin<br />
toteutuksia on kyllä saatavilla.<br />
Sen jälkeen tarvitaan hyvä oppikirja.<br />
Ivan Bratkon kirja Prolog Programming<br />
for Artificial Intelligence on mielestäni<br />
paras Prolog-tietolähde. Kannattaa hankkia<br />
uusin painos. Oppikirjoina klassikon<br />
asemassa ovat Richard O’Keefen The<br />
Craft of Prolog sekä Leon Sterlingin ja<br />
Ehud Shapiron The Art of Prolog. Hyvä<br />
opas on myös internetistä ilmaiseksi saa-<br />
Aristoteelisen logiikan Prolog-toteutus.<br />
tava Ulf Nilssonin ja Jan Maluszynskin<br />
Logic, Programming and Prolog.<br />
Jos haluaa tutustua Prolog-kielen hienouksiin<br />
syvemmin, Peter Norvigin kirja<br />
Paradigms of Artificial Intelligence Programming<br />
sisältää Lisp-kielellä toteutetun<br />
Prolog-tulkin sekä tarkempaa Prologin<br />
toteutuksen käsittelyä.<br />
Prolog-kielestä voi keskustella esimerkiksi<br />
Usenetin ryhmässä comp.lang.<br />
prolog. Ryhmän aktiivikäyttäjät ylläpitävät<br />
muun muassa faq-listaa eli vastauksia<br />
usein kysyttyihin kysymyksiin. Siinä on<br />
tietoa lukuisista eri Prologin toteutuksista.<br />
Keskusteluryhmästä saa myös vertaistukea.<br />
Kirjallisuutta<br />
• Bratko, Ivan: Prolog Programming for<br />
Artificial Intelligence, 4th edition, Addison-<br />
Wesley/Pearson 2012, ISBN 978-0-321-<br />
41746-6.<br />
• Nilsson, Ulf – Maluszynski, Jan: Logic, Programming<br />
and Prolog. Saatavissa:<br />
http://www.ida.liu.se/~ulfni/lpp/.<br />
• Norvig, Peter: Paradigms of Artificial Intelligence<br />
Programming, Morgan Kaufmann<br />
1992, ISBN 978-1-55860-191-0.<br />
• O’Keefe, Richard A.: The Craft of Prolog,<br />
The MIT Press, ISBN 978-0-262-51227-5.<br />
• Sterling, Leon – Shapiro, Ehud: The Art of<br />
Prolog, 2nd edition, The MIT Press, ISBN<br />
978-0-262-69163-5.<br />
• Tucker, Allen B. (editor): Computer Science<br />
Handbook, 2nd edition, Chapman & Hall /<br />
The Chemical Rubber Company 2004, ISBN<br />
1-58488-360-X.<br />
18 2014.2