我有一個動態列表存儲領域的協調和該領域的所有者如何使用動態列表在遞歸函數中的Prolog
這個名單的:-dynamic
board/2.
一個條目看起來像這樣:
board(e4,[w]).
還有22個看起來相似的板子位置。
我想實現一個AI的遊戲董事會的目的。 我正在使用alpha測試版算法,因此必須創建新的「板子」來回避這種情況。
我原板的副本來工作,但現在有一個功能調節板當前的舉動是這樣的:
move(position,boardOld,boardNew)
這是在第二個電話boardOld稱爲遞歸因此等於boardNew和boardNew是分析中下一步行動的老闆。
我的想法是舊抄板在每次迭代,但我不知道如何做到這一點,因爲這
copy_predicate_clauses(boardOld(A,B),boardNew(A,B)).
將舊的董事會,因爲名單已經存在添加到newBoard。
我使用以下算法(無法複製它,因爲它是一個圖像):
http://www.cuceinetwork.net/archivos/prolog/The_Art_of_Prolog.pdf
PDF頁面445(書頁407)。
該算法在初始化時將位置定義爲'Board',我不知道如何使用我的列表執行此操作,此外,子句移動(Move,Position,Position1)返回當前移動的新Board。這被稱爲遞歸,我不知道如何爲position1創建電路板而不覆蓋之前的電路板。
編輯//
好的,我得到了問題。但是我在遊戲中已經使用了這個謂詞,並且不想全部改變。我這樣做:
findall((X,Y),board(X,Y),CurrentBoard).
CurrentBoard給了我這樣的
[(e4,[w,w]),(g4,[s,w]),(b7,[r,w,s])]
列表現在我不能用我的方法來確定可能的行動。
我有一個像
move(e4,d5).
move(d5,e6).
說明哪些舉動事實(從,到)是可能的,現在我想這
findall((X,Y),listMoves(CurrentBoard,X,Y),possibleMoves).
像這樣的東西。在這一點上,我很困難。我如何生成可能的移動列表。我不知何故必須從currentBoard獲取X座標,檢查來自該座標的列表頭(該座標上的棋子)是否屬於我,並檢查Y座標(to)是否空閒。
listMoves([Coordinate|[Head|Tail]], X, Y) :-
move(X,Y),
ownField(X,Coordinate,Head),
鑑於缺乏細節,這很難回答(如果不是不可能的話)。 –
我將編輯問題並分享更多詳細信息 – Sven182
您的問題是您試圖將動態存儲作爲列表處理(您自己這麼說,但「board/2」是謂詞,而不是列表),它不是列表真的不適合這個目的。你最好爲你的棋盤狀態制定明確的列表並傳遞給你,因爲操縱實際列表比在動態存儲中操縱事實要容易得多。 –