当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]].
我认为我的方法也不聪明。有人可以给我一些建议吗?谢谢。
答案 0 :(得分:3)
我们可以保留logical-purity并立即完成工作,只需使用正确的工具!
让我们在查询中使用meta-predicate splitlistIf/3
和reified equality predicate (=)/3
:
<img>
答案 1 :(得分:1)
这是一种方法:
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
连续存在的情况,以及在序列结束时检测到数据透视的情况。这些条款阻止插入空列表。