当Result是List by diviv by Pivot的子列表列表时,我想写一个谓词split(List, Pivot, Result)
成立。例如split([A, B, '#', C, '#', D], '#', [[A, B], [C], [D]])
为真。请注意,元素是包含逻辑变量的列表。
我问了一个关于如何对没有逻辑变量作为元素的列表执行此操作的问题。这是答案:
split(L,P,R):-split(L,P,[],R).
split([],_,[],[]).
split([],_,S,[S]) :- S \= [].
split([P|T],P,[],R) :- split(T,P,[],R).
split([P|T],P,L,[L|R]) :- L \= [], split(T,P,[],R).
split([H|T],P,S,R) :- H \= P, append(S, [H], S2), split(T,P,S2,R).
但是,对于将逻辑变量作为元素的列表,这不起作用。有什么建议可以解决这个问题?谢谢!
答案 0 :(得分:1)
你几乎就在那里。
考虑这个稍微修改过的版本:
split(L, P, R) :- split(L, P, [], R).
split([], _P, [], []) :- !.
split([], _P, Acc, [Acc]).
split([X|Xs], P, Acc, Result) :-
X \== P, !,
append(Acc, [X], NewAcc),
split(Xs, P, NewAcc, Result).
split([_X|Xs], P, [], Result) :- !, split(Xs, P, [], Result).
split([_X|Xs], P, Acc, [Acc|Result]) :- split(Xs, P, [], Result).
此实现依赖于您尝试过的累加器,但只要列表项与使用\==/2
的数据透视表不匹配,就会将累加器简单地分流到结果列表中。