% ?- write('Berechnung der Knoten eines Davidsterns'),nl.
% ?- write('======================================='),nl.
% ?- write('Das Programm berechnet die Knoten eines Davidsterns (12Knoten)'),nl.
% ?- write('mit den Permutationen von 1 bis 12, so dass die Summe auf jeder Seite'),nl.
% ?- write('26 beträgt.'),nl.
%
% ?- write('                       |   Erstes Dreieck:       '),nl.
% ?- write('        X1             |             X1          '),nl.
% ?- write('                       |          X3    X4       '),nl.
% ?- write('X2   X3    X4   X5     |       X6          X7    '),nl.
% ?- write('                       |    X8    X9    X10   X11'),nl.
% ?- write('   X6         X7       |   Zweites Dreieck:      '),nl.
% ?- write('                       |    X2    X3    X4    X5 '),nl.
% ?- write('X8   X9    X10   X11   |       X6          X7    '),nl.
% ?- write('                       |          X9    X10      '),nl.
% ?- write('        X12            |             X12         '),nl,nl.
%
% ?- write('Bitte "loese(X)." eingeben, um die Berechnung zu starten!'),nl,nl.

loese([X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12]):-
        retractall(anz(_)),
        assert(anz(0)),
        Startliste = [1,2,3,4,5,6,7,8,9,10,11,12],
        select(X1,Startliste,Rest01), X1<8,      % sonst können keine 5 größere Ecken existieren

        select(X8,Rest01,Rest02), X1<X8,
        select(X11,Rest02,Rest03),X8<X11,
        select(X10,Rest03,Rest04),
        X9 is 26 - (X8+X11+X10),
        select(X9,Rest04,Rest05),

        select(X3,Rest05,Rest06),
        X6 is 26 - (X1+X3+X8),
        select(X6,Rest06,Rest07),

        select(X7,Rest07,Rest08),
        X4 is 26 - (X1+X7+X11),
        select(X4,Rest08,Rest09),

        select(X2,Rest09,Rest10), X1<X2,
        X5 is 26 - (X2 + X3 + X4), X1<X5,
        select(X5,Rest10,[X12]),
        X12 is 26 - (X2 + X6 + X9), X1<X12,
/*
        retract(anz(I)),
        J is I+1,
        assert(anz(J)),

        nl,
        write(J),write('. Loesung ============================'),nl,
        write('Erstes Dreieck:'),nl,
        write('erste Seite:\t'),write([X1,X3,X6,X8]),nl,
        write('zweite Seite:\t'),write([X8,X9,X10,X11]),nl,
        write('dritte Seite:\t'),write([X11,X7,X4,X1]),nl,nl,

        write('Zweites Dreieck:'),nl,
        write('erste Seite:\t'),write([X2,X6,X9,X12]),nl,
        write('zweite Seite:\t'),write([X12,X10,X7,X5]),nl,
        write('dritte Seite:\t'),write([X5,X4,X3,X2]),nl,
*/
        fail.


/* Gefunden in der Uebung "Logische Programmierung"
vom 03.05.2005 als Teil der Funktion 'Permutation durch Löschen', Funktion 'loesche' und unter
http://ivs.cs.uni-magdeburg.de/~dumke/PSK/LP3.html
Eine Funktion, welche eine Liste schrittweise in den Kopf und den verbleibenden Rumpf zerlegt
X enthällt somit schrittweise alle Einzel-Elemente der Liste. */


select(K,[K|R],R).
select(X,[K|R1],[K|R2]):-
        select(X,R1,R2).

