List Prolog中类似转置谓词的实现
我对Prolog非常陌生,实际上4天后,我遇到了一个练习,其中说明: 给定一个大小为N的N列表,每个列表实现一个称为重塑(X,Y) 以便: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
- 将所有列表的第一个元素收集到一个列表中
- 将所有列表的第二个元素收集到一个列表中
- 将所有列表的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).
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.