5

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)述語を記述したりせずに実装できますか?

4

1 に答える 1