【发布时间】: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 教程以了解基础知识,然后再进一步了解这些内容。