prolog - 我怎样才能以正确的方式得到这个简单的 Prolog 谓词 "return"?

标签 prolog

所以我正在学习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/

相关文章:

prolog - 如何在 GNU Prolog 中使用 "long int"?

prolog - 手册含义

list - Prolog程序以任意顺序查找两个列表的相等性

prolog - 有什么严肃的项目正在使用 PROLOG 吗?

csv - 导入 csv 文件数据以填充 Prolog 知识库

prolog - 为什么这个 Prolog 规则不会进入无限循环?

parameters - Prolog 将谓词统一为参数

windows - 如何在 Microsoft Windows 下的 SWI-Prolog 中使用 XPCE 下的附加字体?

prolog - 将约束变量与 `length/2`一起使用

prolog - 列表中每个元素的事实 Prolog