如何编写谓词minmax

如何编写谓词minmax

如何编写谓词minmax(L,X,Y)以找出整数L列表中X的最小值和Y的最大值。

例:

?- minmax([1, -10, 1, 0, 7, 7], X, Y).
X = -10, Y = 7.

最佳答案

让我们像 list_minnum_maxnum/3 一样定义list_minnum/2:

list_minnum_maxnum([E|Es],Min,Max) :-
   V is E,
   list_minnum0_minnum_maxnum0_maxnum(Es,V,Min,V,Max).

list_minnum0_minnum_maxnum0_maxnum([]    ,Min ,Min,Max ,Max).
list_minnum0_minnum_maxnum0_maxnum([E|Es],Min0,Min,Max0,Max) :-
   V    is E,
   Min1 is min(Min0,V),
   Max1 is max(Max0,V),
   list_minnum0_minnum_maxnum0_maxnum(Es,Min1,Min,Max1,Max).

OP给出的示例查询:
?- list_minnum_maxnum([1,-10,1,0,7,7], Min,Max).
Min = -10,
Max = 7.

请注意,list_minnum_maxnum/3的此实现适用于所有类型的数字。
?- list_minnum_maxnum([1,-10,1,0,7.2,7,7], Min,Max).
Min = -10,
Max = 7.2.

如果只关心整数,请使用clpfd!
:- use_module(library(clpfd)).

我们定义list_zmin_zmax/3如下:
list_zmin_zmax([E|Es],Min,Max) :-
   V #= E,
   list_zmin0_zmin_zmax0_zmax(Es,V,Min,V,Max).

list_zmin0_zmin_zmax0_zmax([]    ,Min ,Min,Max ,Max).
list_zmin0_zmin_zmax0_zmax([E|Es],Min0,Min,Max0,Max) :-
   V    #= E,
   Min1 #= min(Min0,V),
   Max1 #= max(Max0,V),
   list_zmin0_zmin_zmax0_zmax(Es,Min1,Min,Max1,Max).

与以前相同的示例用法:
?- list_zmin_zmax([1,-10,1,0,7,7], Min,Max).
Min = -10,
Max = 7.

好!对非整数的支持呢?
?- list_zmin_zmax([1,-10,1,0,7.2,7,7], Min,Max).
ERROR: Domain error: `clpfd_expression' expected, found `7.2'

我们期望得到一个错误,我们得到一个错误...

注意,感谢clpfd,我们也可以运行更多常规查询!
?- list_zmin_zmax([A,B], Min,Max).
A #>= Min, Max #>= A, Min #= min(A,B),
B #>= Min, Max #>= B, Max #= max(A,B).

关于prolog - 如何编写谓词minmax(L,X,Y)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12707798/

10-12 18:46