Fox and Geese タイプのゲームの AI を書いています。私の述語の1つは次のようになります。
moveFox(+PrevState, -NextState, -PegList, +VisitedStates, -NewVisitedStates)
ゲームの状態を取り、キツネで動きます。結果の状態は で統一されNextState
、実際の動きは で統一されPegList
ます。すべてが期待どおりに機能します。
すべての動きの効用スコアを計算していますNextState
。効用スコアが最も高い州を見つけられるようにするためfindall/3
に、リスト内のすべての州を取得してから、それらの効用スコアを比較します。
findall(NextState, moveFox(...), NextStatesList)
最大の効用スコアを見つけることで、最高の効用スコアを持つものNextState
(およびリスト内の位置) を知ることができます。問題が 1 つだけあります。現在、どの移動が に行われたかを推測する述語を書いていませんNextState
。たとえば、次のようになります。
getMove(+PrevState, +NextState, -PegList)
そのような述語を書く代わりに、私はfindall/3
or と同等のものを使用したいと思います。私の質問は、2 つの異なるリストで 2 つの異なる変数を取得する方法があるかどうかです。私は次のように考えています(うまくいった場合):
findall([NextState, PegList], moveFox(...), [NextStatesList, MoveList])
findall/3
そのような機能を2 回実行したり (醜いオーバーヘッド)、そのgetMove(+PrevState, +NextState, -PegList)
述語を記述したりせずに実装できますか?