Ich denke, was @KarolyHorvath wollte, dass du teilst, war, wie man das Board in Prolog darstellt, zusammen mit allen Ideen, die du versucht hast, dies selbst zu lösen. Im Folgenden verwende ich eine Liste von Listenrepräsentationen, wobei die inneren Listen Zeilen und deren Elemente Symbole oder Atome sind (einfache Kleinbuchstaben, um es einfach zu halten).
Das Problem ist in gewissem Sinne eine Verallgemeinerung von lateinischen Quadraten, die in jeder Zeile und in jeder Spalte genau eines von jedem Symbol erfordern. Umranden Sie ein lateinisches Quadrat mit einer neuen Zeile und Spalte, die nur ein neues Symbol enthält, das sonst nicht im lateinischen Quadrat angezeigt wird, und Sie haben eine Lösung, die den Anforderungen Ihres Problems entspricht.
Das heißt, das Problem befasst sich mit einer teilweise fertiggestellten rechteckigen Platte, die nicht unbedingt quadratisch und mit dem Symbol-Frequenzen, die von Reihe zu Reihe und Spalte zu Spalte variieren.
Für kleinere Boards wie in Ihrem Example Board, einem 3x3-Array, ist der Brute-Force-Ansatz verlockend. Es gibt jedoch einige einfache Dinge zu codieren, um die Suche effizienter zu halten.
Einige Reihe und einige Spalte muss „Konstante“ sein, das heißt sie nur einen Buchstaben enthalten. Ich denke, ich würde dies zur obersten Wahl im Suchbaum machen, d. H. Eine Zeile und eine Spalte wählen, die ein einzelner Buchstabe sein kann. Beachten Sie, dass, da jede Zeile jede Spalte schneidet, wir den gleichen Buchstaben für diese Zeile und Spalte verwenden.
Aber bevor Sie für die Lösung gesucht werden sollen, müssen Sie die Daten eingeben, die das Board mit seinen „gegeben“ Einträgen darstellen. Verwenden Sie Ihr eigenes Urteil darüber, aber für vernünftige Größe Boards können Sie wahrscheinlich mit der Aufforderung an einen Benutzer, die Anzahl der Zeilen und die Anzahl der Spalten eingeben und dann sie Zeile für Zeile für die Einträge aufgefordert werden.
Beachten Sie, dass der Prolog Begriff Leser will Eingabe durch einen Punkt beendet werden. So könnte Eingang in etwa so funktionieren:
Enter a list of all letters: [a,b,c].
How many rows? 4.
How many cols? 4.
Enter a row as a list: [_,_,b,a].
Enter a row as a list: [b,_,_,c].
Enter a row as a list: [c,_,_,_].
Enter a row as a list: [_,a,_,_].
Der Unterstrich wirkt als anonymen Variable am Eingang und läßt die entsprechende Liste der Listeneinträge, die den Board als freie Variablen.
Sie damit die Liste aller Buchstaben in Ihrem Programm mit darstellen:
Symbols = [a,b,c]
und der Platine mit einer Liste der Liste, die wie folgt aussehen könnte: es
Board = [[A1,A2,b,a],[b,B2,B3,c],[c,C2,C3,C4],[D1,a,D3,D4]]
In dem speziellen Beispiel ist nur eine Möglichkeit, um alle Zeilen und Spalten auf den gleichen Buchstaben zu setzen, und zwar indem Sie in der zweiten Spalte und der letzten Zeile alle a:
Board = [[A1,a,b,a],[b,a,B3,c],[c,a,C3,C4],[a,a,a,a]]
Aber jetzt finden wir die Suche nach Lösungen läuft in einem blinden Ende. Die zweite Reihe hat alle drei Buchstaben, aber in einer Reihe der Länge vier ist es unmöglich, dass die drei Buchstaben jeweils gleich oft erscheinen. Es gibt keine Lösung für dieses Beispiel.
jedoch das „keine Lösung“ Ergebnis ziemlich effizient erreicht wurde.
Hoffentlich gibt Ihnen einige Ideen, wie den allgemeinen Lösungsprozess in Prolog zu codieren.
Hausaufgabe, richtig? –
Ja, natürlich. Es ist eine Art von Hausaufgaben :) – mastah
bitte posten Sie die Darstellung des Vorstands und alle Ideen, die Sie kommen könnten. –