/* ejemplos de definiciones con swi Prolog
   Para cargar ejemplos: 'consult(ejs).'
   Para obtener informacion: 'help.'
			     'help(tema).'
			     'apropos(tema).' */


% concatenacion de dos listas (equivalente al append predefinido)
append2([],L,L).
append2([H|T1],L,[H|T2]) :- append2(T1,L,T2).

% concatenacion de tres listas
append3(A,B,C,R) :- append2(A,X,R), append2(B,C,X).

% sublistas de una lista (de por lo menos largo 1)
sublista(L,[E|R]) :- append3(_,[E|R],_,L).

% sublistas de una lista (de por lo menos largo 2)
sublista2(L,[E1,E2|R]) :- append3(_,[E1,E2|R],_,L).

% pertenencia a una lista (equivalente al member predefinido)
pertenece(X,[X|_]).
pertenece(X,[_|R]) :- pertenece(X,R).
% consulta 'pertenece(1,X).' genera una recursion infinita si X no instanciada

% pertenencia de elemento a rango de valores (equivalente a between)
entre(Desde,Desde,Hasta) :- Desde=<Hasta.
% Desde y Hasta tienen que estar instanciadas
% notese que el predicado de comparacion es '=<' y no '<='.
% tambien se puede: entre(X,Desde,Hasta) :- Desde=<Hasta, X=Desde.
entre(X,Desde,Hasta) :- Cota is Desde+1, Cota=<Hasta, entre(X,Cota,Hasta).

% pertenencia a un arbol de busqueda binaria
busca(E,nodo(E,_,_)). % esta en la raiz
busca(E,nodo(R,I,_)) :- E < R, busca(E,I). % esta en sub arbol izq.
busca(E,nodo(R,_,D)) :- E > R, busca(E,D). % esta en sub arrbol der.

% alternativas (equivalente a If-then-else predefinido).
alternativa(C,V,_) :- C,!,V.
alternativa(_,_,F) :- F.
% notese que C, V y F representan predicados
% If-then-else(C,V,F) tambien se puede escribir como C -> V ; F


