在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)
答案 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, []).