有没有更有效的方法在swi prolog中实现这两个函数?

有没有更有效的方法在swi prolog中实现这两个函数?,prolog,Prolog,为了节省时间和内存,是否有更快的方法在swi prolog中实现这两个函数 insert(Ind,List,Val,NList) :- nth0(Ind,List,_,R), nth0(Ind,NList,Val,R). build(X,N,List) :- length(List,N), maplist(=(X),List). 说明:第一个在列表的第N个位置插入一个值,第二个构建一个包含N个元素的列表,所有元素都等于数字X 编辑:我找到了一种方法来改进我

为了节省时间和内存,是否有更快的方法在swi prolog中实现这两个函数

insert(Ind,List,Val,NList) :-
    nth0(Ind,List,_,R),
    nth0(Ind,NList,Val,R).

build(X,N,List) :- 
    length(List,N),
    maplist(=(X),List). 
说明:第一个在列表的第N个位置插入一个值,第二个构建一个包含N个元素的列表,所有元素都等于数字X

编辑:我找到了一种方法来改进我的程序的插入

insert(Ind,List,NList,R,Elem) :-
    Valb=Val,
    Val is Val+1,
    nth0(Ind,NList,Val,R),
    Elem=Valb.

这应该将列表中的一个元素替换为其值加1,但在添加1之前还将返回上一个值(Valb)。我知道代码是错误的,我怎样才能在不再次使用nth0的情况下使其正确呢?

就时间复杂性而言,两者都在O(n)时间和O(n)内存中工作。您不能在少于O(n)个时间内构造包含n个元素的列表,它至少需要O(n)个内存。人们可以懒散地构建列表,从而推迟创建,但对于真正的列表,就时间复杂性而言

但是,我们可以做的是“合并”两个谓词的逻辑,这样每次递归调用都会做更多的操作,例如:

build(X,N,List) :-
    var(N),
    !,
    build_gen_(List, X, N).
build(X, N, List) :-
    integer(N),
    !,
    build_num_(N, List, X).

build_gen_([], _, 0).
build_gen_([X|T], X, N) :-
    build_gen_(T, X, N1),
    N is N1 + 1.

build_num_(0, [], _) :-
    !.
build_num_(N, [X|T], X) :-
    N > 0,
    N1 is N-1,
    build_num_(N1, T, X).
因此,我们基本上构造了一个特殊的谓词,它使用相同的谓词执行这两项任务(构造长度
N
的列表,并将所有元素设置为
X


我把第一个谓词
insert/4
留作练习。

都是O(n)。就时间复杂性而言,不。你可以通过同时迭代两个列表来更有效地实现前者。
build(a,N,[b |)
loops,它可能在更好的实现中失败。
\u build2
的名字是什么?@WillemVanOnsem谢谢你的回答,请查看我帖子上的编辑