如何编写谓词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/