2013-04-10 8 views
5

Scrivo AI per un tipo di gioco Fox and Oche. Uno dei miei predicati appare così:Prolog findall/3: più di una borsa

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

Ci vuole uno stato di gioco e fa una mossa con una volpe. Lo stato risultante è unificato con NextState e lo spostamento effettivo è unificato con PegList. Tutto funziona come previsto.

Sto calcolando il punteggio di utilità per tutte le mosse "NextState. Per essere in grado di trovare lo stato con il punteggio più alto di utilità, io uso findall/3 per ottenere tutti gli stati in una lista prima di confrontare i loro punteggi di utilità.

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

Trovando il punteggio massimo di utilità So che il NextState (così come la sua posizione nella lista) con il punteggio più alto di utilità. C'è solo un problema, attualmente non ho scritto alcun predicato per inferire che mossa è stata fatta per venire a NextState, ad es .:

getMove(+PrevState, +NextState, -PegList) 

Invece di scrivere un tale predicato, preferirei di gran lunga usare findall/3 o equivalente. La mia domanda è se c'è un modo per ottenere due variabili differenti in due elenchi diversi. Sto pensando in questo modo (se avrebbe funzionato):

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

Potrei implementare tale funzionalità senza dover eseguire sia findall/3 due volte (brutto in testa) o scrivere che getMove(+PrevState, +NextState, -PegList) predicato?

risposta

3

questo problema può essere affrontato la costruzione di un elenco di coppie, e quindi separare gli elementi, come la biblioteca (pairs) fa

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

Se il Prolog non ha pairs_keys_values ​​/ 3, è facile scrivi sia con maplist o tramite un predicato ricorsivo. Ecco il modo maplist:

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

Grazie per aver risposto così velocemente! Ha funzionato come un fascino. –