写下Prolog谓词(X,List,List1)

时间:2015-03-15 17:50:45

标签: prolog

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(_,[], []).

2 个答案:

答案 0 :(得分:1)

首先,尽可能使用来表达术语不平等!

其次,您提出的问题对于极端情况模糊不清:特别是,如果next(E,Xs,Ys)中有多个相邻的E或{是XsXs应如何表现尚不清楚{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).