% achter een procentteken volgt een commentaar regel.
% prolog programma dat de torens van hanoi oplost.
%
% voor i,j in {1,2,3} en verschillende, drukt het
% prediktaat hanoiij(aantal,algedanezetten,allezetten),
% uit dat om de bovenste aantal schijven van pen i naar pen j
% te verplaatsen, de algedanezetten dient uit te breiden
% tot allezetten.
%
% als we nul (z) schijven moeten verplaatsen, van pen 1 naar pen 3
% dan hoeven we de algedanezetten (M) niet uit te breiden,
% dus kunnen we die ook nemen als allezetten.

hanoi13(z,M,M).

% de predikaatlogische formule die met dit programma overeenkomt is 
% voor all M hanoi13(z,M,M).
%
% als we meer dan nul (s(X)) schijven moeten verplaatsen, van pen 1 naar pen 3
% dan verplaatsen we eerst (recursief) alle (X) schijven op de onderste na, van
% pen 1 naar pen 2, wat leidt een uitbreiding (MO12) van de algedanezetten (MI).
% dan verplaatsen we onderste schijf van pen 1 naar pen 3,
% en ten slotte verplaatsen we alle (X) schijven van pen 2 naar pen 3, 
% leidend tot een uitbreiding (MO) van de de eerdere uitbreiding met
% eerst de zet van 1 naar 3, en dan die zetten. 

hanoi13(s(X),MI,MO) :- hanoi12(X,MI,MO12),hanoi23(X,m13(MO12),MO).

% we hebben voor ieder paar i,j van stapels analoge predikaten
% die uitdrukken hoe je een aantal schijven van stapel i naar
% stapel j kunt verplaatsen, met gebruikmaking van hulpstapel 6-i-j.

hanoi12(z,M,M).
hanoi12(s(X),MI,MO) :- hanoi13(X,MI,MO13),hanoi32(X,m12(MO13),MO).
hanoi21(z,M,M).
hanoi23(s(X),MI,MO) :- hanoi21(X,MI,MO21),hanoi13(X,m23(MO21),MO).
hanoi23(z,M,M).
hanoi21(s(X),MI,MO) :- hanoi23(X,MI,MO23),hanoi31(X,m21(MO23),MO).
hanoi31(z,M,M).
hanoi31(s(X),MI,MO) :- hanoi32(X,MI,MO32),hanoi23(X,m31(MO32),MO).
hanoi32(z,M,M).
hanoi32(s(X),MI,MO) :- hanoi31(X,MI,MO31),hanoi12(X,m32(MO31),MO).

% programma in swipl in te laden met:
%
% [hanoi].
%
% typische query:
%
% hanoi13(s(s(z)),e,M).
%
% geeft als antwoord:
%
% M = m23(m13(m12(e))).
%
% de rij van zetten nodig om twee stenen
% van pen 1 naar pen 3 te verplaatsen
% door de eerste steen tijdelijk op pen 2 te leggen
