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/3or と同等のものを使用したいと思います。私の質問は、2 つの異なるリストで 2 つの異なる変数を取得する方法があるかどうかです。私は次のように考えています(うまくいった場合):
findall([NextState, PegList], moveFox(...), [NextStatesList, MoveList])
findall/3そのような機能を2 回実行したり (醜いオーバーヘッド)、そのgetMove(+PrevState, +NextState, -PegList)述語を記述したりせずに実装できますか?