Intellekt ja deklaratiivne programmeerimine

Intellekt (nii nagu me oleme harjunud seda mõistma inimeste juures; teistsugusest intellektist seni näiteid ei ole) on defineerimatu mõiste, kuid selle all mõistetatkse meid ümbritseva maailma kohta "arukate" järelduste tegemist, s.t. selliste järelduste tegemist, mis aitavad meil saavutada oma bioloogiliselt sisseehitatud peaeesmärke: hoida end rahulolevas/õnnelikus seisus (söönud, joonud) ja rahuldada soojätkamise instinkti. Jämedalt võttes koosneb koosneb intellekt kahest osast:

Loomulikult ei ole intellekti poolt salvestatud maailma mudel 100%-liselt täpne (see on võimatu juba mälu piiratuse tõttu) ja järelduste kasulikkus (kui hästi nad aitavad süsteemil saavutada oma eesmärke) sõltub mudeli headusest, s.t. sellest, kui hästi mudelis on kajastatud tegelikkuse olised faktid (sugulassuhete uurimisel näiteks pole oliline isikute pikkus).

Loogilise programmeerimise kursuses tegeldakse probleemiga: millised faktid peavad olema kajastatud mudelis (ja kuidas), et see sobiks etteantud/nõutud järelduste tegemiseks, probleemide lahendamiseks jne. Seega on siin tegemist loogilise/otstarbeka mõtlemise/järeldamise uurimisega: milline info on oluline, mis peab olema teada, et leida nõutud seoseid ja suurusi, lahendada antud probleeme?

Selleks on võimatu anda üldisi juhendeid, vastav vilumus (detektiivi vaist) saavutatakse vaid suure hulga näidete läbitegemisega. Seepärast põhineb kogu käesolev kursus suurel hulgal näidetel mitmesugustelt aladelt: sugulassuhetest, mängudest, integreerimisest, loomulikust keelest jms.

Programmeerimiskeel Prolog (Programming in Logic) erineb oluliselt "tavalistest" programmeerimiskeeltest: Basic, Pascal, C jne.

Igasuguse tõsielu ülesande lahendamine arvutiga koosneb sisuliselt kahest osast. Algul on olemas probleem: keegi (tellija) tahab, et arvuti teeks midagi, suudaks vastata mingitele küsimustele (päringutele) jne; probleem on esitatud loomulikus keeles (eesti, inglise), sageli ebatäpselt, sisaldab loogilisi vastuolusid jms. Et arvutiprogrammini jõuda, toimub ülesande konseptuaalne analüüs: milline informatsioon on olemas, mida tahetakse saada, kas olemasoleva informatsiooni põhjal on üldse võimalik leida nõutud info jne. Samm-sammult täpsustatakse probleemi olemust (mida õieti on vaja teha) ja selle esitusviisi arvutis: kuidas (milliste suurustega) kodeerida lähteandmed, milleid andmestruktuure kasutata jne.

Ülesande lahendamise teine etapp: programmeerimine Basicus, Pascalis, C-s või mõnes muus käsukeeles (imperative language) saab alata alles siis, kui ülesande konseptuaalne sisu on täiesti arusaadav. Basicus, Pascalis või C-s koostatud programm kirjeldab arvutile, mida see peab tegema lahenduseni jõudmiseks:

anna muutuja S väärtuseks 0
korda kuni tabel A on läbitud:
lisa muutuja S väärtusele tabeli A järgmine arv

Programmi lugedes ei ole tavaliselt üldse enam arusaadav, millise tegelikkuse probleemi lahendamiseks see oli koostatud; tegelikkuse objektid (isikud, kaubad, ajahetked ja nendevahelised suhted) on asendatud arvutimuutujatega, ja tegelikkuse objektide vahelised suhted (sugulassuhted, kaugused, algusajad jne) - arvutimuutujate andmestruktuuride ja nende manipulatsioonidega.

Loomulikult on programmi tegemisel eelduseks, et programmeerijale on ülesande konseptuaalne sisu (mida täpselt peab tegema lahenduseni jõudmiseks) täiesti selge - muidu ei oleks võimalik tegelikkuse probleemi asendada muutujate manipulatsiooniga. Kuna see esimene, konseptuaalse analüüsi etapp on programmeerimisest oluliselt keerukam, jäetakse see programmeerimisõpetuses sageli üldse kõrvale ja tegelikkuse probleemide lahendamise asemel koostatakse mänguprogramme, mis lahendavad programmeerimiskeskonna probleeme (tee programm, mis küsib kasutaja nime ja toob siis ekraanile teksti "Tere, Juku").

Prologis programmeerides on peatähelepanu just ülesande konseptuaalse sisu analüüsimisel; Prologi programm kirjeldab tegelikkuse objekte ja nendevahelisi suhteid. Sellepärast nimetataksegi Prologi deklaratiivseks, kirjeldavaks keeleks (declarative language). Paljud tavaliste, imperatiivsete programmeerimiskeelte elemendid, näiteks ülaltoodud programminäites kasutatud tsüklikonstruktsioonid (do until, do while, step jms) Prologis puuduvad, sest nad on vajalikud arvuti töö, mitte tegelikkuse probleemi kirjeldamisel (Swi-Prolog-is on siiski olemas mõne sellise käsu analoogid).

Prologi programm ei koosne käskudest arvutile. Prologi programm koosneb faktidest (tõestest väidetest) :

Indreku isa on Andres
ja järeldusreeglitest, mille põhjal saab teadaolevatest tõestest faktidest tuletada uusi:
kui (keegi isik) VanaIsa on (isiku) Isa isa ja
isik Isa on isiku Poeg isa, siis
isik Vanaisa on isiku Poeg vanaisa.

Et neid kaht lauset (fakti ja järeldusreeglit) muuta Prologi programmiks, peab veidi teisendama nende kirjaviisi (süntaksit).
Prologis kirjutatakse järeldusreeglid vastupidises järjekorras: enne järeldus, siis eeldused; järeldust ja eeldusi eraldab märk :- (loe "siis kui"). Isikud on kas konstandid (Indrek, Andres) või muutujad, mille väärtuseks võib olla mingi neist konstantidest (Isa, Poeg, Vanaisa - suur algustäht on Prologis muutuja tunnus, konstandid peab kirjutama väikese algustähega). Konstantide ja muutujate vahelisi suhteid (kes on kelle isa või vanaisa) nimetatakse predikaatideks ja nad kirjutatakse sulgude ette, sulgudes on predikaatide argumendid - konstandid või muutujad, seega korrektse Prologi programmina näeks ülaltoodud laused välja nii:

isa(andres,indrek).
vanaisa(Vanaisa,Poeg) :-
isa(Vanaisa,Isa),
isa(Isa,Poeg).

Eelduste vahel olev koma on "ja" (konjunktsioon) ja nii faktide kui ka reeglite lõpus peab alati olema punkt.
Prologi programmi faktid on tõesed väited ja reeglid võimaldavad kontrollida, kas mingi väide on tõene, s.t. kas seda saab taandada teadaolevatele tõestele faktidele. Kui näiteks peale ülalkirjeldatud fakte oleks programmis veel fakt

isa(indrek,peeter).
oskaks Prolog vastata küsimustele "Kelle vanaisa on Andres?" ja "Kes on Peetri vanaisa?". Küsimus (Prologi termionoloogias - eesmärk või päring) tuleks samuti esitada predikaadina, mille argumentideks on konstandid ja muutujad:
?- vanaisa(andres, Pojapoeg).
Sellise päringu andmisel Prolog arvutab programmis esitatud faktide ja tuletusreeglite abil, et muutuja Pojapoeg väärtus peab olema
?- Pojapoeg = peeter.
seega Prolog on loogika reeglitele põhinev järelduste arvutamise süsteem, mis püüab esitatud päringuid taandada teadaolevatele tõestele faktidele (tõestada) ja kui päringus esinevad muutujad, siis leida neile väärtused, mille korral päring on tõene (tõestatav).

Kuna Prolog tegeleb loogika avaldistega (avaldistega, millel on tõeväärtus), siis kasutab ta ka loogikaoperaatoreid. Peale operaatorite :- (implikatsioon, järeldus) ja , (konjunktsioon, ja, &) võib reeglite paremal pool (s.t. eelduste osas) kasutada ka eitust (not) ja disjunktsiooni ehk"või"-operaatorit (Prologis ;). Operaatoreid võib rakendada vaid faktidele (mitte reeglitele), sellepärast on Prolog esimest järku loogiline arvutus (lausearvutus). Eitust ei või kasutada reegli vasakul pool (reegli peas) olevale faktile (ainult reegli paremal pool), sellepärast on Prolog samaväärne nn. Horni lausearvutusega.

Prologis programeerimisel on peatähelepanu probleemi sisu avamisel (millised faktid on olulised, mida võib faktidest järeldada jne), s.t. probleemi konseptuaalsel analüüsil. Prologi kasutatakse peamiselt raskesti arusaadavate tehisintellekti probleemide lahendamisel - tee otsimisel kaardil või labürindis, planeerimisülesannete lahendamisel, loomuliku keele analüüsil jne. Prologis programmeerimine on väga hea sissejuhatus konseptuaalsesse analüüsi.


Ülesandeid:
1. Inimesi (isikuid) kirjeldatakse väga paljudes andmebaasides ja väga esrinevates formaatides: rahvatikuregistris, juhilubadel, üliõpilasi - ülikooli infosüsteemis jne. Millised andmed (faktid ja suhted) peaks olema isikukirjeldustes, kui seda tahetakse kasutada:
a) isiku elusolevate sugulaste hulgas kõige vanema väljaselgitamiseks;
b) üliõpilasrühmas kõige suurema vendade-õdede arvuga üliõpilase leidmiseks?


Küsimused, probleemid: ©2004 Jaak Henno