prolog - sintaxis - Definición de dos cláusulas para encontrar el número máximo en una lista
sintaxis de prolog (8)
Como tú, uso el nombre ''máximo'' para el predicado. Esta implementación no depende de ningún predicado incorporado:
max([X],X).
max([X|Xs],X):- max(Xs,Y), X >=Y.
max([X|Xs],N):- max(Xs,N), N > X.
¿Cómo escribiría una definición recursiva de dos cláusulas para encontrar el valor máximo en una lista? Hasta ahora he escrito esto:
max(L,M):-
max([H|T],M):-
max(T,H,M).
max([],M,M).
max([H|T],Y,M):-
H =< Y,
max(T,Y,M).
max([H|T],Y,M):-
H > Y,
max(T,H,M).
Esto no funciona, dice que hay un error de sintaxis que no puedo ver, y sé que tampoco es una cláusula doble. ¿Alguien sabe cómo podría simplificarlo para convertirlo en dos cláusulas?
Aquí hay una solución para max en listas de listas
max_list([], C, C).
max_list([H|T], C, M) :- C2 is max(C, H), max_list(T, C2, M).
max_list([], []).
max_list([[H|HB]|B],[RH|RB]) :- max_list(HB, H, RH), max_list(B, RB).
ex: max_list([[1,3,6], [6,3,8,2],[2,1,0]]).
DOMINIOS
num=INTEGER
list = num*
PREDICA
nondeterm maxList(list,num)
CLAUSULAS
maxList([A],A).
maxList([A|List],Max):- Max=A,maxList(List,Max1),A>=Max1.
maxList([A|List],Max):- Max=Max1,
maxList(List,Max1),A< Max1.
GOL
maxList([1,2,3,5,4],Max).
Creo que el siguiente código resolverá el problema:
max_list([],0).
max_list([H],H).
max_list([H|T],M):- max_list(T,M1),M is max(H,M1).
Este funciona con seguridad
l:-listing.
m(L,X):-aku2(L,0,X).
aku2([],B,B).
aku2([G|O],Maks,C):-maks(Maks,G,Maks1),aku2(O,Maks1,C).
maks(A,B,C):-A>B, C is A.
maks(A,B,C):-A=<B, C is B.
list([H],H).
list([H1,H2|T],X):-H1>H2,list([H1|T],X).
list([_|T],X):-list(T,X).
Meta: list([3,9,4,5],M)
Salida: M=9
Sé que esta pregunta es antigua, pero he aquí una respuesta usando el constructo if-then-else:
maxmember([X],X).
maxmember([H|T],Max) :- maxmember(T, M),(H>M -> Max is H ; Max is M).
El error de sintaxis resulta del hecho de que las dos primeras cláusulas no tienen cuerpo.
Para responder a su pregunta, observe que el máximo de una lista se puede definir inductivamente de la siguiente manera:
- El máximo de una lista con un elemento es ese elemento.
- El máximo de una lista con múltiples elementos es el más grande de la cabeza y el máximo de la cola.
Así,
max_list([H], H).
max_list([H|T], M2) :-
max_list(T, M),
M2 is max(H, M).
Este código usa max/2
( SWI-Prolog , GNU-Prolog ). Tenga en cuenta que la mayoría o todas las implementaciones de Prolog tendrán una función max_list/2
( S , G ), por lo que no es necesario definirla usted mismo.
Editar: Bakore observa que una implementación recursiva de cola puede ser más eficiente. Puede hacer esto definiendo un predicado max_list/3
que toma un argumento adicional C
, es decir, el valor más grande visto hasta ahora.
max_list([H|T], M) :- max_list(T, H, M).
max_list([], C, C).
max_list([H|T], C, M) :- C2 is max(C, H), max_list(T, C2, M).