如何翻译序言中的命令式任务

How to translate an imperative task in prolog

我有一个函子可以计算单个图块的 N-puzzle 域中的曼哈顿距离:

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 求和。 思考势在必行,我会去 for 周期。如何递归实现类似的东西?

我使用 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).

希望对某人有所帮助。