Ich versuche also, dieses Problem bei der Kabinenanordnung hier zu lösen. Es ist im Grunde ein Schiebepuzzle, bei dem ein (Stand-) Plättchen einen Zielpunkt erreichen muss und am Ende alle anderen (Stand-) Plättchen an ihrem ursprünglichen Ort sein sollten. Jede Kachel / Kabine hat eine Dimension und folgende sind die Input-Fakten und -Beziehungen:
Eine Beziehung, bestehend aus Fakten der Form Position (B, W, H), die die Anfangsposition (W, H) von Kabine B angibt.
Ein Faktentarget (B, W, H), das das Ziel (W, H) des
angibt
Zielzelle B.
Das Programm soll Eingabe-Fakten aus einer Datei lesen, aber ich versuche nur die Lösung zu machen, also habe ich nur eine mögliche Eingabe kopiert, und ich habe einige grundlegende Klauseln geschrieben:
%Vor%Ich bin neu in Prolog und ich bin fest daran, wie ich von hier aus weitergehen soll. Ich habe die no_overlap-Regel, damit ich testen kann, ob eine Bewegung gültig ist oder nicht, aber ich weiß nicht, wie es mit den aktuellen Klauseln aussieht. Meine aktuellen Klauseln für Moves do / 3 müssen wahrscheinlich modifiziert werden. Irgendwelche Zeiger?.
Sie müssen die Aufgabe in Beziehungen zwischen den Zuständen des Puzzles ausdrücken. Ihre aktuellen Klauseln bestimmen die Gültigkeit eines einzelnen Zuges und können auch mögliche Züge generieren.
Das ist jedoch nicht ausreichend: Sie müssen mehr als nur eine einzelne Bewegung und deren Auswirkung auf eine einzelne Kachel ausdrücken. Sie müssen in irgendeiner Weise den Zustand des gesamten Puzzles kodieren und auch kodieren, wie eine einzelne Bewegung den Zustand der gesamten Aufgabe verändert.
Zunächst einmal empfehle ich Ihnen, über eine Beziehung wie:
nachzudenken %Vor% und drückt die Beziehung zwischen einer gegebenen "Welt" W0
, einer möglichen Bewegung M
und der resultierenden Welt W
aus. Diese Relation sollte so allgemein sein wie generieren , beim Zurückverfolgen, jede Bewegung M
, die in W0
möglich ist. Im Idealfall sollte es sogar funktionieren, wenn W0
eine freie Variable ist, und Sie können dafür folgendes finden: clpfd nützlich: Constraints erlauben Ihnen, arithmetische Relationen viel allgemeiner auszudrücken, als Sie gerade verwenden.
Sobald Sie eine solche Beziehung haben, besteht die ganze Aufgabe darin, eine Sequenz Ms
von Bewegungen zu finden, so dass jede ursprüngliche Welt W0
umgewandelt wird in einen gewünschten Status W
.
Angenommen, Sie haben world0_move_world/3
als Baustein implementiert, können Sie dies wie folgt auf Listen von Moves anwenden (mit dcg getaggte Fragen:
Sie können dann iterative Vertiefung verwenden, um eine kürzeste Sequenz von Zügen zu finden, die das Rätsel löst:
%Vor%