Prolog 向任一方向旋转列表 N 次

标签 prolog

所以我的目标是编写一个谓词,如果 N>0 则将列表向右旋转 N 次,如果 N<0 则向左旋转 N 次。到目前为止,这是我的代码,输出为假,除非 N == 0,我不确定我的问题出在哪里。

rotateleft([L|R], N) :-
   append(R, [L], N).

rotateright(L, R) :-
   rotateleft(R, L).

rotate(L,N,R) :-
   (  N = 0 ->
      R = L
   ;  N > 0 ->
      rotateright(L,R),
      N is N-1,
      rotate(L,N,R)
   ;  N < 0,
      rotateleft(L,R),
      N is N+1,
      rotate(L,N,R)
   ).

最佳答案

list_rotated(N, Xs, Ys) :-
   maplist(\_^_^true, Xs, Ys),  % or same_length(Xs, Ys)
   length(Xs, M),
   R is -N mod M,
   length(As, R),
   append(As,Bs, Xs),
   append(Bs,As, Ys).

请注意,此定义具有更好的终止行为。如果其中一个列表的长度已知,它就会终止。

关于Prolog 向任一方向旋转列表 N 次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28920224/

相关文章:

prolog - Prolog 中从 8-Queens 解决方案到更通用的 n-Queens 解决方案

recursion - prolog 中列表的解压

序言。如何检查两个数学表达式是否相同

prolog - 约束 - SWI- Prolog 查询

prolog - 递归中的回溯如何不造成无限循环?

prolog - 我无法理解 Prolog 如何知道 DFA 接受规则中的开始状态

prolog - SWI-Prolog : How to use my own predicate as a condition in when/2

prolog - 序言中列表的总和

python - 安装 PySWIP 以在 Python 中使用 Prolog 时出错

list - 节省空间的功能符号书写