Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List Prolog中类似转置谓词的实现_List_Prolog_Predicate - Fatal编程技术网

List Prolog中类似转置谓词的实现

List Prolog中类似转置谓词的实现,list,prolog,predicate,List,Prolog,Predicate,我对Prolog非常陌生,实际上4天后,我遇到了一个练习,其中说明: 给定一个大小为N的N列表,每个列表实现一个称为重塑(X,Y) 以便: 将所有列表的第一个元素收集到一个列表中 将所有列表的第二个元素收集到一个列表中 将所有列表的N个元素收集到一个列表中 将上述所有列表收集到新列表中 例如: 重塑([1,2,3],[4,5,6],[7,8,9],X) X=[[1,4,7]、[2,5,8]、[3,6,9]] 下面是我的实现: % Insert at the end of a list

我对Prolog非常陌生,实际上4天后,我遇到了一个练习,其中说明:

给定一个大小为NN列表,每个列表实现一个称为重塑(X,Y) 以便:

  • 将所有列表的第一个元素收集到一个列表中
  • 将所有列表的第二个元素收集到一个列表中
  • 将所有列表的N个元素收集到一个列表中
  • 将上述所有列表收集到新列表中
例如:

  • 重塑([1,2,3],[4,5,6],[7,8,9],X
  • X=[[1,4,7]、[2,5,8]、[3,6,9]]
下面是我的实现:

% Insert at the end of a list

insert([],X,[X]).
insert([H|T1],X,[H|T2]) :- insert(T1,X,T2).
基本思想是,我首先创建一个由N个空列表组成的列表,然后对于每个列表,比如输入的L,我分配/添加L的每个元素到相应的列表中

现在,我希望您能提供一些意见,因为我已经说过我是Prolog新手,甚至不知道谓词的时间复杂度是多少。事实上,我只知道它是有效的

但是,我有更好的方法来实现它吗

我的实现的时间复杂度是多少?这似乎是多项式时间,但我真的说不出来

提前感谢。

您可以编写一个O(N)算法,只需遍历每个元素一次:

reshape([[]|Tail], []):-
  maplist(=([]), Tail).
reshape(Input, [Result|RTail]):-
  reshape(Input, LTail, Result),
  reshape(LTail, RTail).
  
reshape([], [], []).
reshape([[Item|Tail]|LTail], [Tail|MTail], [Item|RTail]):-
  reshape(LTail, MTail, RTail).
重塑/3
获取包含列表列表中每个第一个元素的列表。然后
重塑/2
递归地构建所有这样的列表

测试用例:

?- reshape([[1,2,3],[4,5,6],[7,8,9]],X).
X = [[1, 4, 7], [2, 5, 8], [3, 6, 9]] ;
false.

对于一个4天的学生来说,这是一项如此复杂的任务;)祝你好运
% Assign each element of a list to the corresponding list.

assign([],[],[]).
assign([H1|T1],[H2|T2],[Y|T3]) :- 
    insert(H2,H1,Y),
    assign(T1,T2,T3).
% Reshape :

reshape([],L,L).
reshape([H1|T1],X,Result):-
    assign(H1,X,Y),
    reshape(T1,Y,Result).    

reshape(Input,Result) :-
    len(Input,N), 
    init_list(N,X),
    reshape(Input,X,Result).    
reshape([[]|Tail], []):-
  maplist(=([]), Tail).
reshape(Input, [Result|RTail]):-
  reshape(Input, LTail, Result),
  reshape(LTail, RTail).
  
reshape([], [], []).
reshape([[Item|Tail]|LTail], [Tail|MTail], [Item|RTail]):-
  reshape(LTail, MTail, RTail).
?- reshape([[1,2,3],[4,5,6],[7,8,9]],X).
X = [[1, 4, 7], [2, 5, 8], [3, 6, 9]] ;
false.