有没有更有效的方式在swi-prolog中实现这2个功能?

时间:2019-06-08 09:32:14

标签: 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,NList,R,Elem) :-
    Valb=Val,
    Val is Val+1,
    nth0(Ind,NList,Val,R),
    Elem=Valb.

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

1 个答案:

答案 0 :(得分:0)

就时间复杂度而言,它们都在 O(n)时间和 O(n)内存中工作。您不能在少于 O(n)时间的时间内用 n 个元素构造一个列表,它将至少需要 O(n)个内存。可以懒惰地构造列表,从而推迟创建,但是对于真实列表,在时间复杂度方面。

但是,我们可以做的是“合并”这两个谓词的逻辑,以便我们对每个递归调用做更多的事情,例如:

idBuildingsInfo

因此,我们基本上构造了一个特殊的谓词,以相同的谓词执行这两个任务(构造长度为buildings_id的列表,并将所有元素设置为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专门化为练习。