Προβλήματα Αναζήτησης
Ν Βασίλισσες στο Σκάκι Ν-Queens Problem Ν=8. Πώς τοποθετούμε 8 βασίλισσες σε μια σκακιέρα χωρίς κάποια βασίλισσα να απειλεί μια άλλη; Αναπαραστούμε τις θέσεις των βασιλισσών με μια λίστα των y-συντεταγμένων τους: [Y1, Y2, Y3, ..., Y8] solution (X) :- permutation ([1, 2, 3, 4, 5, 6, 7, 8], X), safe (X). Παράδειγμα "generate and test"
Ν Βασίλισσες (συνέχεια) safe ([]) safe ([Queen | Others]) :- safe (Others), noattack (Queen, Others,1). noattack (Queen, [], XPosition). noattack (Y, [Y1 | Rest], Xdist) :- Y1 – Y ≠ Xdist, Y – Y1 ≠ Xdist, Dist = Xdist + 1, noattack (Y, Rest, Dist). permutation ([], []). permutation ([X | L], P) :- permutation (L, L1), insert (X, L1, P).
Ν Βασίλισσες (συνέχεια) Αναπαράσταση της θέσης μιας βασίλισσας: pos (X, Y) – συντεταγμένες Απάντηση/λύση θα είναι μια λίστα: [pos (X1, Y1), pos (X2, Y2), …, pos (X8, Y8)] [pos (1, Y1), pos (2, Y2), …, pos (8, Y8)] correct ([]). correct ([pos ( X, Y) | Rest]) :- correct (Rest), member (Y, [1, 2, 3, 4, 5, 6, 7, 8]), %Choise noattack (pos (X, Y), Rest).
Ν Βασίλισσες (συνέχεια) % noattack (QueenPosition, ListQueensPositions) noattack (Queen, []). noattack (pos (X, Y), [post (X1, Y1) | Rest]) :- X ≠ X1, Y ≠ Y1, Y1 – Y ≠ X1 –X, Y – Y1 ≠ X – X1, noattack (pos (X, Y), Rest). solution (X) :- template (X), correct (X). template ([pos (1, Y1), pos (2, Y2), …, pos (8, Y8)]). ? solution (X)
Πύργοι της Χανόη (Towers of Hanoi) Κάθε κίνηση μόνο ένα δίσκο. Σε καμμíα κατάσταση δεν μπορούμε να έχουμε δίσκο πάνω από μικρότερο δίσκο. hanoi (s (o), A, B, C, [move (A, B)]). hanoi (s (N), A, B, C, Moves) :- hanoi (N, A, C, B, Moves1), hanoi (N, B, A, C, Moves2), append (Moves1, [move (A, C) | Moves2], Moves). H μεταβλητή Moves κρατά τη λύση σε μια δομή δεδομένων που αποφάσισε ο χρήστης. A B C