【问题标题】:Prolog: Finding the maximum absolute difference of two adjacent list elementsProlog:查找两个相邻列表元素的最大绝对差
【发布时间】:2015-10-30 05:47:39
【问题描述】:
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' 不是函数

这是错误。请帮忙!

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

【问题讨论】:

  • 这里有很多基本的 Prolog 问题。当你使用is/2 时,它期望右边的表达式是一个可计算的算术表达式,由 Prolog 理解的已知运算符或已知函数组成。 listmax 不是已知函数。它是您的谓词之一,并且谓词不返回值。谓词成功或失败(更不用说您在没有参数的情况下调用它,但您的谓词是用 2 个参数定义的)。您也可以使用listmax(MyList, Result),然后在is/2 表达式中使用Result。更多在我的下一条评论...
  • 另一个问题是变量语法不一致。 Prolog 使用首字母大写(或下划线)来表示变量。如果标识符以小写字母开头,则它是一个原子(常量)。因此,例如,listmax([max], max).max 视为原子,而不是变量。你需要listmax([Max], Max).。与您的其他谓词定义类似。您真的应该通读基本的 Prolog 教程以了解基础知识,然后再进一步了解这些内容。

标签: list prolog


【解决方案1】:

考虑到您对算术谓词的具体选择, 我猜你想支持各种 Prolog 数(浮点数、整数和有理数)。

如果您在这里只使用整数,请确保您使用的是

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

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

    num_num_absdiff(X,Y,D) :- D是绝对(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],最大)。 最大值 = 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])。 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。

【讨论】:

    【解决方案2】:

    当然,您也可以将 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。

    结果和以前一样!

    【讨论】:

    • @user27815。看看这个foldl成语的另一个典型用法。
    猜你喜欢
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多