2016-03-24 15 views
0

Ich bin ein Prolog-Neuling, der an einer Aufgabe arbeitet, die mir enorme Schwierigkeiten bereitet. Ich muss ein Programm schreiben, das ein n durch n Puzzle löst; Das Prädikat der Lösung hat zwei Parameter: game(Size, SolList) wobei Größe die Größe des Boards und SolList die Lösung des Puzzles in Form einer Liste ist. Hier ist der Code durch den Professor zur Verfügung gestellt um die Karte zu erzeugen:Zugriff auf eine Liste in Prolog außerhalb ihres Prädikats

generate_board(N, Board) :- 
    generate_board(N, N, Board), !. 

generate_board(0, _, []). 
generate_board(1, Columns, [LastRow]) :- 
    row(Columns, LastRow). 
generate_board(Rows, Columns, [R1|RestOfBoard]) :- 
    row(Columns, R1), 
    NewRows is Rows - 1, 
    generate_board(NewRows, Columns, RestOfBoard). 

das Rätsel zu lösen erfordert bestimmte Felder auf dem Brett „Klicken“. Was ich tun möchte, ist eine Liste der Quadrate zu generieren - zum Beispiel, wenn Size = 5, würde die Liste eine Länge von 25 und gehen von 0 bis 24 - in (wenn möglich) das generate_board/2 Prädikat. Ich möchte dann, dass Prolog sich an diese Liste erinnert und bei Verwendung eines anderen Prädikats das Rätsel lösen und Lösungen präsentieren, die "Klicks" auf die notwendigen Elemente meiner Liste registrieren und sie in der Konsole ausgeben. Ich kenne keine Möglichkeit, die lokale Art der Listen in Prolog zu umgehen, und daher weiß ich nicht, wie ich diese Hürde überspringen soll.

+2

Der übliche Weg, sich die Liste "zu merken", besteht darin, sie als Argument zu übergeben. Sie benötigen nur ein Hauptprädikat, das Ihr 'generate_board' aufruft, um die Liste zu generieren, und dann diese Liste zu verwenden, um Ihr Prädikat aufzurufen, das das Rätsel löst. * ZB *, 'do_puzzle: - erzeuge (L), löse (L) .'. – lurker

+0

Gahh, leider arbeite ich gerade an einem Essay, so dass ich deinen Vorschlag eine Weile nicht durchsetzen kann, aber das macht Sinn. Ich habe ein 'generate_permutations/2'-Prädikat, das teilweise fertig ist (es gibt mehrere Lösungen für das Puzzle, wenn man Größe = 2 oder 3, glaube ich, also der Name), also versuche ich das herauszufinden (har har) und bekomme 'generate_board' drin. Ich vermute, ich werde mehr fragen müssen, bevor der Tag fertig ist. Ich fühle mich immer noch etwas verloren und bin schon zu meinem Prof gegangen. – quantumferret

Antwort

1

Wenn Sie die Liste nicht einfach so weitergeben können, wie es in den Kommentaren vorgeschlagen wurde, wäre es ein guter Weg, sich daran zu erinnern, indem Sie es aktivieren und zurückziehen.

So zum Beispiel:

setup_board :- 
    generate_board(5, L), 
    assert(board(L)). 

do_something :- 
    retract(board(L)), 
    process_board(L, L1), 
    assert(board(L1)). 

Sie tun müssen, damit vorsichtig sein, though. Wenn process_board(L, L1) fehlschlägt, wurde Ihre Karte zurückgezogen, aber es wurde keine neue Karte aktiviert.

Sie können diese dieses Problem beheben, indem Sie den Prolog mit "if -> dann":

do_something :- 
    retract(board(L)), 
    (process_board(L, L1) -> assert(board(L1)) ; assert(board(L))). 

Mit anderen Worten, wenn process_board(L, L1) gelingt es, das neue Board behaupten, da sonst den alten Vorstand wieder geltend.

Verwandte Themen