2013-04-10 24 views
5

Bir Fox ve Geese oyun türü için AI yazıyorum. Benim tahminlerimden biri şunun gibi:Prolog findall/3: Birden fazla çanta

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

Bir oyun durumu alır ve bir tilki ile bir hareket yapar. Ortaya çıkan durum NextState ile birleştirilmiştir ve gerçek hareket PegList ile birleştirilmiştir. Herşey beklendiği gibi çalışır.

Tüm hareketlerin 'NextState için yardımcı programını hesaplıyorum. En yüksek yarar skoruyla durumu bulabilmek için findall/3 numaralı telefonu kullanıyorum. Maksimum yarar puanı bularak

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

Ben en yüksek yarar skoru NextState (listede yanı sıra konumunu) biliyorum. Tek bir sorun şu anda ben NextState gelmeye yapıldığı hamle anlaması için herhangi bir yüklemi, ör .: yerine böyle bir yüklemi yazma

getMove(+PrevState, +NextState, -PegList) 

yazmadım vardır, ben daha ziyade findall/3 veya eşdeğerini kullanmak. Benim sorum iki farklı listede iki farklı değişken almak için bir yol varsa. (Işe yarardı varsa) böyle düşünüyorum:

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

Böyle işlevselliğini uygulamak Could iki kez (çirkin havai) findall/3 çalıştırmak veya getMove(+PrevState, +NextState, -PegList) yüklemi olduğunu yazmaya ya kalmadan? senin Prolog pairs_keys_values ​​/ 3 yoksa

cevap

3

bu sorun kitaplığı gibi unsurları çiftleri bir listesini oluşturmaya ve sonra ayrılması başa çıkılabilecek (pairs)

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

yapar, bu kolay ya harita listesiyle ya da özyinelemeli bir yazarak yazın. İşte harita listesi yolu:

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

Çok hızlı cevapladığınız için teşekkürler! Bir çekicilik gibi çalıştı. –