[英]Prolog minimum value in a list
我正在定义一个谓词min_in_list/2
,它会在列表中找到最小值。 如果列表中的元素少于 2 个,程序应该输出"Error: There are not enough elements in the list"
并且如果"Error: There are not enough elements in the list"
的元素不是数字,例如。 [2,a,3]。 程序应该输出"Error: The element is not a number"
。 我创建了一个谓词,可以找到最小值并检查列表是否少于两个值,但是我在检查列表的元素是否不是数字并输出错误消息时遇到问题
我的代码:
min_in_list([Min],_):- write('ERROR: List has fewer than two elements.').
min_in_list([],_):- write('ERROR: List has fewer than two elements.').
min_in_list([Min,_],Min).
min_in_list([H,K|T],M) :-
H =< K,
min_in_list([H|T],M).
min_in_list([H,K|T],M) :-
H > K,
min_in_list([K|T],M).
您正在寻找的测试是number/1
,它告诉您一个值是否为数字。 我的最终代码如下所示:
min_in_list([], _) :- domain_error(not_empty_list, []).
min_in_list([X], _) :- domain_error(not_single_item_list, [X]).
min_in_list([X,Y|Rest], Min) :- min_in_list(X, [Y|Rest], Min).
min_in_list(Min, [], Min) :- !.
min_in_list(Min, [X|Rest], FinalMin) :-
( number(X) ->
(NewMin is min(Min, X),
min_in_list(NewMin, Rest, FinalMin))
;
type_error(number, X)
).
我仍然不完全确定如何格式化这样的条件,但将其拆分为单独的谓词似乎是一种可怕的浪费。 希望有人会过来告诉我如何格式化它以使其具有吸引力。
如果你使用 SWI-Prolog,你可以使用must_be/2
来简化事情:
min_in_list(Min, [], Min).
min_in_list(Min, [X|Rest], FinalMin) :-
must_be(number, X),
NewMin is min(Min, X),
min_in_list(NewMin, Rest, FinalMin).
最简单的解决方案可以是:
list(Min, [Min]).
list(Min, [H|T]) :- list(PMin, T), Min is min(H, PMin).
但是必须注意,这将是大数组的堆栈开销。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.