/* maximo-entero.pl */

/* prueba_maximo_entero_1(+lista_enteros, ?simbolo, +resultado_logico)
 * el "simbolo" puede ser un entero o una variable
 * el "resultado_logico" es una cadena de caracteres que puede tomar
 * uno de dos valores: "acerto" ó "fallo"
 */
p01( [], 			 _, 'fallo').
p02( [],			 2, 'fallo').
p03( [a,b,c],		 _, 'fallo').
p04( [a,b,c],		 c, 'fallo').
p05( [a,b,c],		 2, 'fallo').
p06( 4,				 _, 'fallo').
p07( [1,2,3],		 3, 'acerto').
p08( [4,3,2,1,0],	 4, 'acerto').
p09( [4,3,2,4,6,0,2,6,0], 6, 'acerto').
p10( [1,1,1,1],		 1, 'acerto').

/* prueba(+lista_enteros, ?simbolo, +resultado_logico)
 * el "simbolo" puede ser un entero o una variable
 * el "resultado_logico" es una cadena de caracteres que puede tomar
 * uno de dos valores: "acerto" ó "fallo"
 * Se escribe en la pantalla el resultado de una comprobación.
 */
prueba(NroPrueba, ListaEnteros, MaximoEntero, AcertoFallo) :-
	write('prueba '),
	write(NroPrueba),
	write(': maximo_entero('),
    write(ListaEnteros),
    write(', '),
    write(MaximoEntero),
    write(') -> esperado='),
    write(AcertoFallo),
	write('/real='),
    maximo_entero(ListaEnteros,MaximoEntero), !,
    write('acerto'),
    nl,nl.

prueba(_,_,_,_) :- write('fallo'), nl,nl.

/* todas_las_pruebas/0 -- es para abreviar cuando deseo
 * correr todo el lote de pruebas ininterrumpidamente
 */
todas_las_pruebas :-
	prueba_01,
	prueba_02,
	prueba_03,
	prueba_04,
	prueba_05,
	prueba_06,
	prueba_07,
	prueba_08,
	prueba_09,
	prueba_10,
	prueba_11.

/* prueba_1/0 es el punto de entrada para hacer la comprobación 
 * del caso p01
 */
prueba_01 :- p01(L, M, C), prueba( 1, L, M, C).
prueba_02 :- p02(L, M, C), prueba( 2, L, M, C).
prueba_03 :- p03(L, M, C), prueba( 3, L, M, C).
prueba_04 :- p04(L, M, C), prueba( 4, L, M, C).
prueba_05 :- p05(L, M, C), prueba( 5, L, M, C).
prueba_06 :- p06(L, M, C), prueba( 6, L, M, C).
prueba_07 :- p07(L, M, C), prueba( 7, L, M, C).
prueba_08 :- p08(L, M, C), prueba( 8, L, M, C).
prueba_09 :- p09(L, M, C), prueba( 9, L, M, C).
prueba_10 :- p10(L, M, C), prueba(10, L, M, C).
 
prueba_11 :- ListaEnteros = [1,6,3,7,8,0],
    write('prueba 11: maximo_entero('),
    write(ListaEnteros),
    write(', '),
    write(MaximoEntero),
    write(') -> esperado=acerto/real='),
    maximo_entero(ListaEnteros,MaximoEntero), !,
    write('acerto'), nl,
	write('El maximo es: '),
    write(MaximoEntero),
    nl,nl.
prueba_11 :- write('fallo'), nl,nl.

todas_las_pruebas_2 :-
	write('cte en el resultado:'),
	maximo_entero([1,2,1,3],3),
	write('acerto'), nl,
	write('variable en el resultado (debe dar 4):'),
	maximo_entero([1,4,3],X),
	write(X), nl,
	write('lista vacia (debe fallar):'),
	maximo_entero([],Y),
	write(Y), nl.

todas_las_pruebas_2 :-
	write('fallo'), nl.

maximo_entero([X], X) :- !, number(X).

maximo_entero([X|Xs], X) :-
	number(X), /* esto hace falta para que p03 y p04 no den una excepcion */
	maximo_entero(Xs,M),
	X >= M. /* si no hay elementos duplicados no hace falta el = */

maximo_entero([X|Xs], M) :-
	number(X), /* esto hace falta para que p03 y p04 no den una excepcion */
	maximo_entero(Xs,M),
	X < M.


/* EOF maximo-elemento.pl */
