所以我正在学习Prolog。我需要编写一个谓词来查找整数列表的最小/最大值。例如,查询 minmaxArray([4,-1,5,4,1,2,3,-2],X,Y) 将返回 X = -2 Y = 5。这是我到目前为止所得到的:
%min/max element of a 1 item list is that item.
minmaxArray([X], X, X).
%when there is only 2 items, put the smaller element in A and the
%larger element in B
minmaxArray([X,Y], A, B) :- mymin(X,Y,Min),
A is Min, mymax(X,Y,Max), B is Max.
%when there is more than two items make a recursive call to find the min/max
%of the rest of the list.
minmaxArray([X,Y|T], A, B) :- minmaxArray([Y|T], M, K),
mymin(X,M,Temp), A is Temp, mymax(X,K,Temp2), B is Temp2.
假设 mymin 和 mymax 谓词正常工作。它们返回 2 个数字的最小值和最大值。
这里的问题是,例如,当我查询 minmaxArray([4,-1,5],X,Y) 时,它返回 X = -1 Y = 5,然后再次返回 X = -1 Y = 5。我知道这一定是因为它满足了递归调用的第二个条件。我只希望它返回一次 X = -1 Y = 5 。我尝试用以下内容替换条件 3:
minmaxArray([X,Y,_|T], A, B) :- minmaxArray([Y,_|T], M, K),
mymin(X,M,Temp), A is Temp, mymax(X,K,Temp2), B is Temp2.
但这会使程序崩溃。我可以做什么来解决这个问题?
注意:我知道我可能没有正确使用术语,因为在应该是规则时说返回并说谓词等,所以我提前道歉。
最佳答案
看来你的代码可以更简单。这个谓词完成了所有需要的事情,并尝试展示如何使用一些标准构造(if/then/else)
minmaxArray([X], X, X).
minmaxArray([X|R], Min, Max) :-
minmaxArray(R, Tmin, Tmax),
( X < Tmin -> Min = X ; Min = Tmin ), % or mymin(X,Tmin,Min)
( X > Tmax -> Max = X ; Max = Tmax ).
关于prolog - 我怎样才能以正确的方式得到这个简单的 Prolog 谓词 "return"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22384882/