繁体   English   中英

列表中的 Prolog 最小值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM