Prolog 在序言末尾用N个字符填充列表

Prolog 在序言末尾用N个字符填充列表,prolog,Prolog,我需要在Prolog中的列表末尾填入N个字符。 如果没有库或映射列表,则使用findall命令 我尝试了这段代码,它以递归方式创建了更多的列表,最后带有“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(Lis

我需要在Prolog中的列表末尾填入N个字符。 如果没有库或映射列表,则使用findall命令

我尝试了这段代码,它以递归方式创建了更多的列表,最后带有“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)
长度和映射列表可以合并为一个定义:

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

您需要复制输入列表,直到到达其末尾,然后添加给定字符的
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

谢谢你的回答,但我需要创建没有地图列表。。。我是在描述中写的。同时,你应该能够将上面的地图列表目标转换成相应的地图列表自由版本。它工作得非常好,但我需要递归地执行,我失败了!非常感谢您的回答,但它似乎不起作用一个错误出现语法错误:运算符优先级冲突在第二句中,如果我删除剪切,它将消失,但另一个错误出现在运行modeCopy时,并将上面的代码粘贴到Prolog会话中,显示没有语法错误。与我使用的其他代码有冲突好的,再次谢谢你!
| ?- fill_list([a,b,c], d, 2, L).

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