Practicumopgave 4: Prolog

Download Report

Transcript Practicumopgave 4: Prolog

Practicumopgave 4: Prolog
Modelleren en Programmeren 2015/2016
Deadline: Woensdag 27 januari 2016, 23:59
Samenvatting
In de vierde inleveropdracht ga je een systeem maken om informatie
bij te houden over concerten die je kunt bezoeken. Het systeem bevat
een database voorzien van informatie over het genre, de locatie, datum en
prijs van elk concert. Je houdt bij hoeveel geld en tijd je besteed hebt,
en wat de ecologische voetafdruk is van je reis van en naar een concert.
Het systeem moet opdrachten kunnen accepteren van de gebruiker, in
Prolog-predicaten en in natuurlijke taal. Tenslotte moet het systeem een
beoordeling geven van de kwaliteit van de gevolgde planning.
1
Data
Het eerste gedeelte van de opdracht gaat over de representatie van de database.
De lijst concerten vind je in Bijlage B. Informatie over reizen staat in Tabel 1.
De locatie van verschillende steden in kilometers oost en zuid vanaf een punt in
de Noordzee vind je in Bijlage A. Zet deze gegevens om in Prolog-feiten. Kies
zelf een handige representatie. Schrijf een hulppredicaat afstand/3 om uit te
rekenen wat de afstand is tussen twee plaatsen1 . Gebruik dit predicaat voor de
hulppredicaten tijd/4, prijs/4, voetafdruk/4 die gegeven twee plaatsen en
een vervoermiddel respectievelijk uitrekenen hoeveel tijd, geld en CO2 het kost
om de reis te maken. Schrijf een predicaat naarconcert/6 die gegeven een
componist of artiest, een datum en een vervoermiddel uitrekent hoeveel tijd,
geld en CO2 het kost om vanuit Utrecht naar dit concert te gaan.
1 Om
het niet te ingewikkeld te maken gebruiken we de rechtstreekse afstand.
vervoermiddel
fiets
auto
trein
snelheid (km/u)
20
100
110
prijs (ct/km)
0
13
15
voetafdruk (gram CO2 /km)
0
109
30
Tabel 1: Overzicht vervoermiddelen
1
2
Gebruikersinterface
Neem een aantal dynamische feiten op in de code die bijhouden welke dag het is,
waar je bent, hoeveel geld je hebt, hoeveel CO2 je hebt gebruikt en een lijst van
concerten die je hebt bezocht. Je begint op 1 mei met 500 euro. Schrijf een predicaat toon programma/0 dat voor de komende week alle concerten weergeeft.
Neem aan dat elke maand 30 dagen heeft. Schrijf een predicaat ga naar/2 dat,
gegeven een componist/artiest en een vervoermiddel, de dynamische feiten met
de juiste waardes aanpast (met retract,assert) en op het scherm zet, ervan
uitgaande dat je vanuit Utrecht naar het concert gaat en weer terug. Hierbij
gelden bepaalde voorwaardes: het concert moet op de huidige dag zijn en je
kunt niet meer dan 100 kilometer per dag fietsen. Schrijf ook een predicaat
blijf slapen/2 waarmee je alleen de heenreis maakt en dan naar het concert
gaat. Ergens blijven slapen kost 25 euro per dag. Je kunt per dag maar een concert bezoeken, schrijf ook een predicaat slaap/1 waarmee je de datum vooruit
kan zetten met het in het argument opgegeven aantal dagen.
Schrijf een DCG om in natuurlijke taal opdrachten aan het systeem te kunnen geven. Deze moet in ieder geval de volgende zinnen herkennen:
1. Ga naar [artiest/componist] met de [vervoermiddel].
2. Ga met de [vervoermiddel] naar [artiest/componist].
3. Neem de [vervoermiddel] naar [artiest/componist].
4. Ik wil naar [artiest/componist] met de [vervoermiddel].
5. Ga naar [artiest/componist] met de [vervoermiddel] en blijf slapen.
6. Slaap een dag.
7. Slaap 1 dag.
8. Slaap [aantal] dagen.
Gebruik de ingebouwde predicaten read line to string/2 om een string in te
lezen vanuit toetsenbord-invoer, split string/4 om van de string een lijst te
maken en =../2, call/1 om een predicaat samen te stellen uit een lijst en
vervolgens uit te voeren.
3
Kwaliteit
Schrijf predicaten om uit te rekenen per genre hoeveel concerten je hebt bezocht.
Bereken hoeveel steden je hebt bezocht als percentage van het totaal. Schrijf
een recursief predicaat steden/2 dat gegeven de query steden(L,[]) een lijst
L met steden genereert uit een aantal losse feiten (bijvoorbeeld de locatie-feiten
die je bij het eerste onderdeel hebt gemaakt). Gebruik member/2, maar verder
geen ingebouwde predicaten. Let op: de recursie bouwt zowel op als af en het
2
basisgeval staat onder het recursiegeval in plaats van erboven. Geef strafpunten
voor steden die meerdere keren bezocht zijn, volgens de formule 2aantal − 1
(zodat steden die een keer bezocht zijn 20 − 1 = 0 strafpunten krijgen).
Gegeven zijn de volgende drie ASCII-dieren:
__ (\_
(_ \ ( ’>
) \/_)=
(_(_ )_
(
">
)(
// )
--//""-__
<(o )___
( ._> /
‘---’
Toon als statistiek 1 dier per 20 kilo CO2 . Gebruik het ingebouwde predicaat
random/3 om willekeurig een dier te kiezen. Rond af naar hele dieren. Vergeet
niet om de speciale tekens quote, backslash en underscore te voorzien van een
escape-character in Prolog.
Bonus: in plaats van afronden per dier, rond af per regel (elk dier heeft 4
regels) of per karakter.
Bonus: zet dieren naast elkaar in rijtjes van 5 in plaats van onder elkaar.
Bijlage A
Afstandstabel
Tabel 2: Coördinaten van Nederlandse plaatsen,
waardes bij benadering
plaats
Leeuwarden
Groningen
Den Helder
Heerenveen
Emmen
Alkmaar
Hoorn
Zwolle
Haarlem
Amsterdam
Almelo
km oost
185
220
110
195
245
110
135
205
85
103
225
3
km zuid
18
18
45
44
65
81
80
95
108
110
110
Amersfoort
Apeldoorn
Hengelo
Enschede
Den Haag
Utrecht
Arnhem
Rotterdam
Dordrecht
Nijmegen
Goes
Breda
Tilburg
Eindhoven
Venlo
Maastricht
Bijlage B
Genre
klassiek
pop
metal
Componist/artiest
Dvorak
Shostakovich
Tschaikovsky
Stravinsky
Borodin
Mussorgsky
Glazunov
Khachaturian
Prokoviev
Rachmaninoff
Scriabin
Janacek
Mahler
Martinu
Kovacs
Typhoon
The Wombats
Onerepublic
Kensington
Placebo
Four Tet
Gallowstreet
H09909
The Mysterons
Rhodes
Roosbeef
The Undertones
Liam Finn
After Forever
Agent Steel
Children of Bodom
Deicide
Dimmu Borgir
Ill Nino
Life of Agony
Mastodon
Nightwish
Oomph
Shadows Fall
Slayer
Soulfly
Biohazard
135
175
235
241
62
117
171
95
85
165
32
95
115
142
190
160
135
120
123
120
145
142
155
161
175
175
208
200
202
215
222
280
Overzicht concerten
Speelschema
Den Helder 22-7-2016, Emmen 14-5-2016, Apeldoorn 1-7-2016, Den Haag 2-5-2016, Enschede 9-6-2016
Tilburg 21-5-2016, Zwolle 29-6-2016, Almelo 21-5-2016, Den Helder 16-6-2016, Leeuwarden 12-5-2016
Rotterdam 24-7-2016, Haarlem 22-7-2016, Den Haag 1-6-2016, Leeuwarden 15-6-2016, Goes 3-5-2016
Emmen 10-6-2016, Enschede 22-6-2016, Eindhoven 20-6-2016, Goes 15-7-2016, Tilburg 5-6-2016
Heerenveen 23-6-2016, Groningen 21-5-2016, Enschede 29-5-2016, Tilburg 29-6-2016, Leeuwarden 25-5-2016
Nijmegen 9-6-2016, Leeuwarden 14-7-2016, Groningen 11-6-2016, Hoorn 5-5-2016, Tilburg 29-7-2016
Almelo 11-6-2016, Den Haag 1-5-2016, Utrecht 15-7-2016, Hengelo 26-5-2016, Nijmegen 29-6-2016
Amsterdam 4-7-2016, Arnhem 11-5-2016, Haarlem 27-5-2016, Venlo 4-7-2016, Goes 19-5-2016
Heerenveen 15-6-2016, Haarlem 24-7-2016, Emmen 24-7-2016, Rotterdam 24-7-2016, Den Helder 27-7-2016
Den Helder 10-7-2016, Amersfoort 26-5-2016, Nijmegen 15-7-2016, Dordrecht 29-5-2016, Eindhoven 26-6-2016
Enschede 14-7-2016, Amersfoort 15-7-2016, Enschede 6-5-2016, Enschede 1-5-2016, Emmen 22-7-2016
Hoorn 3-7-2016, Venlo 22-6-2016, Eindhoven 27-5-2016, Den Haag 28-6-2016, Nijmegen 15-7-2016
Rotterdam 24-5-2016, Groningen 11-6-2016, Den Haag 27-7-2016, Tilburg 3-6-2016, Apeldoorn 9-5-2016
Heerenveen 22-5-2016, Breda 25-7-2016, Amsterdam 29-5-2016, Amsterdam 6-6-2016, Zwolle 6-7-2016
Goes 3-7-2016, Utrecht 18-7-2016, Den Helder 26-6-2016, Den Haag 13-5-2016, Arnhem 2-7-2016
Breda 23-5-2016, Rotterdam 2-7-2016, Dordrecht 1-7-2016, Den Helder 1-6-2016, Amsterdam 6-7-2016
Almelo 19-5-2016, Arnhem 18-5-2016, Apeldoorn 22-5-2016, Venlo 4-7-2016, Breda 22-7-2016
Alkmaar 19-7-2016, Heerenveen 4-6-2016, Den Helder 10-5-2016, Apeldoorn 13-6-2016, Nijmegen 3-6-2016
Goes 22-7-2016, Apeldoorn 15-6-2016, Enschede 14-6-2016, Alkmaar 12-6-2016, Leeuwarden 22-5-2016
Arnhem 1-6-2016, Tilburg 2-7-2016, Breda 16-7-2016, Hoorn 10-7-2016, Den Helder 17-5-2016
Arnhem 20-6-2016, Apeldoorn 16-7-2016, Hengelo 11-7-2016, Apeldoorn 1-6-2016, Maastricht 4-6-2016
Apeldoorn 26-7-2016, Rotterdam 22-5-2016, Utrecht 24-5-2016, Rotterdam 14-5-2016, Eindhoven 21-5-2016
Amersfoort 14-6-2016, Apeldoorn 14-5-2016, Den Helder 19-7-2016, Alkmaar 23-7-2016, Utrecht 19-5-2016
Goes 27-5-2016, Breda 3-5-2016, Den Helder 3-7-2016, Tilburg 4-6-2016, Alkmaar 22-5-2016
Maastricht 23-5-2016, Emmen 21-5-2016, Haarlem 13-6-2016, Hengelo 4-5-2016, Breda 10-6-2016
Goes 6-6-2016, Zwolle 8-7-2016, Leeuwarden 19-6-2016, Hengelo 6-6-2016, Maastricht 1-7-2016
Rotterdam 28-6-2016, Utrecht 2-5-2016, Den Haag 14-6-2016, Amsterdam 28-7-2016, Den Haag 6-5-2016
Alkmaar 28-6-2016, Leeuwarden 18-7-2016, Goes 23-5-2016, Apeldoorn 6-5-2016, Zwolle 3-5-2016
Hoorn 8-7-2016, Heerenveen 25-6-2016, Groningen 12-5-2016, Maastricht 21-5-2016, Hoorn 13-5-2016
Maastricht 29-5-2016, Enschede 1-5-2016, Apeldoorn 27-5-2016, Haarlem 3-7-2016, Rotterdam 16-5-2016
Dordrecht 9-5-2016, Utrecht 26-7-2016, Amsterdam 20-5-2016, Leeuwarden 11-6-2016, Emmen 23-6-2016
Den Haag 8-5-2016, Zwolle 2-5-2016, Zwolle 10-5-2016, Den Helder 6-7-2016, Zwolle 11-7-2016
Arnhem 4-5-2016, Hoorn 9-5-2016, Zwolle 28-7-2016, Utrecht 3-6-2016, Amersfoort 11-6-2016
Groningen 6-7-2016, Amsterdam 16-7-2016, Tilburg 20-5-2016, Hoorn 25-7-2016, Groningen 5-7-2016
Leeuwarden 6-6-2016, Apeldoorn 21-7-2016, Leeuwarden 6-5-2016, Nijmegen 14-5-2016, Goes 16-5-2016
Groningen 24-6-2016, Almelo 21-5-2016, Apeldoorn 12-7-2016, Dordrecht 3-5-2016, Breda 10-5-2016
Haarlem 23-5-2016, Amersfoort 1-6-2016, Apeldoorn 15-6-2016, Heerenveen 10-6-2016, Eindhoven 19-5-2016
Haarlem 24-6-2016, Emmen 2-7-2016, Amersfoort 4-6-2016, Hengelo 13-6-2016, Goes 13-7-2016
Tilburg 27-7-2016, Arnhem 18-7-2016, Eindhoven 1-7-2016, Amsterdam 20-5-2016, Breda 6-7-2016
Almelo 16-5-2016, Venlo 20-5-2016, Almelo 22-6-2016, Den Helder 6-7-2016, Venlo 19-7-2016
Rotterdam 12-7-2016, Alkmaar 23-6-2016, Goes 6-5-2016, Goes 19-7-2016, Den Haag 12-7-2016
Enschede 25-7-2016, Zwolle 4-6-2016, Rotterdam 6-5-2016, Zwolle 1-5-2016, Leeuwarden 6-5-2016
4
Prijs
17
24
20
19
18
11
21
20
17
10
16
10
13
10
11
11
14
18
21
19
17
13
24
15
19
14
16
12
23
18
14
11
18
11
13
21
20
21
11
18
17
17