我有一个列表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).
答案 0 :(得分:1)
您的“删除c
”谓词看起来会更好:
remove_c([c|T], S) :-
remove_c(T, S).
remove_c([a|T], [a|S]) :-
remove_c(T, S).
这仍然只适用于其中只有c
和a
的列表。
如果你想“分裂”,这意味着你至少需要另一个参数,来收集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]).
同样,这只需要a
和c
的列表。它也可以以不同的方式完成,但这是一个开始。
答案 1 :(得分:1)
将meta-predicate 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]].