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?
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:
- inglane elab punases majas
- hispaanlasel on koer
- norralane elab vasakult esimeses majas
- kollases majas suitsetatakse sigarette "Cool"
- rebase omanikust järgmises majas suitsetatakse sigarette "Chesterfield"
- norralase naaber elab sinises majas
- sigarettide "Winston" suitsetaja peab madusid
- sigarettide "Lucky Strike" suitsetaja joob apelsinimahla
- ukrainlane joob teed
- jaapanlane suitsetab sigarette "Parlament"
- hobusepidaja naaber suitsetab sigarette "Cool"
- rohelises majas juuakse kohvi
- pruunist majast järgmine (paremal) on roheline
- keskmises majas juuakse piima
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