Prolog中2个连续元素之间的差异

时间:2014-01-11 21:35:05

标签: prolog turbo-prolog

所以我的问题听起来像这样:给定一个整数列表,生成具有属性的排列列表,该排列的两个连续值之间的差值的绝对值是<=3。 例如:L=[2,7,5] ==&gt; [[2,5,7], [7,5,2]]

到目前为止我写了这个

domains 
list=integer*
lista=list*

predicates
perm(list,list)
permutations(list,lista,integer)
delete(integer,list,list)
diff(list,integer)

clauses
perm([],[]).
perm(Y,[A|X]):-
     delete(A,Y,Y1),
     perm(Y1,X).
delete(A,[A|X],X).
delete(A,[B|X],[B|Y]):-
     delete(A,X,Y).

perm_aux(L,X,3):-
     perm(L,X),
     diff(X,R),
     abs(R)<=3.

diff([],0).
diff(???):-
  ??????

permutations(L,R,3):-
     findall(X,perm_aux(L,X,3),R).

所以我陷入了与众不同的地方。我不知道如何为每2个连续的元素做这件事。请帮帮我。

1 个答案:

答案 0 :(得分:1)

我不会让diff返回差异,而是给它你想要的最大差异,让它在遇到太大的差异时失败,或者成功。

所以diff(List, Max).并调用它,而不是:

diff(X,R),
abs(R)<=3.  % Note that this should be =<

你有:

diff(X, 3).

然后您的基本案例是:

diff([], _).   % Empty list always succeeds
diff([_], _).  % Single element list always succeeds

你的递归案例如下:

diff([X,Y|T], Max) :-
    abs(X-Y) =< Max,
    diff([Y|T], Max).

如果您希望diff提供连续值的最大绝对差异,可以将其定义为:

max_diff(X, Max) :-
    max_diff(X, 0, Max).
max_diff([], M, M).
max_diff([_], M, M).
max_diff([X,Y|T], MaxSoFar, Max) :-
    Diff is abs(X-Y),
    (   Diff > MaxSoFar
    ->  max_diff([Y|T], Diff, Max)
    ;   max_diff([Y|T], MaxSoFar, Max)
    ).