Prolog:如何通过填充

时间:2015-10-24 01:00:47

标签: list prolog

截至目前,我使用以下代码来转置矩形矩阵。

trans(L,[Head|Tail]) :-
   list_first(L,Head,A),
   trans(A,Tail).
trans(Empty,[]) :-
   empty(Empty).

empty([[]|Tail]) :-
   empty(Tail).
empty([[]]).

list_first([[Head|A]|Rest],[Head|Heads],[A|As]) :- 
   list_first(Rest,Heads,As).
list_first([],[],[]).

如何使用下面使用的“{jagged”列表列表[[a,b,c],[1,2]]

示例查询:

?- trans([[a,b,c],[1,2]], T).
false.                           % desired answer: T = [[a,1],[b,2],[c,[]]

2 个答案:

答案 0 :(得分:2)

我会继续使用一些'可重用的'实用程序,预处理列表并确保所有实用程序具有相同的长度:

lists_length_max(ListS, LenS, MaxLen) :-
    maplist(length, ListS, LenS),
    max_list(LenS, MaxLen).

list_padding(MaxLen, ElemPad, List, Len, Padded) :-
    LenTail is MaxLen - Len,
    length(Tail, LenTail),
    maplist(=(ElemPad), Tail),
    append(List, Tail, Padded).

trans_padding(ListS, Trans) :-
    trans_padding(ListS, Trans, []).
trans_padding(ListS, Trans, PadElem) :-
    lists_length_max(ListS, LenS, MaxLen),
    maplist(list_padding(MaxLen, PadElem), ListS, LenS, Padded),
    trans(Padded, Trans).

现在,应该调用trans_padding / 2而不是trans / 2

答案 1 :(得分:1)

这是另一种变体:

row([], [_|_], [], []).
row([[]|Rs], A, NewRs, [[]|Cs]) :-
    row(Rs, A, NewRs, Cs).
row([[X|Xs]|Rs], A, [Xs|NewRs], [X|Cs]) :-
    row(Rs, [X|A], NewRs, Cs).

transpose(Rows, [T|Ts]) :-
    row(Rows, [], Rest, T),
    transpose(Rest, Ts).
transpose(Empty, []) :-
    maplist(=([]), Empty).

transpose一次操作一行。 row谓词使用辅助参数(第三个)来确保它终止而不生成全部为空元素的幻像行。对maplist(=([]), Empty)的调用是问题中定义的谓词empty/1的简写。