Prolog谓词next(X, List,List1)
,返回List1
X
后面的列表中的下一个元素,例如next(a,[a,b,c,a,d],List1)
,将返回List1=[b,d]
我试过以下:
next(X, [X,Y|List], [Y|List1]) :- % X is the head of the list
next(X, [Y|List], List1).
next(X, [Y|List], List1) :- % X is not the head of the list
X \== Y,
next(X, List, List1).
next(_,[], []).
答案 0 :(得分:1)
首先,尽可能使用prolog-dif来表达术语不平等!
其次,您提出的问题对于极端情况模糊不清:特别是,如果next(E,Xs,Ys)
中有多个相邻的E
或{是Xs
,Xs
应如何表现尚不清楚{1}}以E
结尾。
话虽如此,这是我对你问题的看法:
next(E,Xs,Ys) :-
list_item_nexts(Xs,E,Ys).
list_item_nexts([],_,[]).
list_item_nexts([E],E,[]).
list_item_nexts([I|Xs],E,Ys) :-
dif(E,I),
list_item_nexts(Xs,E,Ys).
list_item_nexts([E,X|Xs],E,[X|Ys]) :-
list_item_nexts(Xs,E,Ys).
让我们看看一些问题!
?- next(a,[a,b,c,a,d],List1). List1 = [b,d] ; false. ?- next(a,[a,a,b,c,a,d],List1). List1 = [a,d] ; false. ?- next(a,[a,a,b,c,a,d,a],List1). List1 = [a,d] ; false.
请注意,上述查询会成功,但会留下无用的选择点。 可以处理这种低效率,但我建议首先找出更完整的规格:)
答案 1 :(得分:1)
此版本对于@repeat使用if_/3
和(=)/3
提供的案例具有确定性。它显示了纯度和效率如何在同一个Prolog计划中共存。
next(E, Xs, Ys) :-
xs_e_(Xs, E, Ys).
xs_e_([], _E, []).
xs_e_([X|Xs], E, Ys) :-
if_(X = E, xs_e_xys(Xs, E, Ys), xs_e_(Xs, E, Ys)).
xs_e_xys([], _E, []).
xs_e_xys([X|Xs], E, [X|Ys]) :-
xs_e_(Xs, E, Ys).
%xs_e_xys([X|Xs], E, [X|Ys]) :- % alternate interpretation
% xs_e_([X|Xs], E, Ys).