我正在尝试将用户输入的列表写入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).
答案 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]).
所以你带着不正确的H
。 H
已经在条款的头部处理了,这个新调用的目的是处理尾部(如递归情况的描述所示)。
答案 1 :(得分:0)
...
Call: (10) new_list(0, [d, e], [c, b, a], _G2728)
Call: (11) 0>0
Fail: (11) 0>0
...
似乎你的代码缺少基本情况。很明显,[d,e]
无法与[]
匹配。