EjCadenas.pro



/**********************************************************/
/*                                                        */
/*               Inteligencia Artificial                  */
/*  Universidad de Alicante                               */
/*                                                        */
/*                LOGICA DE PRIMER ORDEN                  */
/*                       Prolog                           */
/*                                                        */
/*                                                        */
/*       S.O.       :  MS-DOS (Windows)                   */
/*       Interprete :  SWI-Prolog                         */
/*       Fichero    :  EJ09.PL                            */
/*                                                        */
/**********************************************************/

/*          CADENAS DE CARACTERES          */

/*---- Procedimientos de cadenas SWI-Prolog  ----*/


eres ASCII


+String2=String3

% substring(+String,+Inicio,+Long,-Sub) <- Sub es la subcadena de String que empieza en Inicio y tiene Long caracteres



/*---- Procedimientos de cadenas definidos por el usuario ----*/

% leeCadena(Cad) <- lee la cadena de caracteres Cad hasta el return
leeCadena(Cad) :- 	leeCad(Lista),
			string_to_list(Cad,Lista).
leeCad(Cadena) :- 	get0(Car),
			(Car=10 ->
				Cadena=[]
			;
				leeCad(Lista),
				Cadena=[Car|Lista]
			).


% palabrasI(F,P,R) <- la frase F consta de las palabras P y el resto R
palabrasI(F,A1,A2) :- string_concat(S1,S2,F),
		     string_to_list(S2,L2),
		     (
			L2=[]
		     ; 
                     	(L2=[L|_],(L<97;L>122))
		     ),
		     string_to_atom(S1,A1),
		     string_to_atom(S2,A2).

% palabras(F,P) <- la frase F consta de las palabras de la lista P
palabras(F,R) :- 	string_to_list(F,LF),
			pasa(LF,P,L),
			( P\=[] ->
				(string_to_list(S,P),
				 string_to_atom(S,A),
				 R=[A|L])
			;
				R=L
			).

pasa([],[],[]).
pasa([N|R1],[],R) :- 	separador(N),!,
			pasa(R1,P,R2),
			( P\=[] ->
				(string_to_list(S,P),
				 string_to_atom(S,A),
				 R=[A|R2])
			;
				R=R2
			).
pasa([C|R1],[C|P],R2) :- pasa(R1,P,R2).


% subCadena(S,C) <- S es una subcadena de C
subCadena(S,C) :- 	string_to_list(S,LS),
			string_to_list(C,LC),
			buscaInicio(LS,LC).
subCad([],_).
subCad([L|R1],[L|R2]) :- subCad(R1,R2).

buscaInicio([L|S],[L|R2]) :- subCad(S,R2).
buscaInicio(S,[_|R2]) :- buscaInicio(S,R2).


% minusculas(S,M) <- M es l cadena S con todas las letras en minuscula
minusculas(S,M) :-	string_to_list(S,LS),
			minusc(LS,LM),
			string_to_list(M,LM).

minusc([],[]).
minusc([L|Resto],[M|RestoS]) :- 
	((L>=65,L=<90) ->
		M is L+32
	;
		M is L
	),
	minusc(Resto,RestoS).


% mayusculas(S,M) <- M es l cadena S con todas las letras en mayuscula
mayusculas(S,M) :-	string_to_list(S,LS),
			mayusc(LS,LM),
			string_to_list(M,LM).

mayusc([],[]).
mayusc([L|Resto],[M|RestoS]) :- 
	((L>=97,L=<122) ->
		M is L-32
	;
		M is L
	),
	mayusc(Resto,RestoS).


separador(32).  % espacio
separador(33).	% !
separador(40).	% (
separador(41).	% )
separador(44).	% ,
separador(45).	% -
separador(46).	% .
separador(58).	% :
separador(59).	% ;
separador(63).	% ?