Prolog向左移动或旋转元素
在prolog中,我需要一个关系来将列表向左旋转移动一个元素,这样Prolog向左移动或旋转元素,prolog,Prolog,在prolog中,我需要一个关系来将列表向左旋转移动一个元素,这样 shift([a,b,c,d,e,f,g,h],3,Shifted). 应该产生 Shifted = [d,e,f,g,h,a,b,c] 你能帮我吗 这就是我所拥有的 shift([], []). shift([H|T], L) :- append(T, [H], L). shift(0, L, L) :- !. shift(N, L1, L2) :- N1 is N-1, shift(L1, L),
shift([a,b,c,d,e,f,g,h],3,Shifted).
应该产生
Shifted = [d,e,f,g,h,a,b,c]
你能帮我吗
这就是我所拥有的
shift([], []).
shift([H|T], L) :-
append(T, [H], L).
shift(0, L, L) :- !.
shift(N, L1, L2) :-
N1 is N-1,
shift(L1, L),
shift(N1, L, L2).
可能有更有效的解决方案,但Prolog的美妙之处在于,您可以逻辑地使用它,而不是强制地使用它 这种逻辑上的转变是什么?将列表的
L1=Lx | | | Ly
移动N
位置将给出列表L2=Ly | | Lx
,使得Lx
的长度正好是N
。(注意:此处|
表示串联)。我们如何把它翻译成序言?直截了当:
shift(L1, N, L2) :-
append(Lx, Ly, L1), % L1 is Lx || Ly
append(Ly, Lx, L2), % L2 is Ly || Lx
length(Lx, N). % The length of Lx is N
更新:OP在评论中声明了负面N
的额外要求。在这种情况下,需要对上述内容进行扩展。可以对其进行修改,使实际左移位置为总列表长度减去位置数:
shift(L1, N, L2) :-
N < 0, !, % this is the case for negative N
length(L1, Len),
N1 is Len + N,
shift(L1, N1, L2).
shift(L1, N, L2) :-
append(Lx, Ly, L1), % L1 is Lx || Ly
append(Ly, Lx, L2), % L2 is Ly || Lx
length(Lx, N). % The length of Lx is N
可能有更有效的解决方案,但Prolog的美妙之处在于,您可以逻辑地使用它,而不是强制地使用它 这种逻辑上的转变是什么?将列表的
L1=Lx | | | Ly
移动N
位置将给出列表L2=Ly | | Lx
,使得Lx
的长度正好是N
。(注意:此处|
表示串联)。我们如何把它翻译成序言?直截了当:
shift(L1, N, L2) :-
append(Lx, Ly, L1), % L1 is Lx || Ly
append(Ly, Lx, L2), % L2 is Ly || Lx
length(Lx, N). % The length of Lx is N
更新:OP在评论中声明了负面N
的额外要求。在这种情况下,需要对上述内容进行扩展。可以对其进行修改,使实际左移位置为总列表长度减去位置数:
shift(L1, N, L2) :-
N < 0, !, % this is the case for negative N
length(L1, Len),
N1 is Len + N,
shift(L1, N1, L2).
shift(L1, N, L2) :-
append(Lx, Ly, L1), % L1 is Lx || Ly
append(Ly, Lx, L2), % L2 is Ly || Lx
length(Lx, N). % The length of Lx is N
你试过什么?您具体在哪里遇到问题?一个元素还是n个元素?提示:切掉头部,附加到尾部。我添加了我所说的设计谓词shift/3,它“移位”或“旋转”列表,向左N处。N可以是负数,即向右旋转。谓词应该具有签名移位(+List、+Integer、+List)。请注意,旋转列表的长度应与原始列表的长度相同。您尝试了什么?您具体在哪里遇到问题?一个元素还是n个元素?提示:切掉头部,附加到尾部。我添加了我所说的设计谓词shift/3,它“移位”或“旋转”列表,向左N处。N可以是负数,即向右旋转。谓词应该具有签名移位(+List、+Integer、+List)。请注意,旋转列表的长度应与原始列表的长度相同。您的意思是shift未移动?当我更改为shift时,它与我一起工作,但当我尝试此项时。移位([a,b,c,d,e,f,g,h],-2,移位)。给了我错误长度/2:域错误:
不小于0'预期,发现
-2'此要求不在问题范围内。我正在努力把它添加到回答中哦,是啊,对不起,我忘了添加它谢谢你清楚地解释一切,先生,我真的很感谢你,你的意思是轮班不是轮班?当我换到轮班时,轮班和我一起工作,但当我尝试这一次时。移位([a,b,c,d,e,f,g,h],-2,移位)。给了我错误长度/2:域错误:不小于0'预期,发现
-2'此要求不在问题范围内。我正在努力把它添加到回答中哦,是啊,对不起,我忘了添加它。非常感谢您清楚地解释一切,我真的非常感谢您,先生