如何在prolog中翻译命令式任务
我有一个函子,它可以计算单个平铺的N-拼图域中的曼哈顿距离:如何在prolog中翻译命令式任务,prolog,declarative,Prolog,Declarative,我有一个函子,它可以计算单个平铺的N-拼图域中的曼哈顿距离: distanzaTile(Stato, Pos, Dis) :- dim(D), nth0(Pos, Stato, Elem), Elem == v, Y is floor(abs((9 - (Pos + 1))/D)), X is mod(abs(9 - (Pos + 1)), D), Dis is X+ Y. !. distanzaTile(Stato, Pos, Dis) :- dim(D),
distanzaTile(Stato, Pos, Dis) :-
dim(D),
nth0(Pos, Stato, Elem),
Elem == v,
Y is floor(abs((9 - (Pos + 1))/D)),
X is mod(abs(9 - (Pos + 1)), D),
Dis is X+ Y.
!.
distanzaTile(Stato, Pos, Dis) :-
dim(D),
nth0(Pos, Stato, Elem),
Y is floor(abs((Elem - (Pos + 1))/D)),
X is mod(abs(Elem - (Pos + 1)), D),
Dis is X+ Y.
其中,Stato
是一个数组,Pos
是考虑到的数组中的当前位置,Dis
是实际结果。
现在,我必须循环遍历Stato
的所有元素,并对所有Dis
s求和。
思考命令式,我会做一个
循环。如何递归地实现类似的功能?我使用Stato
作为输入和计数器,如下所示:
ricorri(_, [], _, A, A).
ricorri(Stato, [_|T], Pos, In, Out) :-
distanzaTile(Stato, Pos, Dis),
Pos2 is Pos + 1,
In2 is In + Dis,
ricorri(Stato, T, Pos2, In2, Out).
希望它可以帮助别人。我使用了Stato
作为输入和计数器,如下所示:
ricorri(_, [], _, A, A).
ricorri(Stato, [_|T], Pos, In, Out) :-
distanzaTile(Stato, Pos, Dis),
Pos2 is Pos + 1,
In2 is In + Dis,
ricorri(Stato, T, Pos2, In2, Out).
希望它能帮助别人。那么,你的stato
结构是什么?是一个整数列表吗?那么stato
是类似于L=[1,2,…]
?@damianodamiano YesSo,你的stato
的结构是什么?是一个整数列表吗?那么stato
就像L=[1,2,…]
?@damianodamiano是的,但是,即使你不使用T
,为什么还要插入[[T]
?要检查Stato的每个元素(如果这是一个列表),您可以执行类似于[H | T]
的操作,其中在H
中有Stato
的第n个元素……我使用该列表来控制递归进程。既然没有而或用于循环,我就想出了这个主意。但是,为什么你要插入[\u124; T]
,即使你不使用T
?要检查Stato的每个元素(如果这是一个列表),您可以执行类似于[H | T]
的操作,其中在H
中有Stato
的第n个元素……我使用该列表来控制递归进程。由于在
或
循环中没有,所以我提出了这个想法。