2013-04-10 32 views
5

Tôi đang viết AI cho một loại trò chơi Fox và Geese. Một trong các biến vị ngữ của tôi trông giống như sau:Prolog findall/3: nhiều hơn một túi

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

Trạng thái trò chơi và di chuyển với con cáo. Trạng thái kết quả được hợp nhất với NextState và di chuyển thực tế được hợp nhất với PegList. Mọi thứ hoạt động như mong đợi.

Tôi đang tính điểm số tiện ích cho tất cả các bước di chuyển 'NextState. Để có thể tìm thấy tiểu bang có điểm số tiện ích cao nhất, tôi sử dụng findall/3 để nhận tất cả các tiểu bang trong danh sách trước khi so sánh điểm số tiện ích của họ.

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

Bằng cách tìm điểm số tiện ích tối đa, tôi biết NextState (cũng như vị trí của nó trong danh sách) với điểm số tiện ích cao nhất. Chỉ có một vấn đề, hiện nay tôi đã không viết bất kỳ vị để suy ra mà di chuyển đã được thực hiện đến NextState, ví dụ .:

getMove(+PrevState, +NextState, -PegList) 

Thay vì viết một vị như vậy, tôi thà sử dụng findall/3 hoặc tương đương. Câu hỏi của tôi là nếu có một số cách để có được hai biến khác nhau trong hai danh sách khác nhau. Tôi đang nghĩ như thế này (nếu nó đã có thể làm việc):

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

Tôi có thể thực hiện chức năng như vậy mà không cần phải hoặc là chạy findall/3 hai lần (overhead xấu xí) hoặc viết rằng getMove(+PrevState, +NextState, -PegList) vị?

Trả lời

3

vấn đề này có thể được giải quyết việc xây dựng một danh sách các cặp, và sau đó tách các yếu tố, như thư viện (pairs) không

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

Nếu Prolog của bạn không có pairs_keys_values ​​/ 3, thật dễ dàng để viết với danh sách bản đồ hoặc thông qua một vị từ đệ quy. Đây là cách bản đồ:

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

Cảm ơn bạn đã trả lời quá nhanh! Nó làm việc như một say mê. –