我有一个动态列表存储领域的协调和该领域的所有者如何使用动态列表在递归函数中的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”是谓词,而不是列表),它不是列表真的不适合这个目的。你最好为你的棋盘状态制定明确的列表并传递给你,因为操纵实际列表比在动态存储中操纵事实要容易得多。 –