将现有列表写入Prolog中的新列表

时间:2013-12-06 23:44:34

标签: list recursion prolog

我正在尝试将用户输入的列表写入Prolog中的新列表。我已经想出如何使用反向方法来做它并且它工作正常。我的问题是我需要它停止用户输入的元素和列表(所以我可以在添加列表的其余部分之前再次重复此值)。例如,如果我要输入

repeat_nth(3, [a,b,c,d,e], X). 

其输出应为

X = [a,b,c,c,d,e].

当我尝试引入一个变量'N'来计数,直到要重复的元素prolog告诉我'不'。这是我的代码:

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

2 个答案:

答案 0 :(得分:2)

谓词可以从几个案例中建立起来。如果你首先从逻辑上考虑它们并用一两句话表达它们,它可以帮助确定条款。

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

repeat_nth(1, [H|T], [H,H|T]).

递归案例:N> 1,重复列表[H|T]的第N个术语,我复制头部(H),然后重复尾部的第(N-1)个术语(N1 is N-1)(第一个列表的T),这是第二个列表的尾部(T1):

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]).

所以你带着不正确的HH已经在条款的头部处理了,这个新调用的目的是处理尾部(如递归情况的描述所示)。

答案 1 :(得分:0)

...
Call: (10) new_list(0, [d, e], [c, b, a], _G2728)
Call: (11) 0>0
Fail: (11) 0>0
...

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