Prolog:查找两个相邻列表元素的最大绝对差异

时间:2015-10-28 18:06:45

标签: list prolog

listelements([i|o],listelements) :-
    u is abs((listmax)-(listmin)),
    listelements(u,listelements).

listmin([min],min).
listmin([x|y],z) :-
    listmin(y,h),
    min(x,h,z).

min(Q,W,Q) :-
    Q =< W.
min(Q,W,W) :-
    W < Q.

listmax([max],max).
listmax([a|b],c) :-
    listmax(b,f),
    max(a,f,c).

max(M,N,M) :-
    M =< N.
max(M,N,N) :-
    N < M.

算术:`listmax&#39;不是一个功能

这是错误。求救!

当我问?- listmin([1,2,3,4,5,6],z).时 它回答false而不是1。为什么呢?

2 个答案:

答案 0 :(得分:1)

考虑您对算术谓词的具体选择, 我想你想支持所有类型的Prolog数字(浮点数,整数和有理数)。

如果您只使用整数,请确保使用

在这个答案中,我们一步一步地进行,如下所示:

  1. 我们定义一个辅助谓词num_num_absdiff/3,它计算前两个参数的绝对差值。

    num_num_absdiff(X,Y,D) :-
       D is abs(X-Y).
    
  2. 要将num_num_absdiff/3应用于所有相邻的项目并收集结果,我们会使用mapadj/3

    ?- mapadj(num_num_absdiff,[1,2,4,8,16,100],Ds).
    Ds = [1, 2, 4, 8, 84].
    
  3. 最大绝对差值是上面列表中的最大数量。
    我们使用list_maxnum/2来获取所述号码。

    ?- list_maxnum([1,2,4,8,84], Max).
    Max = 84.
    
  4. 让我们把它们放在一起并定义maxabsdiff_of/2

    maxabsdiff_of(D,Nums) :-
       mapadj(num_num_absdiff,Nums,Ds),
       list_maxnum(Ds,D).
    
  5. 以下是一些示例查询:

    ?- maxabsdiff_of(D,[1,2,3,4,5,6]).           % as given by the OP 
    D = 1.                                     
    
    ?- maxabsdiff_of(D,[1,2,3,4,5,6,8]).
    D = 2.
    
    ?- maxabsdiff_of(D,[1,2,3,100,4,5,6,8]).
    D = 97.
    

答案 1 :(得分:1)

当然,您也可以将 foldl/4一起使用,如下所示:

:- use_module(library(lambda)).

maxabsdiff_of(X,[V0,V1|Vs]) :-
   foldl(\E^(E0+D0)^(E+D)^(D is max(D0,abs(E-E0))), Vs, V1+abs(V1-V0),_+X).

示例查询:

?- maxabsdiff_of(D,[1,2,3,4,5,6]).
D = 1.

?- maxabsdiff_of(D,[1,2,3,4,5,6,8]).
D = 2.

?- maxabsdiff_of(D,[1,2,3,100,4,5,6,8]).
D = 97.

与以前相同的结果!