如何在prolog中翻译命令式任务

如何在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),

我有一个函子,它可以计算单个平铺的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),
  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个元素……我使用该列表来控制递归进程。由于在
循环中没有
,所以我提出了这个想法。