willem

learningLanguage(Willem, Prolog).

Voor de course van APP van mijn opleiding is één van de opdrachten het jezelf aanleren van een nieuwe programmeertaal. Een uitdaging en een vooruitzicht. Het leren van nieuwe technieken en deze proberen toe te passen vind ik altijd wel interessant. De programmeertaal heeft wel een aantal eisen, zoals dat het een volledig ander paradigma moet zijn. De taal die ik gekozen heb is Prolog. Deze taal is logisch. Prolog is een afkorting van “Programming with logic”. De enige talen waar ik momenteel ervaring mee heb zijn voornamelijk object georiënteerd.

Prolog is een afkorting van “Programming with logic”.

Waarom Prolog?

De keuze voor Prolog was voor mij vrij snel gemaakt. Dit alles heeft namelijk een doel. Het behalen van de opdracht. Dit doe ik door het leren van de programmeertaal, het maken van een programmeeruitdaging en dit delen door middel van deze blog. Naar andere talen heb ik ook gekeken, maar ik kon niet direct bedenken wat voor een uitdaging ik zou kunnen maken.

Bij het kennis maken van Prolog had ik direct een tweetal ideeën in mijn hoofd. Prolog is namelijk goed voor AI. Je stelt namelijk een vraag aan Prolog en deze geeft dan het antwoord. Om het antwoord te krijgen moeten wel wat regels etc. worden opgesteld, hier komen we nog op terug. De eerste potentiële uitdaging is maken van een AI voor het spel boter, kaas en eieren. Als dit niet voldoende uitdaging heeft dan zou ik een AI voor een ander spel willen maken. Een andere potentiële uitdaging is het maken van een AI die een Rubiks kubus kan oplossen, enkel weet ik niet of dit mogelijk is of te complex is.

Om te taal te leren moet kennis worden opgedaan, dat is logisch. Om dit te doen maak ik gebruik van de digitale versie van het boek ‘Learn Prolog Now!’ van Patrick Blackburn, Johan Bos, and Kristina Striegnitz. Deze is te vinden op http://www.learnprolognow.org. Momenteel heb ik hoofdstuk 1 van het boek doorgenomen en de opdrachten hiervan uitgevoerd. Ik had wat onzekerheden bij het nakijken van mijn antwoorden, dus heb ik de antwoorden van Peter Urbak gebruikt om mijzelf te controleren. Deze zijn te vinden op https://github.com/dragonwasrobot/learn-prolog-now-exercises. Alle fouten die ik bij mezelf heb ontdekt heb ik duidelijk benoemd, om zo te weten waar ik op moet letten.

Wat viel op?

Prolog is een totaal andere taal dan ik gewend ben. De syntax is volledig anders, de manier van denken moet anders en het is een enorm interessante taal. Bij de meeste talen beschrijven we regels aan de hand van vergelijkingen. Bij Prolog geven we een collectie van feiten en regels. Daarna stellen we een vraag aan Prolog en deze gaat opzoek naar een antwoord. Voor mij is dit een uitdaging om een andere manier van denken aan te leren.

happy(yolanda).
listens2Music(mia).
listens2Music(yolanda):-  happy(yolanda).
playsAirGuitar(mia):-  listens2Music(mia).
playsAirGuitar(yolanda):-  listens2Music(yolanda). 

Hierboven staat een Prolog programma. Dit zijn dus een set regels en feiten. Bij het voor het eerst zien van dit programma snapte ik niet wat er stond, totdat ik begreep dat ‘:-‘ een if statement is. De if van Prolog werkt net andersom dan de if in de meeste talen. De left hand side van de :- is de head en de right hand side van de :- is de body. Als de body waar is dan is de head waar. Het wordt leesbaar door :- te vervangen door if.

listens2Music(yolanda) if happy(yolanda).

Aan dit Prolog programma kunnen we bijvoorbeeld vragen wie er allemaal luchtgitaar spelen. Dit doen we door de volgende query uit te voeren: ‘playsAirGuitar(X)’. X is het variabel waar het antwoord aan wordt toegewezen. Variabelen worden aangegeven door woorden die beginnen met een hoofdletter of beginnen met een underscore, zoals _x.

Zoals te zien in de bovenstaande afbeelding speelt Mia luchtgitaar. Omdat er meer mensen zijn die luchtgitaar spelen kunnen we ook op next drukken. Dit zal in dit geval Yolanda zijn. Het bijzondere aan dit vind ik dat Prolog zelf kan uitzoeken wie luchtgitaar spelen.

Het laatste dat ik wil laten zien van Prolog is het omzetten van tekst naar een programma. Opdracht 1.4 van het boek is zo een opdracht. Hier worden de volgende regels gegeven:

  1. Butch is a killer.
  2. Mia and Marsellus are married.
  3. Zed is dead.
  4. Marsellus kills everyone who gives Mia a footmassage.
  5. Mia loves everyone who is a good dancer.
  6. Jules eats anything that is nutritious or tasty.

Deze regels moeten omgezet worden naar een Prolog programma, welke er dan als volgt uit ziet.

killer(butch).
married(mia,marsellus).
dead(zed).
kills(marsellus, X):- footmassage(X, mia).
loves(mia, X):- goodDancer(X).
eats(jules, X):- nutritious(X); tasty(X).

Tot nu toe vind ik Prolog een geweldige taal om te leren. Ook heb ik enorm veel zin om de rest van de taal te leren en dit te delen. Hoe het gaat uitpakken in de programmeeruitdaging zie ik nog niet voor me. Wil je deze taal ook leren? Begin met het boek Learn Prolog Now!.