在列表的末尾添加N个字符

时间:2019-12-15 21:13:25

标签: prolog

在Prolog中,我需要在列表末尾添加N个字符。 如果没有库或maplist,则查找命令。

我尝试了这段代码,该代码以递归方式创建了更多以“ e”字符结尾的列表,但我需要一个列表。

append_e(_,0,[]). 
append_e(List,E_size_loop,[ListTemp|List0]):- 
   E_size_loop>0, 
   N2 is E_size_loop-1, 
   append(List,[e],ListTemp), 
   append_e(ListTemp,N2,List0).

这是删除我以前的列表,并用我想要的e个字符替换

append_e(_,0,[]).
append_e(List,E_size_loop,ListTemp):-
   E_size_loop>0,
   N2 is E_size_loop-1,
   append_e(List,N2,ListO),
   append(ListO,[e],ListTemp)

2 个答案:

答案 0 :(得分:1)

您需要复制输入列表,直到到达其末尾,然后添加给定字符的N个副本:

fill_list([], Character, N, List) :-
    fill_with_character(Character, N, List).
fill_list([Head| Tail0], Character, N, [Head| Tail]) :-
    fill_list(Tail0, Character, N, Tail).

fill_with_character/3谓词可以在复制字符时简单地倒数:

fill_with_character(_, 0, []) :- !.
fill_with_character(Character, N, [Character| Tail]) :-
    N > 0,
    M is N - 1,
    fill_with_character(Character, M, Tail).

第一个子句中的剪切是绿色剪切,可以避免虚假的选择点。

通话示例:

| ?- fill_list([a,b,c], d, 2, L).

L = [a,b,c,d,d]
yes

答案 1 :(得分:0)

append_e(Xs, N, Ys) :-
   length(Es, N),
   maplist(=(e), Es),
   append(Xs, Es, Ys).

length和maplist可以组合为一个定义:

append_e(Xs, N, Ys) :-
   n_es(N, Es),
   append(Xs, Es, Ys).

n_es(N, Es) :-
   length(Es, N),
   maplist(=(e), Es).

对于实例化N的情况,可以依次手动定义

n_es(N0, [e|Es]) :-
   N0 > 0,
   N1 is N0-1,
   n_es(N1, Es).
n_es(0, []).