P. 1
Assignment

Assignment

|Views: 10|Likes:
Published by darkebe

More info:

Published by: darkebe on Nov 08, 2011
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

10/10/2013

pdf

text

original

Declaratieve Talen Prolog 1

1

Inleiding

In deze oefenzitting is het de bedoeling dat je meer vertrouwd geraakt met de werking van Prolog, meer bepaald met SWI-Prolog.

1.1

SWI-Prolog opstarten & gebruiken

In de PC-klassen kan je SWI-Prolog opstarten met het commando prolog. De SWI-Prolog manual is te vinden in http://www.swi-prolog.org/pldoc/refman/. Als je vragen hebt over SWI-Prolog kan je daar dus altijd terecht. De manual vertelt je onder andere dat je een zelf geschreven bestand bestand.pl (gebruik bij voorkeur de .pl extensie) kan inladen door aan de prompt het volgende te typen: | ?- [’bestand.pl’]. of | ?- [bestand]. Zulk een bestand bevat de Prolog clauses van je programma, bvb. a(X) :- b(X), c. b(5). Vervolgens kan je aan de prompt queries uitvoeren. Om SWI-Prolog af te sluiten gebruik je halt. (<CTRL>-D). Vergeet ook niet dat Prolog case sensitive is. Variabelen moeten beginnen met een hoofdletter.

1

gebruik je | ?. Uiteraard staat de volledige beschrijving van de debugger uitgebreid in de manual beschreven. Als je de uitvoering wil onderbreken bij het oproepen van een bepaald predicaat. Om je query stap voor stap uit te voeren. waaronder: • <ENTER> (creep) om naar de volgende stap te gaan • s (skip) om over de huidige stap te ‘stappen’ (= de stap uitvoeren. en voer je je query vervolgens uit. of | ?.2 De debugger De debugger in SWI-Prolog is je beste vriend tijdens het schrijven van al je Prolog programma’s. 2 . • t (backtrace) om heel de uitvoeringstrace te zien tot op het huidige punt • ? om de lijst van mogelijke acties te krijgen Om de tracer terug af te zetten gebruik je notrace/0. Spypoints verwijderen doe je met | ?.spy(predicaatnaam/ariteit). om een spypoint te zetten. zonder er dieper op in te gaan) • r (retry) om de laatst uitgevoerde query opnieuw uit te voeren.nospy(predicaatnaam/ariteit). typ je aan de prompt | ?. maar we geven hier alvast een korte samenvatting van de meest gebruikte commando’s. en je wil onderzoeken waarom die faalde. of | ?. Dit kan bijvoorbeeld handig zijn als je net s gebruikt hebt. Tijdens elke stap kan je verschillende acties uitvoeren.1.nospy(predicaatnaam). Naast het snel opsporen van fouten in je programma’s laat die ook toe om te snappen hoe je programma (en Prolog in het algemeen) werkt.spy(predicaatnaam). Let op: predicaat/ariteit geeft gewoon aan hoeveel argumenten een predicaat heeft. de query faalde.trace.

• Aan het eind van elke oefenzitting wordt een gequoteerde oefening opgegeven die binnen een bepaalde termijn (meestal 24 uur) opgelost dient te worden.v. 2 Sibling vader(anton. vader(anton.bart).. 3 Gegeven zijn de volgende familierelaties: . Je kan op elk moment alle debugging informatie opvragen m.3 Nog wat praktische zaken • Aanwezigheid op de DT oefenzittingen is verplicht.b. debug/0.. Vergeet deze niet te tekenen. vader(anton.v. body_n. ee • Gebruik de volgende layout voor je Prolog clauses (zowel tijdens de oefenzittingen als voor de gequoteerde oefeningen): – Voor clauses met ´´n body literal: ee head :. 1. of head :body. – Voor clauses met meerdere body literals: head :body_1.of met nospyall/0 (om ze allemaal te verwijderen). het debugging/0 predicaat.b. body_2. Er zal dan ook elke oefenzitting een namenlijst rondgaan ter ondertekening.elisa). Zet wel je debugger aan alvorens je je query uitvoert m. De debugger uitschakelen doe je met nodebug/0.daan). . • Het is aan te bevelen om individueel de oefeningen te maken en niet samen te werken aan ´´n PC. Voor meer nuttige tips om te debuggen verwijzen we je door naar de SWIProlog manual..body. Voor deze gequoteerde oefeningen is samenwerking niet toegestaan.

Toch gaat er hier iets mis.anton \== bart. Doe een aantal queries en kijk met de debugger wat er precies gebeurt. Wat? En waarom? Kan je dit verbeteren? Gebruik eventueel de debugger.Z). moeder(gerda.peano_plus(X.vader(X.Y).s(Z)) :.Y) waarbij X en Y dezelfde vader ´n moeder e hebben. Bvb. Je kan de feiten uit de vorige oefening gebruiken om op te experimenteren.Y. vader(Z.Y.hendrik).bart).gerda). Wat valt je op bij de oplossingen? Kan je daar iets aan doen? Je kan gebruik maken van \==/2 dat slaagt als twee termen niet (bewijsbaar) gelijk zijn. 4 Peano Positieve getallen in logica: 0 stellen we voor door het atoom nul en de opvolger van een getal X door s(X). X = s(s(s(nul))) 1 Het predicaat plus/3 is voorgedefinieerd.daan).Y) :.vader(fabian.peano_plus(s(s(nul)).X). 4 . Maak een predicaat sibling(X. ?. Een plausibele oplossing zou zijn: voorvader(X. en een voorbeeld query is ?. en dus moeten we een andere naam gebruiken.Y).Y) :voorvader(X. voorvader(X.X.X). moeder(celine. moeder(celine.anton). moeder(celine.Z). Zo kan peano_plus/3 op de volgende manier gedefinieerd worden:1 peano_plus(nul. peano_plus(s(X).s(nul). Yes 3 Familieperikelen Stel dat we een predicaat willen maken dat de ’voorvader’ relatie illustreert.

B2 ).R) met L de linkerdeelboom.R) D het resultaat is bij deling van X door Y.4. en R de rest.D.Bemerk het onderscheid tussen predicaten enerzijds (bvb.leeg). Een lege boom wordt voorgesteld door het atoom leeg en een niet-lege boom door een term knoop(L.leeg). onwaar. Dit is een voorbeeld van een mogelijke query met antwoord: 5 .2. Schrijf een predicaat eval/2 dat een Booleaanse formule reduceert tot waar of onwaar volgens de regels van de Booleaanse algebra. and(B1 .Y. • maximum/3 zodat voor maximum(X.Z) Z gelijk is aan de grootste van X en Y. Maak gebruik van de ingebouwde aritmetiek en is/2.leeg))). D = 3 6 Booleaanse Formules Een Booleaanse formule wordt voorgesteld door ´´n van de volgende Prolog ee termen: waar. R de rechterdeelboom en W een waarde.knoop(knoop(leeg. Tip: Begin met een basisgeval (zoals 0 + x = x) en schrijf vervolgens een clause die het algemene geval stapsgewijs reduceert tot het basisgeval (bvb.Y. Bijvoorbeeld: ?.Z) de relatie tussen X.2. • groter dan/2 zodat groter dan(X. peano_plus/3) en termen die gebruikt worden als data (bvb.3.W . or(B1 .leeg).B2 ) en not(B) waarbij B. (x + 1) + y = (z + 1) ⇐⇒ x + y = z). Y en Z in X −Y = Z voorstelt.Y) slaagt als X (strict) groter is dan Y en anders faalt.diepte(knoop(leeg. Kan je min/3 ook schrijven in functie van peano_plus/3? En vice versa? Extra: Schrijf het predicaat deel/4 zodat voor deel(X.1.diepte(knoop(knoop(leeg. 5 Diepte We stellen bomen voor als Prolog termen. s(s(X))). Schrijf een predicaat diepte/2 dat de diepte van een boom bepaalt.Y. D = 2 ?.1.D).D). B1 en B2 opnieuw Booleaanse formules zijn.knoop(leeg. Schrijf nu de volgende predicaten: • min/3 zodat min(X.

X = onwaar 6 .X).eval(and(or(not(waar).?.waar).onwaar).

You're Reading a Free Preview

Download
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->