% BURBUJA
/*
 Predicado: burbuja(L,R)

 Entrada:
   L: lista de datos 

  Salida
   R: lista ordenada de datos (orden creciente)

  Descripción 
       En cada paso, se coloca el elemento más pequeño al princio de la lista.
  
  Ejemplo

  Ordenado    | No ordenado
              | 5 4 1 3 2
  1           | 5 4 2 3
  1 2         | 5 4 3
  1 2 3       | 5 4
  1 2 3 4     | 5
  1 2 3 4 5   | 

*/

% Lista vacía.
burbuja([],[]):-!.

% Lista no vacía
burbuja(L,[P|Ordenada]):-
	traer_minimo(L,[P|Cola]),
	burbuja(Cola,Ordenada).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

/*
  Predicado auxiliar: traer_minimo(L,R).

  Entrada:
    L: lista de datos 

  Salida
    R: lista de datos donde el primero es el menor.
  
  Descripción: empezando por el final de la lista, se van intercambiando los datos hasta colocar el menor al principio.

   No explorado | Explorado 
   5  4  1  3 2 | 
   5  4  1  3   | 2   
   5  4  1      | 2 3
   5  4         | 1 2 3   
   5            | 1 4 2 3
                | 1 5 4 2 3
*/

% Lista vacía
traer_minimo([],[]):-!.

% Lista con un elemento
traer_minimo([X],[X]):-!.

% Lista con dos elemento: el segundo es menor que el primero
% El símbolo @ también permite comparaciones de datos no numéricos 
traer_minimo([X,Y],[Y,X]) :- 	Y @< X, !.

% Lista con dos elementos: el primero es menor o igual que el segundo 
traer_minimo([X,Y],[X,Y]):-!.

% Lista con más de dos elementos
traer_minimo([X,Y|Cola], L) :-
  % Se  obtiene el menor M a partir del segundo elemento
	traer_minimo([Y|Cola],[M|Resto]),
  % Se compara M con el primer elemento de la lista 
  % El símbolo @ también permite comparaciones de datos no numéricos 
	(
	 X @=< M -> L = [X,M|Resto];
	 X @> M  -> L = [M,X|Resto]
	).