我想编写一个谓词
split(List, Pivot, Result)
当 Result
是 List
除以 Pivot
的子列表列表时成立。例如 split(['_', '_', '#', '_', '#', '_'], '#', [['_','_'], ['_'], ['_']])
是 true
。
我的代码是这样的,但它不起作用:
split(List, Pivot, Result) :-
split(List, Pivot, _, _, Result).
split(List, Pivot, Left, Right, X|Xs) :-
append(Left, [Pivot|Right], List),
!,
member(Pivot, Right)
-> X = [Left],
split(Right, Pivot, _, _, Xs)
; X = [[Left]|[Right]].
我也不认为我的方法很聪明。有人可以给我一些建议吗?谢谢。
只需使用正确的工具,我们就可以保持逻辑纯度并立即完成工作!
让我们在查询中使用 meta-predicate
splitlistIf/3
和 具体化相等谓词 (=)/3
:
?- Xs = ['_','_',#,'_',#,'_'], splitlistIf(=(#),Xs,Ys).
Xs = [ '_','_' ,#,'_',#,'_' ]
Ys = [['_','_'], ['_'],['_']]. % succeeds deterministically
这是一种方法:
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).
split/4
谓词在位置 3 添加一个参数,表示“到目前为止构建的列表”。 split/3
是一个简单的重定向,“到目前为止的列表”设置为 []
。
第 2 行和第 4 行的子句处理两个
Pivot
排成一行以及在序列末尾检测到枢轴时的情况。这些子句防止插入空列表。
另一种方法:
list('#', ['_', '_', '#', '_', '#', '_']).
main:- list(Pivot, L),
split(Pivot, L, [['_','_'],['_'],['_']]),!.
split(_,[],[]).
split(Pivot, L, [R|R1]):- append(R, [Pivot|Rest], L),
split(Pivot,Rest,R1),!.
split(_, L, [L]).