Hallo,
so, da hab ich schon wieder ein (Verstaendnis-)Problem mit Prolog.
Ich habe ein Programm geschrieben, dass das 8-Damen-Problem loesen soll:
Das Programm hat mir richtige Loesungen geliefert, nur leider wenn es fuendig geworden ist, die selbe Loesung x-fach... Als ich keinen Nerv mehr hatte hab ich einfach ans ende von checkStellung einen Cut gesetzt und siehe da es laeuft wunderbar, doch warum muss ich ans Ende einer Methode nen Cut setzen, is doch dort eigentlich eh schon vorbei?
Kurz zum Verstaendnis des Programmes:
Ich generiere mir eine Liste mit den Zahlen 1 bis 8, diese stellen die X-Koordinaten auf dem Schachfeld dar, die Stelle an der sie stehen die Y-Koordinate. Da nun keine Dame mehr in der selben Reihe oder Spalte stehen kann muss ich ledig lich noch ueberpruefen ob eine weitere Dame in einer Diagonalen steht. Dies uebernimmt die Funktion checkStellung. Durch checkLeft/checkRight geh ich ab der Zeile in der die aktuelle zu pruefende Dame steht, diagonal das Spielfeld nach links/rechts ab, bis ich an den Rand komme oder eine andere Dame finde, in diesem Fall wird der Vorgang mit fail abgebrochen.
Gruesse
Scotty86
so, da hab ich schon wieder ein (Verstaendnis-)Problem mit Prolog.
Ich habe ein Programm geschrieben, dass das 8-Damen-Problem loesen soll:
Code:
pos([1,2,3,4,5,6,7,8]).
genDamen(Pos) :- pos(X), permutation(Pos,X).
checkLeft(1,_).
checkLeft(_,[]).
%checkLeft(Pos, [Dame|Rest]) :- NextPos is Pos - 1, (Dame == NextPos -> write('FAIL LEFT \n'), fail ; checkLeft(NextPos, Rest)).
checkLeft(Pos, [Dame|Rest]) :- NextPos is Pos - 1, (Dame == NextPos -> fail ; checkLeft(NextPos, Rest)).
checkRight(8,_).
checkRight(_,[]).
%checkRight(Pos, [Dame|Rest]) :- NextPos is Pos + 1, (Dame == NextPos -> write('FAIL RIGHT \n'), fail ; checkRight(NextPos, Rest)).
checkRight(Pos, [Dame|Rest]) :- NextPos is Pos + 1, (Dame == NextPos -> fail ; checkRight(NextPos, Rest)).
checkStellung([]).
checkStellung([CurrentDame|RestDamen]) :- checkRight(CurrentDame,RestDamen),
checkLeft(CurrentDame,RestDamen),
checkStellung(RestDamen), !. %Warum muss ich hier einen Cut machen?
getStellung(X) :- genDamen(X), checkStellung(X).
getAllStellung :- findall(X,(genDamen(X), checkStellung(X)),L), laenge(L,Muh), write(Muh).
Das Programm hat mir richtige Loesungen geliefert, nur leider wenn es fuendig geworden ist, die selbe Loesung x-fach... Als ich keinen Nerv mehr hatte hab ich einfach ans ende von checkStellung einen Cut gesetzt und siehe da es laeuft wunderbar, doch warum muss ich ans Ende einer Methode nen Cut setzen, is doch dort eigentlich eh schon vorbei?
Kurz zum Verstaendnis des Programmes:
Ich generiere mir eine Liste mit den Zahlen 1 bis 8, diese stellen die X-Koordinaten auf dem Schachfeld dar, die Stelle an der sie stehen die Y-Koordinate. Da nun keine Dame mehr in der selben Reihe oder Spalte stehen kann muss ich ledig lich noch ueberpruefen ob eine weitere Dame in einer Diagonalen steht. Dies uebernimmt die Funktion checkStellung. Durch checkLeft/checkRight geh ich ab der Zeile in der die aktuelle zu pruefende Dame steht, diagonal das Spielfeld nach links/rechts ab, bis ich an den Rand komme oder eine andere Dame finde, in diesem Fall wird der Vorgang mit fail abgebrochen.
Gruesse
Scotty86