Mis päev on täna?

Lewis Carolli raamatust "Alice mõistatustemaal" pärinev probleem on heaks konseptuaalse analüüsi harjutusülesandeks. Ühel päeval ei suutnud Alice kuidagi meenutada, milline nädalapäev on täna. Ta oleks saanud seda küsida oma sõpradelt lõvilt või ükssarvelt, kuid nende vastusele ei võinud kunagi kindel olla, sest igal esmaspäeval, teisipäeval ja kolmapäeval lõvi vale tas (teistel päevadel ta rääkis tõtt); ükssarv taas valetas igal neljapäeval, reedel ja laupäeval. Alice oli nutikas tüdruk ja esitas sõpradele küsimuse: "Mida sa tegid eile - valetasid või rääkisid tõtt?"

Mõlemad väitsid, et olid eile valetanud, ja see vastuse põhjal suutis Alice otsustada, mis nädalapäev parajasti on.
Probleemi esitamisel Prologile tuleb kindlasti kirjeldada, kes millal valetas:

valetab(lovi, esmaspäev).
valetab(lovi, teisipäev).
valetab(lovi, kolmapäev).
valetab(ykssarv, neljapäev).
valetab(ykssarv, reede).
valetab(ykssarv, laupäev).

Lahenduse otsimiseks on oluline ka nädalapäevade järjekord (muidu ei ole mõistetav muutuja Eile).

eelmine(esmaspäev, pühapäev).
eelmine(teisipäev, esmaspäev).
eelmine(kolmapäev, teisipäev).
eelmine(neljapäev, kolmapäev).
eelmine(reede, neljapäev).
eelmine(laupäev, reede).
eelmine(pühapäev,laupäev).

Tundmatul nädalapäeval Täna võib keegi Olend (lõvi või ükssarv) väita, et ta eile valetas kahel juhul:

a) kui ta täna ei valeta, siis pidi ta eile tõesti valetama:

ytleb_et_valetas(Olend,Täna):-
eelmine(Täna,Eile),
not(valetab(Olend, Täna)),
valetab(Olend, Eile).

b) ta valetab täna ja rääkis eile tegelikult tõtt:

ytleb_et_valetas(Olend,Täna):-
valetab(Olend, Täna),
eelmine(Täna,Eile),
not(valetab(Olend, Eile)).

Eelnevas on oluline lausete järjekord. Eituse argumendis ei või (sellel hetkel, kui Prologi otsimismehhanism jõuab eitust sisaldava lauseni) kunagi esineda väärtustamata muutujaid. Muutujal ei ole tõeväärtust (mõne väärtuse korral võib muutuja osutuda tõeseks, mõne korral vääraks), muutujal tekib tõeväärtus alles siis, kui muutuja saab väärtuse, sellepärast peab lausele not(valetab(Olend, Täna)) eelnema lause eelmine(Täna,Eile), sest selle lausega saavad muutujad Täna, Eile konkreetsed väärtused. Tundmatu nädalapäeva Täna leidmiseks jääb üle vaid anda päring:

? ytleb_et_valetas(lovi,Täna), ytleb_et_valetas(ykssarv,Täna).

Milline tuleb muutuja Täna väärtus?


Ülesandeid:
1. Millisel päeval (päevadel) oleks Alice saanud küsimusele "Kas Sa räägid homme tõtt?" mõlematelt kinnituse, et nad räägivad homme tõtt? Koosta predikaat, mis leiab kõik sellised päevad!
2. Eespoolvaadeldud küsimused on binaarsed, s.t. kumbki olend võib iga päeva kohta valida vaid kahe vastuse vahel, seega kokku oleks ühe päeva kohta võimalikke vastusevariante vaid 4 (kui tähistada vastused 0,1, siis võimalikud variandid oleks (0,0),(0,1),(1,0), 1,1). Kuna nädalas on 7 päeva, peavad mõnel päeval vastused korduma, s.t. eespoolvaadeldud kahe binaarse küsimusega pole võimalik alati kõikki päevi eristada. Millised päevad "kleepuvad" ülalvaadeldud küsimuste korral kokku, s.t. saadakse samasugused vastused? Millised võiks olla küsimused, mis võimaldaks eristada kõiki nädalapäevi (selliste küsimuste vastus peaks andma rohkem kui ühe biti informatsiooni).


Küsimused, probleemid: ©2004 Jaak Henno