2013-04-10 20 views
5

Ich schreibe AI für einen Fox and Geese Spieltyp. Einer meiner Prädikate sieht wie folgt aus:Prolog findall/3: mehr als eine Tasche

moveFox(+PrevState, -NextState, -PegList, +VisitedStates, -NewVisitedStates) 

Es dauert eine Spielzustand und macht eine Bewegung mit einem Fuchs. Der resultierende Zustand wird mit NextState vereinheitlicht und die tatsächliche Bewegung wird mit PegList vereinheitlicht. Alles funktioniert wie erwartet.

Ich berechne den Nutzen Punktzahl für alle Züge 'NextState. Um den Status mit der höchsten Nutzenpunktzahl zu finden, verwende ich findall/3, um alle Zustände in einer Liste zu erhalten, bevor Sie ihre Nutzenwerte vergleichen.

findall(NextState, moveFox(...), NextStatesList) 

durch den maximalen Nutzen Punktzahl zu finden, ich kenne die NextState (wie auch seine Position in der Liste) mit dem höchsten Nutzen-Score. Es gibt nur ein Problem, das derzeit habe ich geschrieben kein Prädikat zu schließen, die sich bewegen zu NextState kommen wurde gemacht, z.B .:

getMove(+PrevState, +NextState, -PegList) 

Statt ein solches Prädikat zu schreiben, würde ich viel lieber findall/3 oder gleichwertige verwenden. Meine Frage ist, ob es eine Möglichkeit gibt, zwei verschiedene Variablen in zwei verschiedene Listen zu bekommen. Ich bin wie das Denken (wenn es funktioniert hätte):

findall([NextState, PegList], moveFox(...), [NextStatesList, MoveList]) 

Könnte ich eine solche Funktionalität implementieren, ohne entweder findall/3 zweimal mit laufen (hässlich Overhead) oder dass getMove(+PrevState, +NextState, -PegList) Prädikat schreiben?

Antwort

3

kann dieses Problem, und dann die Trennung der Elemente, wie Bibliothek (pairs) tut

... 
findall(NextState-PegList, moveFox(...), Pairs), 
pairs_keys_values(Pairs, NextStates, Pegs), 
... 

Wenn Ihr Prolog nicht pairs_keys_values ​​haben/3, ist es einfach für den Aufbau einer Liste von Paare in Angriff genommen werden schreibe entweder mit maplist oder über ein rekursives Prädikat. Hier ist der Maplist Weg:

pkv(K-V, K, V). 
pairs_keys_values(Pairs, Keys, Vals) :- 
    maplist(pkv, Pairs, Keys, Vals). 
+0

Danke für die Antwort so schnell! Es hat wie ein Zauber funktioniert. –