Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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
List 在Prolog中将现有列表写入新列表_List_Recursion_Prolog - Fatal编程技术网

List 在Prolog中将现有列表写入新列表

List 在Prolog中将现有列表写入新列表,list,recursion,prolog,List,Recursion,Prolog,我正在尝试将用户输入的列表写入Prolog中的新列表。我已经想出了如何使用反向方法来实现它,而且效果很好。我的问题是,我需要它在用户输入的元素和列表一起停止(这样我可以在添加列表的其余部分之前再次重复此值)。例如,如果我要输入 repeat_nth(3, [a,b,c,d,e], X). 它的产出应该是 X = [a,b,c,c,d,e]. 当我试图引入一个变量'N'来计数,直到要重复的元素prolog告诉我'no'。这是我的密码: new_list(N,[H|T],A,L2):- N &

我正在尝试将用户输入的列表写入Prolog中的新列表。我已经想出了如何使用反向方法来实现它,而且效果很好。我的问题是,我需要它在用户输入的元素和列表一起停止(这样我可以在添加列表的其余部分之前再次重复此值)。例如,如果我要输入

repeat_nth(3, [a,b,c,d,e], X). 
它的产出应该是

X = [a,b,c,c,d,e].
当我试图引入一个变量'N'来计数,直到要重复的元素prolog告诉我'no'。这是我的密码:

new_list(N,[H|T],A,L2):- N > 0,
    N1 is N - 1,
    new_list(N1,T,[H|A],L2). 
new_list(0,[],A,A).
repeat_nth(N,L1,L2):- new_list(N,L1,[],L2).

您的代码似乎缺少基本情况。很明显,
[d,e]
无法匹配
[]

谓词可以从几个案例中构建。如果你先从逻辑上考虑它们,然后用一两句话来表达它们,这有助于确定从句

基本情况:重复第一个元素(
H
,元素编号1)的列表,
[H | T]
是头(
H
)出现两次的列表。尾部(
T
)保持不变:

repeat_nth(1, [H|T], [H,H|T]).
递归案例:对于N>1,要重复列表的第N项
[H | T]
,我在头上(
H
)复制,然后重复第一个列表尾部(
T
)的第(N-1)项(
N1是N-1
),这是第二个列表的尾部(
T1
):

以上两条就是所需要的。您在评论中描述的一次尝试非常接近!错误在第二条的最后一行。你试过:

repeat_nth(N1, [H|T], [H|T1]).

因此,您携带了不正确的
H
H
已在子句的开头处理,此新调用的目的是处理尾部(如递归案例的描述所示)。

第一个子句倒计时并将元素复制到新的累加器列表中(按相反顺序)。这基本上是可以的,但请记住,当你完成后,你将不得不颠倒列表。但是您的基本情况假设当
N
倒计时到零时,您正好处于输入列表的末尾。换句话说,
new\u list
只有在输入列表的长度正好为
N
时才会成功。另外,
new\u list
谓词实际上并不在任何地方复制第n个元素。基本情况是在这个特定的实现中,您希望这样做。正如提示:对于这个特定的问题,您不需要累加器,并且可以避免执行“反向”操作。对于
N>1
的情况,你需要一个谓词
repeat\N(N[H\T],[H\T1])
,另一个谓词
repeat\N(1[H\T],[H,H\T])。
谢谢,我使用了相反的方法,这样我可以看到结果,然后实现计数器等等,这样我可以分阶段构建它,因为我发现递归很难理解。。不幸的是我还是不明白。。通过使用您的建议,我仍然得到“singleton变量”错误。。我只是不知道为什么!我读过无数关于递归和列表的网站,我的大脑现在乱七八糟,我真的不明白(演示如何使用我给出的提示。
N>1
的第一个子句(
repeat\N(N[H\T],[H\T1])
需要为其编写一些代码。第二个独立。@mbrach我尝试了许多不同的变体。。首先,我声明了转义谓词(空的一个):'repeat\N(0,[],[])“然后我试着从减少N的提示开始,并反馈给它,这样它就会递归:'repeat|nth(N[H|T],[H|T1]):-N>1,N1是N-1,repeat|nth(N1[H|T],[H|T1])“在一个递归语句中,我以前写过除法,计数器在回调语句后递减,所以我也尝试了这种方法,但它不起作用..你给我的提示行是将列表串联起来还是额外的代码需要这样做?哦,我知道我需要去掉头..我没有想到最简单的方法..不是sen回到第一条!非常感谢你的帮助!!@HollyMarieBatchelor酷,我很高兴它有帮助。
repeat_nth(N, [H|T], [H|T1]) :-
    N > 1,
    N1 is N-1,
    repeat_nth(N1, T, T1).
repeat_nth(N1, [H|T], [H|T1]).