Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Prolog向左移动或旋转元素_Prolog - Fatal编程技术网

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),

在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(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'此要求不在问题范围内。我正在努力把它添加到回答中哦,是啊,对不起,我忘了添加它。非常感谢您清楚地解释一切,我真的非常感谢您,先生