Schiebe ein Kachelpuzzle mit unterschiedlicher Kachelgröße durch logische Programmierung

8

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 Tatsache des Formraums (W, H), der die Breite W und die Breite angibt Höhe H des Raumes (3 ≤ W, H ≤ 20).
  • Eine Tatsache Kabinen (B), die
    gibt die Anzahl der Kabinen an (1 ≤ B ≤ 20).
  • Eine Beziehung, die besteht von Fakten der Formdimension (B, W, H), die die Breite W angibt und Höhe H von Kabine B.
  • 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.

  • Ein zusätzlicher Fakthorizont (H) gibt eine Obergrenze an die Anzahl der auszuführenden Züge.

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?.

    
Wajahat 01.10.2017, 04:59
quelle

1 Antwort

7

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: 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 getaggte Fragen:

%Vor%

Sie können dann iterative Vertiefung verwenden, um eine kürzeste Sequenz von Zügen zu finden, die das Rätsel löst:

%Vor%     
mat 05.10.2017 22:42
quelle

Tags und Links