使用Prolog从一维列表构建二维列表

使用Prolog从一维列表构建二维列表,prolog,Prolog,我有一个一维列表,看起来有点像这样: ["Break 1", "1234", "3212", "9393", "7417", "Break 2", "9212", "2911", ..., ] 。。。我需要的是将其转换为: [["1234", "3212", "9393", "7417"], ["9212", "2911", ...,]] 即,恒定大小1d列表包含由“Break X”项分隔的数字字符串,其中X是“组”的某个数字/id。“Break X”标记后面的数字应视为组的内容,组是最终2

我有一个一维列表,看起来有点像这样:

["Break 1", "1234", "3212", "9393", "7417", "Break 2", "9212", "2911", ..., ]
。。。我需要的是将其转换为:

[["1234", "3212", "9393", "7417"], ["9212", "2911", ...,]]
即,恒定大小1d列表包含由“Break X”项分隔的数字字符串,其中X是“组”的某个数字/id。“Break X”标记后面的数字应视为组的内容,组是最终2d列表中的数组项


有什么想法吗?

当您确定输入列表始终遵循您描述的结构(以分隔符“Break X”元素开始,“Break X”元素连续编号)时,简单的递归和列表算法就足够了:

% process_list(List1,List2):
% List2 is the list of sublists of List1 when split up according to
% delimiter elements as defined by is_delimiter/1. First element of
% List1 has to be a delimiter.
process_list([],[]).
process_list([Element|Rest],[List|Lists]) :-
        is_delimiter(Element),
        process_sublist(Rest,List,NewRest),
        process_list(NewRest,Lists).

% process_sublist(+List1,-List2,-List3):
% Splits List1 up into List2 and List3, where List2 is everything
% until the first delimiter element.
process_sublist([Element|Rest],[Element|List],NewRest) :-
        \+ is_delimiter(Element), !,
        process_sublist(Rest,List,NewRest).
process_sublist(List,[],List).

% delimiter = string of the form "Break X"
is_delimiter(String) :-
        sub_string(String,0,_,_,"Break ").
示例输出:

?- process_list(["Break 1", "1234", "3212", "9393", "7417", "Break 2", "9212", "2911"],X).
X = [["1234", "3212", "9393", "7417"], ["9212", "2911"]].

?- process_list(["Break 1", "1234", "3212", "9393", "7417", "Break 2", "9212", "2911", "Break 3", "8357", "837", "67865"],X).
X = [["1234", "3212", "9393", "7417"], ["9212", "2911"], ["8357", "837", "67865"]].

?- process_list(["Break 1", "1234", "3212", "9393", "7417", "Break 2", "9212", "2911", "Break 3", "8357", "837", "67865", "Break 4", "Break 5"],X).
X = [["1234", "3212", "9393", "7417"], ["9212", "2911"], ["8357", "837", "67865"], [], []].


当您确定输入列表始终遵循您描述的结构时(以分隔符“Break X”元素开始,“Break X”元素连续编号),简单的递归和列表算法就足够了:

% process_list(List1,List2):
% List2 is the list of sublists of List1 when split up according to
% delimiter elements as defined by is_delimiter/1. First element of
% List1 has to be a delimiter.
process_list([],[]).
process_list([Element|Rest],[List|Lists]) :-
        is_delimiter(Element),
        process_sublist(Rest,List,NewRest),
        process_list(NewRest,Lists).

% process_sublist(+List1,-List2,-List3):
% Splits List1 up into List2 and List3, where List2 is everything
% until the first delimiter element.
process_sublist([Element|Rest],[Element|List],NewRest) :-
        \+ is_delimiter(Element), !,
        process_sublist(Rest,List,NewRest).
process_sublist(List,[],List).

% delimiter = string of the form "Break X"
is_delimiter(String) :-
        sub_string(String,0,_,_,"Break ").
示例输出:

?- process_list(["Break 1", "1234", "3212", "9393", "7417", "Break 2", "9212", "2911"],X).
X = [["1234", "3212", "9393", "7417"], ["9212", "2911"]].

?- process_list(["Break 1", "1234", "3212", "9393", "7417", "Break 2", "9212", "2911", "Break 3", "8357", "837", "67865"],X).
X = [["1234", "3212", "9393", "7417"], ["9212", "2911"], ["8357", "837", "67865"]].

?- process_list(["Break 1", "1234", "3212", "9393", "7417", "Break 2", "9212", "2911", "Break 3", "8357", "837", "67865", "Break 4", "Break 5"],X).
X = [["1234", "3212", "9393", "7417"], ["9212", "2911"], ["8357", "837", "67865"], [], []].


你能提供更多的细节吗?例如,列表的长度是常量吗?您只需要第一个列表中的前四个元素还是原始列表中的一半元素?能否提供更多详细信息?例如,列表的长度是常量吗?您只需要第一个列表中的前四个元素还是原始列表中的一半元素?