Prolog将列表拆分为列表列表

时间:2014-10-22 05:14:40

标签: prolog

我想将一个列表拆分为列表列表,并跳过“固体”列表。并将列表分成子列表。

输入和输出低于

split_s([A,B,C,solid,D,E,F],X).
X = [[A,B,C],[D,E,F]].

任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:1)

尝试以下几行。如果您分解您的问题,它会有所帮助。在这种情况下,问题的核心是:

  • 找到不包含原子solid的列表的最长前缀。

您可以使用take_until( List , Separator , Prefix , Remainder )之类的谓词来执行此操作:

take_until( []     , _ , []     , [] ) .   % if we hit the end of the source list, we're done.
take_until( [X|Xs] , X , []     , Xs ) .   % if we hit the separator, we're done
take_until( [X|Xs] , S , [X|Ps] , Rs ) :-  % otherwise...
  X \= S ,                                 % - when the head of the list is NOT the separator
  take_until( Xs , S , Ps , Rs )           % - we take it on to the sublist and keep going.
  .                                        %

一旦你有了这个,其余的很容易:

  • 使用上面的谓词来提取第一个这样的前缀,然后
  • 重新判断剩下的事情。

像这样:

split( []     , []     ) .               % splitting the empty list results in the empty list.
split( [X|Xs] , [Y|Ys] ) :-              % splitting a non-empty list...
  take_until( [X|Xs] , solid , Y , R ) , % - get the desired prefix
  split(R, , Ys )                        % - recurse down on what's left
  .                                      % Easy!

答案 1 :(得分:0)

以下适用于我:

split_s([],[[]]).
split_s([H|T],[[H|XH]|XR]) :- var(H),!,split_s(T,[XH|XR]).
split_s([solid|T],[[]|X]) :- !,split_s(T,X).
split_s([H|T],[[H|XH]|XR]) :- split_s(T,[XH|XR]).

编辑:在分割前面的第3个子句中移动了切口。

如果您不想要空列表,请尝试以下操作:

split_s([],[]).
split_s([H|T],[[H|XT]|XXT]) :- var(H),!,split_s([[H]|T],[[[H]|XT]|XXT]).
split_s([solid|T],X) :- !,split_s(T,X).
split_s([H],[[H]]) :- !.
split_s([H,M|T],[[H,M|XT]|XXT]) :- var(M),!,split_s([[M]|T],[[[M]|XT]|XXT]).
split_s([H,solid|T],[[H]|XT]) :- !,split_s(T,XT).
split_s([H|T],[[H|XH]|XR]) :- split_s(T,[XH|XR]).