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
。为什么呢?
答案 0 :(得分:1)
考虑您对算术谓词的具体选择, 我想你想支持所有类型的Prolog数字(浮点数,整数和有理数)。
如果您只使用整数,请确保使用clpfd!
在这个答案中,我们一步一步地进行,如下所示:
我们定义一个辅助谓词num_num_absdiff/3
,它计算前两个参数的绝对差值。
num_num_absdiff(X,Y,D) :- D is abs(X-Y).
要将num_num_absdiff/3
应用于所有相邻的项目并收集结果,我们会使用mapadj/3
:
?- mapadj(num_num_absdiff,[1,2,4,8,16,100],Ds). Ds = [1, 2, 4, 8, 84].
最大绝对差值是上面列表中的最大数量。
我们使用list_maxnum/2
来获取所述号码。
?- list_maxnum([1,2,4,8,84], Max). Max = 84.
让我们把它们放在一起并定义maxabsdiff_of/2
:
maxabsdiff_of(D,Nums) :- mapadj(num_num_absdiff,Nums,Ds), list_maxnum(Ds,D).
以下是一些示例查询:
?- 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)
当然,您也可以将lambda与meta-predicate 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.
与以前相同的结果!