Willem van Dam

ticTacToeWinner

Nu ik de eerste vier hoofdstukken van het boek heb gelezen, heb ik een programma geschreven waar Prolog de winnaar van TicTacToe kan vinden. Het programma laat een klein beetje van de functionaliteiten van Prolog zien.

Zoals eerder gezegd in mijn eerste blog bericht wil ik een AI maken voor Boter Kaas en Eieren (TicTacToe). Dit is het begin. Met dit programma ben ik met Prolog aan het oefenen. Dit programma kan namelijk niet iets voorspellen. Hij kan enkel zeggen wie er gewonnen heeft, als er iemand gewonnen heeft. Het programma ziet er als volgt uit:

winner(X):- format('Winner is ~s', X).
win(X1, X2, X3):- X1 == X2, X2 == X3, winner(X1).
winRow([X1, X2, X3|Tail]):- win(X1, X2, X3); winRow(Tail).
winCross([ 
    X1, _, X4,
    _, X2, _,
    X5, _, X3]):- win(X1, X2, X3); win(X4, X2, X5).

win(X):- winRow(X); winCross(X).

whoWins:- win([
  x, _, _,
  o, x, o,
  x, _, o
  ]).

/** <examples>

?- whoWins.
*/

Download het bestand.

De werking

Het programma heeft een structure whoWins, welke de complex structure win/1 aanroept. Deze geeft de gegeven array door aan de winRow/1 en winCross/1 complex structures. winCross/1 kijkt of ‘x’ of ‘o’ in een kruis gewonnen heeft, dus van links boven naar rechts onder of van rechts boven naar links onder.

Bij winRow/1 wordt recursie gebruikt. Aangezien de items van links naar rechts in een list zitten weten we dat steeds 1 tot 3, 4 tot 6 en 7 tot 9 rijen zijn. Door steeds de eerste drie items van de list te gebruiken en de tail weer door te geven wordt de list door drie gedeeld. Steeds bij deze drie items kijkt hij of een winnaar is in de rij, door de items door te geven aan win/3.

win/1 is de simpelste structure. Deze kijkt enkel of de drie gegeven variabelen hetzelfde zijn, als dit zo is geeft hij de variabel door aan winner/1. Deze structure print tekst waarin staat wie de winnaar is.

Opdracht

Om ook anderen te helpen met het leren van Prolog heb ik een kleine opdracht bedacht. Het programma mist nog een stukje functionaliteit. Dit is het herkennen van een rij van boven naar beneden. Dit kan op meerdere manieren worden opgelost. Download het programma hieronder waar een oplossing in is verwerkt. Succes!

Download het bestand.