/*
 * ej-02-07.pl
 * Un dispositivo envia secuencias de datos bajo la forma de listas
 * de enteros, los cuales se desean clasificar de acuerdo al patrón
 * que los mismos representan.  Se ha decidido que cada secuencia
 * sea catalogada de la siguiente forma:
 *
 * ... @@@ poner dibujito ascii
 *
 * y si la misma no sigue ninguno de estos esquemas se identificara
 * como SINORDEN.
 *
 * Se le solicita que defina el predicado identifica/2, cuyo primer
 * argumento sea la secuencia de datos y el segundo corresponde al
 * simbolo que caracteriza la secuencia.  Se espera el siguiente
 * comportamiento de identifica/2:
 *
 * identifica( [1,3,4,10,99,98,23,2] , Z )
 * Z = maximo
 *
 * identifica( [34,3,6,99,100] , Z )
 * Z = minimo
 *
 * identifica( [34,35,67,67,67,30,21] , meseta )
 * true 
 *
 * identifica( [23,45,46,2,1,4] , sinorden )
 * true 
 *
 */

/* @@@ poner inicial/0 */
/* @@@ poner resultados de corrida */

/*
 * identifica(ListaEnteros, Simbolo)
 *
 * Simbolo es uno de los siguientes: maximo, minimo, meseta, sinorden
 */

identifica( L, maximo) :-
	append(L, L1, L2),
	creciente(L1),
	decreciente(L2), !.

identifica( L, minimo) :-
	append(L, L1, L2),
	decreciente(L1),
	creciente(L2), !.

identifica( L, meseta) :-
	append(L, L1, Laux),
	append(Laux, L2, L3),
	creciente(L1),
	constante(L2),
	decreciente(L3), !.

identifica( _L, sinorden).


creciente( [_Unitario] ).

creciente( [X|Xs] ) :-
	minimo(Xs, Min),
	X < Min, !.


decreciente( [_Unitario] ).

decreciente( [X|Xs] ) :-
	maximo(Xs, Max),
	X > Max.


constante( [_Unitario] ).

constante( [X,X|Y] ) :-
	constante( [X|Y] ).


maximo([N], N ).

maximo([X|Y], X) :-
	maximo(Y, My),
	X > My, !.

maximo([_X|Y], My) :-
	maximo(Y, My).


minimo([N], N ).

minimo([X|Y], X) :-
	minimo(Y, My),
	X < My, !.

minimo([_X|Y], My) :-
	minimo(Y, My).


/* EOF ej-02-07.pl */
