如何在prolog中拆分充满逻辑变量的列表?

如何在prolog中拆分充满逻辑变量的列表?,prolog,Prolog,我想写一个谓词split(List,Pivot,Result)当Result是一个由Pivot划分的列表的子列表时,它将保持不变。例如,split([A,B,“#”,C,“#,D],“#,[[A,B],[C],[D]])是正确的。注意,元素是带有逻辑变量的列表 我问了一个关于如何处理没有逻辑变量作为元素的列表的问题。答案如下: split(L,P,R):-split(L,P,[],R). split([],_,[],[]). split([],_,S,[S]) :- S \= []. split

我想写一个谓词
split(List,Pivot,Result)
当Result是一个由Pivot划分的列表的子列表时,它将保持不变。例如,
split([A,B,“#”,C,“#,D],“#,[[A,B],[C],[D]])
是正确的。注意,元素是带有逻辑变量的列表

我问了一个关于如何处理没有逻辑变量作为元素的列表的问题。答案如下:

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(L, P, R) :- split(L, P, [], R).
split([], _P, [], []) :- !.
split([], _P, Acc, [Acc]).
split([X|Xs], P, Acc, Result) :-
    X \== P, !,
    append(Acc, [X], NewAcc),
    split(Xs, P, NewAcc, Result).
split([_X|Xs], P, [], Result) :- !, split(Xs, P, [], Result).
split([_X|Xs], P, Acc, [Acc|Result]) :- split(Xs, P, [], Result).

正如您所尝试的那样,此实现依赖于累加器,但只要列表项与枢轴不匹配,就使用将累加器分流到结果列表中。

可能重复我无法理解该问题的答案。有很多我以前从未见过的功能。我尝试了解决方案,但不明白我看到了什么。您的问题看起来像是加入,您考虑过吗?嗯。。这将生成
[]
,例如
?-split(['#',A'#',B,ASD,D'#'],'#',X)。X=[[],[A],[B,ASD,D]。
它应该是
[[A],[B,ASD,D].
。你能修好它吗?