【问题标题】:Implementation of predicate similar to Transpose in PrologProlog中类似于Transpose的谓词的实现
【发布时间】:2020-10-01 14:07:50
【问题描述】:

我对 Prolog 还很陌生,实际上是 4 天后,我遇到了一个练习,其中指出:

给定一个 N 个大小为 N 的列表,每个列表都实现一个称为 reshape(X,Y) 的谓词 这样它:

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

一个例子是:

  • reshape([[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).
% Length of list

len([],L,L).

len([_|T],L,X) :- 
    L1 is L + 1,
    len(T,L1,X).

len(L,X) :- len(L,0,X).
% Create a list of N empty lists

init_list(L,0,L) :- !.

init_list(L,N,X) :-
    N1 is N-1,
    insert(L,[],Y),
    init_list(Y,N1,X).

init_list(N,X) :- init_list([],N,X).
% 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).    

所以基本的想法是,我首先创建一个包含 N 个空列表的列表,然后对于每个列表说输入的 L,我将 L 的每个元素分配/添加到相应的列表中。

现在我很感激一些输入,因为我已经说过我是 Prolog 的新手,甚至无法说出我的谓词的时间复杂度是多少。我唯一知道的事实是它有效。

但是有没有更好的方法可以实现它?

我的实现的时间复杂度是多少?这似乎是多项式时间,但我无法确定。

提前致谢。

【问题讨论】:

  • 对于一个为期 4 天的学生来说,这是一项如此复杂的任务;)祝你好运

标签: list prolog predicate


【解决方案1】:

您可以编写一个 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).

reshape/3 获取包含列表列表的每个第一个元素的列表。然后reshape/2 递归地构建所有这样的列表。

测试用例:

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

【讨论】:

    猜你喜欢
    • 2014-01-26
    • 2013-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-16
    • 1970-01-01
    相关资源
    最近更新 更多