/*
 * ej-03-09.pl
 *

Un árbol binario se considera ordenado con respecto a un criterio dado, 
cuando cada nodo raíz R del árbol o de cualquier subárbol contenido en 
él:

  * es precedido (de acuerdo con el criterio de orden establecido) por
    todo nodo raíz del subárbol izquierdo del subárbol cuya raíz es R.

  * precede a todo nodo raíz del subárbol derecho del subárbol cuya raíz 
    es R.

Considere que todo nodo hoja es un subárbol ordenado.

Se le pide que defina el predicado:

               ordenLexicografico( ArbolBinario )

que posee el argumento ArbolBinario, el cual representa un árbol binario 
cuyos nodos son símbolos consistentes en secuencias de caracteres.  La 
evaluación de ordenLexicografico dará como resultado True si el árbol 
que es argumento se encuentra ordenado alfabéticamente.

Considere que puede utilizar (o se que ya está definido) el predicado:

               list_text( ListaValoresASCII, Simbolo )

el cual acepta como argumento un Simbolo y unifica el argumento 
ListaValoresASCII con la lista de valores ASCII correspondiente a los 
caracteres que componen ese simbolo.

NOTA FUERA DEL ENUNCIADO: atom_codes(Atom, Code_list) es el predicado 
del estándar ISO Prolog que hace lo que list_text/2.

?- list_text(L, paradigma)
   L = [112, 97, 114, 97, 100, 105, 103, 109, 97]

Los valores ASCII son enteros asociados a los caracteres que guardan el 
mismo orden que los caracteres que representan.

Al definir cada predicado que requiera, debe describir antes de 
desarrollar el código:

  * OBJETIVO: indique qué se desea obtener con el predicado a definir.
  * ARGUMENTOS: indique el tipo (lista, símbolo, etc.) y el significado.

 */

/*
 * nodo(Raiz, ArbolIzquierdo, ArbolDerecho)
 */

ordenLexicografico(nodo(R, I, D)) :-
	arbol_precede_nodo(I, R),
	nodo_precede_arbol(R, D).


arbol_precede_nodo( nil, _CualquierNodo ).

arbol_precede_nodo( nodo(N1, I, D), N2 ) :-
	nodo_precede_nodo(N1, N2),
	arbol_precede_nodo(I, N2),
	arbol_precede_nodo(D, N2).

nodo_precede_nodo(N1, N2) :-
	atom_codes(N1, L1),
	atom_codes(N2, L2),
	lista_precede_lista(L1, L2).

lista_precede_lista( [], _).

lista_precede_lista( [_|_], [] :- !, fail.

lista_precede_lista( [X|Xs], [Y|Ys] ) :-
	X <= Y,
	lista_precede_lista(Xs, Ys).



nodo_precede_arbol( _CualquierNodo, nil ).

nodo_precede_arbol( N1, nodo(N2, I, D) ) :-
	nodo_precede_nodo(N1, N2),
	nodo_precede_arbol(N1, I),
	nodo_precede_arbol(N1, D).

/*
 * atom_codes/2: atom_codes(+atom, ?character_code_list)
 * atom_codes(Atom, Codes) succeeds if Codes is the list of character codes
 * whose values are the successive characters of the name of Atom.
 * ISO Prolog predicate.
 */


/* EOF ej-03-09.pl */
