Loogilisi keerdülesandeid

Prolog-i tüüpiliste näidisülesannete hulka kuuluvad alati mitmesugused loogilised keerdülesanded, sest ülesandes (loomulikus keeles) esitatud tingimuste tõlkimine Prologi predikaatideks ja reegliteks on väga hea kontseptuaalse analüüsi harjutus.

1. (Lewis Carrol, "Alice Imedemaal").
Keegi oli varastanud kogu suhkru. Kahtluse alla sattusid jänes, mütsitegija ja unihiir, kuid oli ka võimalik, et varas oli keegi tundmatu. Küsitluse ajal väitsid kahtlustatavad:
Jänes: "Ükskõik kes ka varastas, aga mina ei ole varas!"
Mütsitegija: "Varas on keegi meist, kuid mitte mina!"
Unihiir: "Jänes rääkis tõtt!"

Kuna asi näis keeruline, küsiti ka öökullilt (kes alati kõike teadis). Öökull teatas: "Kas jänes või unihiir valetas! Võibolla valetasid mõlemad!"

Nende andmete alusel suudab Prolog leida varga.

Kahtlustavad:

kahtlustatav(jänes).
kahtlustatav(unihiir).
kahtlustatav(mytsitegija).

Varas oli kas keegi kahtlustatavatest või (kui kui see pole võimalik) keegi tundmatu:

varas(Varas):-
kahtlustatav(Varas).
varas(tundmatu).

Eelnevas predikaadis on oluline lausete järjekord - tundmatut hakatakse uurima alles siis, kui varast kahtlustatavate hulgast ei leita.

Mida kahtlustatvad ja tark öökull ütlesid?

ytles(jänes,Varas):-
varas(Varas),
not(Varas=jänes).

ytles(mytsitegija,Varas):-
kahtlustatav(Varas),
not(Varas=mytsitegija).

ytles(unihiir,Varas):-
ytles(jänes,Varas).

ytles(öökull,Varas):-
not(ytles(jänes,Varas)).

ytles(öökull,Varas):-
not(ytles(unihiir,Varas)).

Kuna täiesti kindel võib olla vaid öökulli tunnistuses ja öökull nagunii hindas kahtlustatavate antud tunnistusi, võib varga leida öökulli tunnistuse põhjal; kuna öökulli predikaadis muutuja Varas satub kohe eituste alla, peab enne lausega varas(Varas) andma muutujale Varas väärtuse:

lahenda:-
varas(Varas),
ytles(öökull,Varas),
write('Varas on: '),
write(Varas).

Päringule

?- lahenda.

vastusena teatabki Prolog varga.


Ülesandeid:
1. Lewis Carrol esitas palju teisigi keerdülesandeid, mis samuti on väga sobivad Prolog-ile.
Kord oli kogu sool kadunud. Kapsauss väitis: "Sisalik Bill sõi kogu soola!". Selle peale ütles sisalik: "Muidugi, alati süüdistatakse just mind!". Irvik Kass väitis, et tema ei söö üldse kunagi soola.
Öökull (taas teab kõike) teatas, et vähemalt üks neist kolmest valetas, kuid vähemalt üks rääkis ka tõtt. Kes oli soolavaras?
2. Ärtuemand, Kalakelner, Irvik Kass ja Sisalik Ville mängisid palli ja keegi neist lõi palliga akna katki. Hiljem rääkisid nad juhtunust nii:

Ärtuemand:
- mina akent ei lõhkunud ;
- mängu algas Sisalik;
- ka Irvik Kass ei ole süüdlane.

Kalakelner:
- mina pole süüdlane;
- seda tegi Irvik Kass;
- mina mängin palju paremini kui Ville.

Irvik Kass:
- mina ei löönud palli aknasse;
- kui ma oleks teadnud et nii läheb ma poleks üldse tulnud mängima;
- ärtuemand pole süüdlane.

Sisalik Ville:
- mina akent ei lõhkunud;
- seda tegi Irvik Kass;
- kui ma kohale jõudsin mäng juba käis.

Osutus, et kõigi tunnistustest üks oli vale ja üks - tõsi. Kes lõhkus akna?

3. Kaljukotkas, Märtsijänes, Irvik Kass, Kalakelner ja Sisalik Ville korraldasid võidujooksu. Tulemustest rääkisid nad hiljem nii:

Kaljukotkas:
- Kalakelner tuli teiseks;
- mina olin kolmas.

Märtsijänes:
- mina olin parim!
- Irvik Kass oli teine.

Kalakelner:
- mina olin teine;
- sisalik jäi neljandaks.

Sisalik Ville:
- mina olin eelviimane;
- võitja oli Kaljukotkas.

Kõigi väidetest üks oli tõsi ja teine vale. Kuidas võidujooks lõppes?

4. Mõrvamüsteerium (Agathe Cristie Paldiski rongi ununenud paberitest). Krõõt, tema mees, poeg ja vend on kõik segatud mõrvas - üks neist on tapnud kellegi teise neist. Teada on:
1. Mõrv tehti rannal.
2. Mees ja naine olid mõrva ajal koos baaris.
3. Üks lastest oli mõrva ajal üksi.
4. Krõõt ja tema abikaasa ei olnud mõrva ajal koos.
5. Tapja ja ohver ei olnud kaksikud.
6. Tapja oli noorem kui ohver.
Kes olid tapja ja ohver?
5. Kolm sõpra, kellel olid erinevad nimed, erinev rahvus ja kes armastasid erinevat spordiala tulid programmeerimisvõistlusel esimesele, teisele ja kolmandale kohale.
Kriketimängija tuli esimeseks; Mihkel armastab korvpalli ja oli programeerimises parem kui austraallane; juut Simon oli parem kui tennisemängija.
Kes oli austraallane ja mis sporti armastab Richard?
Lahendus
6. Lasteaias on 5 last; nende eesnimed on Kati, Liisa, Mark, Nora ja Otto; perekonnanimed (mitte samas järjekorras!) on Falk, Gant, Hall, Ivanov ja Juurikas; lapsed on erivanused, kahest kuue aastani.
Üks lastest on Liisa Juurikas.
Kati on aasta vanem kui Ivanov, kes omakorda on aasta vanem kui Nora.
Falk on kolm aastat vanem kui Nora.
Otto on kaks korda vanem kui Hall.
Koosta programm laste ees-, perekonnanimede ja vanuste leidmiseks.
7. Laual on kolm pildikaarti, näoga allapoole. Toomas, Jüri ja Tarmo püüavad ära arvata, milline pilt on millisel kaardil:
  Esimene
kaart
Teine
kaart
Kolmas
kaart
Toomas
sõdur
äss
kuningas
Jüri
sõdur
emand
äss
Tarmo
kuningas
emand
äss
Osutus, et üks neist arvas kõik valesti, ühel oli kaks õiget ja ühel - kolm õiget arvamust. Millised kaardid laual olid ? Tee predikaat, mis leiab laual olnud kaardid.
8. Neli poissi ja neli tüdrukut moodustavad neli tantsupaari.
Poistel on erinevat värvi mütsid: sinine, punane, must ja roheline; tüdrukutel on samuti erinevad mütsid: punane, sinine, pruun ja kollane. Ka kõigi tantsupartnerite mütsid on erinevat värvi.
Punase mütsiga poiss tantsib rohelise mytsiga tydrukuga ja sinise mütsiga poisi parneril ei ole kollane ega sinine müts.
Millised on võimalikud ylejäänud tantsupaaride mütside värvkombinatsioonid ja mitu võimalust paaride moodustamiseks on?
9. Peeter, Juss ja Mati on huvitatud nii arvuti- kui ka maleklubist, kuid kuna need kogunevad samal ajal, ei pääse keegi neist mõlemasse. Peeter ja Juss ei saa omavahel läbi, sellepärast nad ei lähe samasse klubisse; ka Juss ja Mati ei ole nõus samas klubis käima. Kaksikud Peeter ja Mati otsustasid, et vähemalt üks neist läheb arvutiklubisse. Kuhu klubisse keegi läheb?
10. Ühel väikesel Inglismaa tänaval oli viis maja. Igaühes neist elas erinevast rahvusest isik, iga maja oli ise värvi, igas majas suitsetati erinevaid sigarette, joodi erinevat jooki ja peeti erinevat lemmikelukat. Teada on, et: Millises majas peetakse sebrat ja millises majas juuakse vett? Mit
Tee ka predikaat, mis leiab kõigi erinevate vastuste arvu!


Küsimused, probleemid: ©2004 Jaak Henno