List 在prolog中获取列表的垂直列表?
一个列表,如 列表=[[1,2,3], [4,5,6], [7,8,3]] 在这种情况下,我想得到所有垂直列表,比如 [1,4,7],[2,5,8],[3,6,3] 怎么做?我想有两个计数器像两个“for to do”重复一样一起工作。 如果[1,4,7]是一个集合,或者[3,6,3]不是,我需要检查“is_set” 像这样: el_at(利斯特,德国劳埃德船级社,1) el_at(利斯特,德国劳埃德船级社,2)List 在prolog中获取列表的垂直列表?,list,prolog,List,Prolog,一个列表,如 列表=[[1,2,3], [4,5,6], [7,8,3]] 在这种情况下,我想得到所有垂直列表,比如 [1,4,7],[2,5,8],[3,6,3] 怎么做?我想有两个计数器像两个“for to do”重复一样一起工作。 如果[1,4,7]是一个集合,或者[3,6,3]不是,我需要检查“is_set” 像这样: el_at(利斯特,德国劳埃德船级社,1) el_at(利斯特,德国劳埃德船级社,2) 谢谢所有垂直列表的列表称为转置矩阵。 包含这样的代码 我不完全理解你提出的解决方案
谢谢所有垂直列表的列表称为转置矩阵。
包含这样的代码 我不完全理解你提出的解决方案,但我有另一个。我将试着描述它是如何工作的,也许你能看到你的解决方案有什么问题,为什么它不起作用
让我们考虑[[1,2],[3,4] ]的一个例子。其思想是遍历第一个子列表[1,2],并创建一个不完整的结果[1],[2],然后遍历下一个子列表[3,4],并将其中的每个项目预先添加到结果的每个子列表中(这比在Prolog中追加要容易)。我们将得到[[3,1],[4,1]]。然后对子列表进行反转,得到结果[[1,3],[1,4]]
现在实施:vertical
谓词是核心,它遍历列表列表,结果在Acc变量中逐步累积
对于每个子列表,vertical
谓词调用addfirst
谓词,该谓词获取该子列表的每个元素,并将其前置到先前结果累积的列表中
vertical([X|Xs],Result):-
createempty(X, Acc),
vertical([X|Xs], Acc, ReversedResults),
reverseall(ReversedResults, Result).
reverseall([], []).
reverseall([X|Xs], [XReversed|Rest]):-
reverse(X, XReversed),
reverseall(Xs, Rest).
createempty([], []).
createempty([X|Xs], [[]|R]):-createempty(Xs,R).
vertical([], Result, Result).
vertical([X|Xs], Acc, Result):-
addfirst(X, Acc2, Acc),
vertical(Xs, Acc2, Result).
addfirst([], [], []).
addfirst(
[Y|Ys],
[[Y|YVerticalRest]|ResultRest],
[YVerticalRest|VerticalsRest]):-
addfirst(Ys, ResultRest, VerticalsRest).
下面是转置的一个小实现: 它通过获取每个子列表的第一个元素来工作。当它完成时,它递归地执行相同的操作,但现在处理每个列表的下一项,依此类推
transpose(M, T):-
transpose(M, [], T).
transpose([], [], []).
transpose([], S, [[]|T]):-
S \= [] ->
(reverse(S, M), transpose(M, [], T)).
transpose([[]|MTail], S, T):-
transpose(MTail, S, T).
transpose([[Item|Tail]|MTail], S, [[Item|NTail]|T]):-
transpose(MTail, [Tail|S], [NTail|T]).
el_at(EList, Llist,2),
globalListVertikalCheck(ListVertikal),
addlist(Elist,ListVertikal,NewListVertikal),
vertical([X|Xs],Result):-
createempty(X, Acc),
vertical([X|Xs], Acc, ReversedResults),
reverseall(ReversedResults, Result).
reverseall([], []).
reverseall([X|Xs], [XReversed|Rest]):-
reverse(X, XReversed),
reverseall(Xs, Rest).
createempty([], []).
createempty([X|Xs], [[]|R]):-createempty(Xs,R).
vertical([], Result, Result).
vertical([X|Xs], Acc, Result):-
addfirst(X, Acc2, Acc),
vertical(Xs, Acc2, Result).
addfirst([], [], []).
addfirst(
[Y|Ys],
[[Y|YVerticalRest]|ResultRest],
[YVerticalRest|VerticalsRest]):-
addfirst(Ys, ResultRest, VerticalsRest).
transpose(M, T):-
transpose(M, [], T).
transpose([], [], []).
transpose([], S, [[]|T]):-
S \= [] ->
(reverse(S, M), transpose(M, [], T)).
transpose([[]|MTail], S, T):-
transpose(MTail, S, T).
transpose([[Item|Tail]|MTail], S, [[Item|NTail]|T]):-
transpose(MTail, [Tail|S], [NTail|T]).
transpose([[]|_],[]) :- !.
transpose(L,[L1|R2]) :-
transpose(L,L2,L1),
transpose(L2,R2).
transpose([],[],[]) :- !.
transpose([[A|R1]|R2],[R1|R3],[A|R4]) :-
transpose(R2,R3,R4).