拆分给定元素的列表

时间:2014-10-06 14:22:39

标签: prolog

我有一个列表C,我想使用列表中的元素c拆分列表。

预期结果如下:

?- split([a,c,a,a,c,a,a,a],X).
X = [[a],[a,a],[a,a,a]].

有人可以帮忙吗?提前致谢。

我现在可以删除列表中的c,这是我的代码。

split([],[]).
split([H|T],[H|S]) :- H=a,split(T,S).
split([H|T],S) :- H=c,split(T,S). 

3 个答案:

答案 0 :(得分:1)

您的“删除c”谓词看起来会更好:

remove_c([c|T], S) :-
    remove_c(T, S).
remove_c([a|T], [a|S]) :-
    remove_c(T, S).

这仍然只适用于其中只有ca的列表。

如果你想“分裂”,这意味着你至少需要另一个参数,来收集a之间的c。例如:

split_on_c(List, Split) :-
    split_on_c_1(List, Split, []).

split_on_c_1([], [Acc], Acc).
split_on_c_1([c|Rest], [Acc|Split], Acc) :-
    split_on_c_1(Rest, Split, []).
split_on_c_1([a|Rest], Split, Acc) :-
    split_on_c_1(Rest, Split, [a|Acc]).

同样,这只需要ac的列表。它也可以以不同的方式完成,但这是一个开始。

答案 1 :(得分:1)

splitlistIf/3与明确的术语相等一起使用 (=)/3,像这样:

以下是OP在问题中提出的查询:

?- splitlistIf(=(c),[a,c,a,a,c,a,a,a],Xs).
Xs = [[a],[a,a],[a,a,a]].

请注意,上面的代码是单调的,因此以下查询会给出合理的结果:

?- splitlistIf(=(X),[Y,X,Y,Y,X,Y,Y,Y],Xs), Y = a, X = c.
X  = c,
Y  = a,
Xs = [[a],[a, a],[a, a, a]].

答案 2 :(得分:0)

在学习语言时,您需要完成已经建立的常见抽象(简单来说,使用库)。

怎么样?
split(In, Sep, [Left|Rest]) :-
    append(Left, [Sep|Right], In), !, split(Right, Sep, Rest).
split(In, _Sep, [In]).

一样使用
?- split([a,c,a,a,c,a,a,a],c,R).
R = [[a], [a, a], [a, a, a]].