在列表中查找最大值 - Prolog

use*_*815 5 prolog

我刚刚被介绍给Prolog并且我正在尝试编写一个谓词来查找整数列表的Max值.我需要写一个从开头比较的比较结果.到目前为止,我有:

max2([],R).
max2([X|Xs], R):- X > R, max2(Xs, X).
max2([X|Xs], R):- X <= R, max2(Xs, R).
Run Code Online (Sandbox Code Playgroud)

我意识到R尚未启动,因此无法进行比较.我需要3个参数才能完成此操作吗?

sal*_*lva 6

忽略从开头或结尾开始的家庭作业约束,实现获取数字最大值的谓词的正确方法如下:

list_max([P|T], O) :- list_max(T, P, O).

list_max([], P, P).
list_max([H|T], P, O) :-
    (    H > P
    ->   list_max(T, H, O)
    ;    list_max(T, P, O)).
Run Code Online (Sandbox Code Playgroud)


toi*_*ski 6

一个非常简单的方法(从头开始)如下:

maxlist([],0).

maxlist([Head|Tail],Max) :-
    maxlist(Tail,TailMax),
    Head > TailMax,
    Max is Head.

maxlist([Head|Tail],Max) :-
    maxlist(Tail,TailMax),
    Head =< TailMax,
    Max is TailMax.
Run Code Online (Sandbox Code Playgroud)

正如您所说,如果要计算算术表达式,则必须实例化变量。要解决这个问题,首先必须进行递归调用,然后进行比较。

希望能帮助到你!


BLU*_*IXY 5

my_max([], R, R). %end
my_max([X|Xs], WK, R):- X >  WK, my_max(Xs, X, R). %WK is Carry about
my_max([X|Xs], WK, R):- X =< WK, my_max(Xs, WK, R).
my_max([X|Xs], R):- my_max(Xs, X, R). %start
Run Code Online (Sandbox Code Playgroud)

另一种方式

%max of list
max_l([X],X) :- !, true.
%max_l([X],X). %unuse cut
%max_l([X],X):- false.
max_l([X|Xs], M):- max_l(Xs, M), M >= X.
max_l([X|Xs], X):- max_l(Xs, M), X >  M.
Run Code Online (Sandbox Code Playgroud)