2009-11-29 5 views
6

¿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:Definición de dos cláusulas para encontrar el número máximo en una lista

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, se dice que hay un error de sintaxis que no puedo ver bien, y sé que no es de dos cláusula tampoco. ¿Alguien sabe cómo podría simplificarlo para convertirlo en dos cláusulas?

+1

Si esta es la tarea, usted debe agrega la etiqueta 'tarea' a la pregunta. –

+0

No, esto no es tarea, es solo una dificultad básica que encontré cuando traté de usar Prolog. – Taylor

Respuesta

5

El error de sintaxis resulta del hecho de que las dos primeras cláusulas no tienen cuerpo.

Para responder a su pregunta, observamos que el máximo de una lista se puede definir de la siguiente manera inductiva:

  • El máximo de una lista con un elemento es ese elemento.
  • El máximo de una lista con elementos múltiples es el más grande de la cabeza y el máximo de la cola.

Por lo tanto,

max_list([H], H). 
max_list([H|T], M2) :- 
    max_list(T, M), 
    M2 is max(H, M). 

Este código utiliza max/2 (SWI-Prolog, GNU-Prolog). Tenga en cuenta que la mayoría o todas las implementaciones de Prolog tendrán una función integrada max_list/2 (S, G), por lo que en realidad no es necesario que la defina usted mismo.

Editar:Bakore notes 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). 
10

Como usted, utilizo el nombre 'max' para el predicado.Esta aplicación no se basan en cualquier predicado incorporado:

max([X],X). 
max([X|Xs],X):- max(Xs,Y), X >=Y. 
max([X|Xs],N):- max(Xs,N), N > X. 
+2

Será más eficiente si agrega un corte al final de la primera línea: max ([X], X): - !. –

+3

Hola, hombre, ¿puedes explicar lo que está pasando aquí? –

1

Aquí es una solución para un máximo de 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]]). 
1

DOMINIOS

num=INTEGER 
list = num* 

PREDICADOS

nondeterm maxList(list,num) 

CLAUSES

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. 

META

maxList([1,2,3,5,4],Max). 
0

Creo que el código de abajo va a resolver el problema:

max_list([],0). 
max_list([H],H). 
max_list([H|T],M):- max_list(T,M1),M is max(H,M1). 
+0

¿Qué debería 'max_list ([- 1], M)' ser? Según su definición: 'M = 0' y' M = -1'. – false

1

Esta 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. 
+0

-1: 'm ([- 1, -2], M)' da 'M = 0' – false

-2
list([H],H). 
list([H1,H2|T],X):-H1>H2,list([H1|T],X). 
list([_|T],X):-list(T,X). 

Objetivo: list([3,9,4,5],M)

Salida: M=9

+0

¿Cómo funciona esto y cómo mejora en otras respuestas? – Mark

+0

-1: 'list ([3,2,1], M)' da 'M = 3; M = 1; M = 2; M = 1' – false

0

Sé que esta pregunta es viejo, pero aquí es una respuesta usando la construcción if-then-else:

maxmember([X],X). 
maxmember([H|T],Max) :- maxmember(T, M),(H>M -> Max is H ; Max is M). 
Cuestiones relacionadas