如何在Prolog中拆分列表?

时间:2014-10-23 03:08:56

标签: prolog

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]].

我认为我的方法也不聪明。有人可以给我一些建议吗?谢谢。

2 个答案:

答案 0 :(得分:3)

我们可以保留并立即完成工作,只需使用正确的工具!

让我们在查询中使用 splitlistIf/3reified 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).

Demo.

split/4谓词在位置3添加一个参数,意思是“到目前为止构建的列表”。 split/3是一个简单的重定向,“目前为止列表”设置为[]

第2行和第4行的子句处理两个Pivot连续存在的情况,以及在序列结束时检测到数据透视的情况。这些条款阻止插入空列表。