有没有更有效的方法在swi prolog中实现这两个函数?
为了节省时间和内存,是否有更快的方法在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 编辑:我找到了一种方法来改进我
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谢谢你的回答,请查看我帖子上的编辑