% diamond schreibt einen Diamanten der Größe n diamond(N) :- % obere Hälfte schreiben oben(1,1,N), % untere Hälfte schreiben N2minusNplus2 is N*N - N + 2, unten(N2minusNplus2,1,N). % oben schreibt die obere Hälfte eines Diamanten der Größe N % die obere Hälfte hat N Zeilen oben(_,Zeile,N) :- Zeile > N. % schreibt nacheinander die Zeilen der oberen Hälfte oben(ErsteZahl,Zeile,N) :- Zeile =< N, % eine Zeile schreiben zeile(ErsteZahl,Zeile,N), % und rekursiv die restlichen NaechsteZahl is ErsteZahl + N, ZeilePlus1 is Zeile + 1, oben(NaechsteZahl,ZeilePlus1,N). % unten schreibt die untere Hälfte eines Diamanten der Größe N % die untere Hälfte hat N-1 Zeilen unten(_,Zeile,N) :- Zeile >= N. % schreibt nacheinander die Zeilen der unteren Hälfte unten(ErsteZahl,Zeile,N) :- Zeile < N, % eine Zeile schreiben Anzahl is N - Zeile, zeile(ErsteZahl,Anzahl,N), % und rekursiv die restlichen NaechsteZahl is ErsteZahl + 1, ZeilePlus1 is Zeile + 1, unten(NaechsteZahl,ZeilePlus1,N). % zeile schreibt eine Zeile mit Zahlen zeile(ErsteZahl,Anzahl,N) :- % genügend Leerzeichen davorsetzen N2 is N*N, laenge(N2,Laenge), Tab is (N - Anzahl) * (Laenge + 1), tab(Tab), % Zahlen hinschreiben zahlen(ErsteZahl,1,Anzahl,N). % zahlen schreibt die Zahlen einer Zeile % neue Zeile, wenn alle Zahlen geschrieben sind zahlen(_,Nummer,Anzahl,_) :- Nummer > Anzahl, nl. % schreibt nacheinander die Zahlen einer Zeile zahlen(Zahl,Nummer,Anzahl,N) :- Nummer =< Anzahl, % Zahl hinschreiben zahl(Zahl,N), % Lücke für versetzte Darstellung N2 is N*N, laenge(N2,Laenge), Tab is Laenge + 1, tab(Tab), % restliche Zahlen rekursiv schreiben NaechsteZahl is Zahl - N + 1, NummerPlus1 is Nummer + 1, zahlen(NaechsteZahl,NummerPlus1,Anzahl,N). % zahl schreibt eine Zahl mit der richtigen Ausrichtung zahl(Zahl,N) :- % Platz für die Darstellung berechnen N2 is N*N, laenge(N2,LaengeN2), % Länge der Zahl berechnen laenge(Zahl,LaengeZahl), % Zahl rechtsbündig ausrichten Tab is LaengeN2 + 1 - LaengeZahl, tab(Tab), % Zahl hinschreiben write(Zahl). % laenge berechnet die Länge der Dezimaldarstellung einer Zahl % Ziffern haben die Länge 1 laenge(Zahl,1) :- Zahl < 10. % Länge mehrstelliger Zahlen rekursiv berechnen laenge(Zahl,Laenge) :- Zahl >= 10, ZahlRem10 is Zahl rem 10, laenge(ZahlRem10,L), Laenge is L + 1.