28.10.2014 Views

1tgD67B

1tgD67B

1tgD67B

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!