如何在Prolog中拆分列表?

问题描述 投票:0回答:3

我想编写一个谓词

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

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

prolog
3个回答
3
投票

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

让我们在查询中使用

splitlistIf/3
具体化相等谓词
(=)/3

?- Xs = ['_','_',#,'_',#,'_'], splitlistIf(=(#),Xs,Ys).
Xs = [ '_','_' ,#,'_',#,'_' ]
Ys = [['_','_'], ['_'],['_']].      % succeeds deterministically

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
排成一行以及在序列末尾检测到枢轴时的情况。这些子句防止插入空列表。


0
投票

另一种方法:

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]).
© www.soinside.com 2019 - 2024. All rights reserved.