Upload
hectorgonzalez
View
214
Download
0
Tags:
Embed Size (px)
Citation preview
Estructuras recursivas Terminos de salida Terminos de entrada E/S con caracteres Archivos
Metodologıa de Programacion ITutorial de Prolog (3/3)
Dr. Alejandro Guerra-Hernandez
Departamento de Inteligencia ArtificialFacultad de Fısica e Inteligencia Artificial
[email protected]://www.uv.mx/aguerra
Maestrıa en Inteligencia Artificial 2011
Estructuras recursivas Terminos de salida Terminos de entrada E/S con caracteres Archivos
Arboles binarios
I Un arbol es un nodo vacıo, o un nodo con dos hijos que sonarboles.
vacio 2
vacio vacio
1
vacio vacio
3
Estructuras recursivas Terminos de salida Terminos de entrada E/S con caracteres Archivos
Insertar un elemento
1 insertaArbol(X,vacio ,arbol(X,vacio ,vacio)).
2
3 insertaArbol(X,arbol(X,A1,A2),arbol(X,A1 ,A2)).
4
5 insertaArbol(X,arbol(Y,A1,A2),arbol(Y,A1N ,A2)) :-
6 X<Y, insertaArbol(X,A1 ,A1N).
7 insertaArbol(X,arbol(Y,A1,A2),arbol(Y,A1 ,A2N)) :-
8 X>Y, insertaArbol(X,A2 ,A2N).
?- insertaArbol (1,vacio ,Arbol1), insertaArbol (2,
Arbol1 ,Arbol2).
Arbol1 = arbol(1, vacio , vacio),
Arbol2 = arbol(1, vacio , arbol(2, vacio , vacio))
Estructuras recursivas Terminos de salida Terminos de entrada E/S con caracteres Archivos
Lista a Arbol
1 creaArbol ([],A,A).
2 creaArbol ([X|Xs],AAux ,A) :- insertaArbol(X,
AAux ,A2),
3 creaArbol(Xs,A2 ,A).
4
5 lista2arbol(Xs ,A) :- creaArbol(Xs,vacio ,A).
?- lista2arbol ([2,1,3],A).
A = arbol(2, arbol(1, vacio , vacio), arbol(3,
vacio , vacio))
Estructuras recursivas Terminos de salida Terminos de entrada E/S con caracteres Archivos
Nodos de un Arbol
1 nodos(vacio ,[]).
2 nodos(arbol(X,A1,A2),Xs) :-
3 nodos(A1,Xs1),
4 nodos(A2,Xs2),
5 append(Xs1 ,[X|Xs2],Xs).
?- lista2arbol ([1,2,3],A), nodos(A,L).
A = arbol(1, vacio , arbol(2, vacio , arbol(3, vacio
, vacio))),
L = [1, 2, 3]
Estructuras recursivas Terminos de salida Terminos de entrada E/S con caracteres Archivos
Ordena Lista por Insercion en Arbol
1 ordenaLista(L1 ,L2) :-
2 lista2arbol(L1 ,A),
3 nodos(A,L2).
?- ordenaLista ([4,2,3,1,5],L).
L = [1, 2, 3, 4, 5]
Estructuras recursivas Terminos de salida Terminos de entrada E/S con caracteres Archivos
write/1 y nl/0
I write/1 toma un argumento que debe ser un termino Prolog.
I La evaluacion de este predicado causa (bye bye programacionlogica pura) que su argumento sea escrito en el flujo de salidaactual (por default el monitor).
I Tambien hemos utilizado el predicado nl/0 que denotauna nueva lınea en el flujo de salida.
Estructuras recursivas Terminos de salida Terminos de entrada E/S con caracteres Archivos
Ejemplos
?- write (38), nl.
38
true.
?- write(’una cadena de caracteres ’), nl.
una cadena de caracteres
true.
?- write ([a,b,c,d,[e,f,g]]), nl.
[a, b, c, d, [e, f, g]]
true.
?- write(mi_predicado_tonto(a)), nl.
mi_predicado_tonto(a)
true.
?- write(’Maestrıa en’), nl, write(’IA’),nl.
Maestrıa en
IA
true.
Estructuras recursivas Terminos de salida Terminos de entrada E/S con caracteres Archivos
writeq/1
I Observen que el apostrofo se pierde en la salida al usarwrite/0. Si es importante conservarlo, se puede usar writeq/1:
?- writeq(’una cadena de caracteres ’).
’una cadena de caracteres ’
true.
?- writeq(’mira mis apostrofos ’).
’mira mis apostrofos ’
true.
?- write(’ahora no los ves’).
ahora no los ves
true.
Estructuras recursivas Terminos de salida Terminos de entrada E/S con caracteres Archivos
read/1
I El predicado read/1 provee la captura de terminos de entrada.
I Su unico argumento debe ser una variable.
I Su evaluacion causa (efecto secundario) que un termino sealeıdo del flujo de entrada actual (teclado).
I La lectura del termino termina con un punto “.” y un caracteren blanco, por ejemplo, un salto de lınea o un espacio.
I Al momento de la lectura el prompt de Prologsuele cambiar, por ejemplo a “|:”
Estructuras recursivas Terminos de salida Terminos de entrada E/S con caracteres Archivos
Ejemplos
I El argumento de read/1 unifica con el termino leıdo:
?- read(X).
|: juan.
X = juan.
?- read(X).
|: mi_predicado_tonto(b).
X = mi_predicado_tonto(b).
?- read(Y).
|: ’alejandro guerra ’.
Y = ’alejandro guerra ’.
I Si la variable ya tuviese un valor asociado, la meta tieneexito solo si el nuevo valor unifica con el anterior!
?- X=alfredo , read(X).
|: juan.
false.
Estructuras recursivas Terminos de salida Terminos de entrada E/S con caracteres Archivos
ASCII
I Para algunas aplicaciones es mas conveniente bajar el nivel delas operaciones de E/S a caracteres. Por ejemplo, usandocodigo ASCII para manipular cadenas.
valor signo valor signo valor signo valor signo9 tab 40 ( 59 ; 94 ˆ
10 eof 41 ) 60 ¡ 9532 espacio 42 * 61 = 96 ´33 ! 43 + 62 > 97–122 a – z34 “ 44 , 63 ? 123 {
I etc. (los caracteres en blanco < 32).
Estructuras recursivas Terminos de salida Terminos de entrada E/S con caracteres Archivos
Salida de caracteres
I Se utiliza en predicado put/1 cuyo argumento debe ser unnumero en 0 . . . 255
?- put (97), nl.
a
true.
?- put (122), nl.
z
true.
?- put (64), nl.
@
true.
Estructuras recursivas Terminos de salida Terminos de entrada E/S con caracteres Archivos
Entrada de caracteres
I Se utilizan los predicados get0/1 y get/1. El primero puedeaceptar caracteres en blanco. El segundo no.
?- get0(X).
|: a
X = 97.
?- get(X).
|: a
X = 97.
?- get0(X).
|:
X = 32.
?- get(X).
|:
|: .
X = 46.
Estructuras recursivas Terminos de salida Terminos de entrada E/S con caracteres Archivos
Preguntita
I ¿Que hace el siguiente programa logico con la meta readin?
1 readin :- get0(X), process(X).
2 process (42).
3 process(X) :- X =\= 42, write(X), nl , readin.
Estructuras recursivas Terminos de salida Terminos de entrada E/S con caracteres Archivos
Corrida
I El predicado lee una secuencia de caracteres hasta encontrar“*”. Imprime uno a uno de estos caracteres excluyendo “*”.
?- readin.
|: hola*
104
111
108
97
Estructuras recursivas Terminos de salida Terminos de entrada E/S con caracteres Archivos
Contador de caracteres
1 cuenta(Total) :- cuenta_aux (0,Total).
2 cuenta_aux(Acc ,Res) :-
3 get0(X), process(X,Acc ,Res).
4
5 process (42,Acc ,Acc).
6 process(X,Acc ,Res) :-
7 X=\=42 , Acc1 is Acc+1,
8 cuenta_aux(Acc1 ,Res).
?- cuenta(X).
|: hola*
X = 4
Estructuras recursivas Terminos de salida Terminos de entrada E/S con caracteres Archivos
Cuenta vocales
1 cuenta_vocales(Total) :- cuenta_vocales_aux
(0,Total).
2 cuenta_vocales_aux(Acc ,Res) :-
3 get0(X), process_vocales(X,Acc ,Res).
4
5 process_vocales (42,Acc ,Acc).
6 process_vocales(X,Acc ,Res) :-
7 X=\=42 , processChar(X,Acc ,N),
8 cuenta_vocales_aux(N,Res).
9
10 processChar(X,Acc ,N) :- vocal(X), N is Acc +1.
11 processChar(_,Acc ,Acc).
12
13 vocal (65). %% % Mayusculas
14 vocal (69). vocal (73).
15 vocal (79). vocal (85).
16 vocal (97). %% % Minusculas
17 vocal (101). vocal (105).
18 vocal (111). vocal (117).
Estructuras recursivas Terminos de salida Terminos de entrada E/S con caracteres Archivos
Corridas cuenta vocales
?- cuenta_vocales(X).
|: andaba herrado*
X = 6
?- cuenta_vocales(Z).
|: kdvzktvsk*
Z = 0
Estructuras recursivas Terminos de salida Terminos de entrada E/S con caracteres Archivos
Salida: tell/1, told/0 y telling/1
I Para cambiar el flujo de salida actual se usa tell/1 cuyoargumento es una variable o un atomo representando unnombre de archivo. Ej: tell(′salida.txt ′)
I El flujo de salida estandar es user .
I El predicado told/0 cierra el flujo actual de salida y vuelva aestablecer user como el flujo actual de salida.
I El argumento de telling/1 suele ser una variable que unificacon el nombre del flujo de salida actual. Ej:
?- telling(X).
X = user.
Estructuras recursivas Terminos de salida Terminos de entrada E/S con caracteres Archivos
Entrada: see/1, seen/0 y seeing/1
I El argumento de see/1 suele ser una variable o un atomorepresentando el nombre de un archivo. Ej:see(′mientrada.txt ′)
I Al evaluar este predicado, el archivo se vuelve el flujo deentrada actual. Si no es posible abrir el archivo se genera unerror.
I El flujo de entrada estandar tambien es user .
I Para cerrar el flujo actual de entrada se usa seen/0.
I El argumento de seeing/1 suele ser una variable queunifica con el identificador del flujo de entrada actual.
Estructuras recursivas Terminos de salida Terminos de entrada E/S con caracteres Archivos
Lectura de archivos
I El predicado read/1 normalmente toma como argumento unavariable que unifica con la lınea leıda del flujo actual deentrada.
I Si el final del archivo es alcanzado al usar read/1 la variableunifica con el atomo end of file
I Si el final de archivo se alcanzo usando get0/1 o get/1, elvalor unificado con la variable depende de la implementacion,pero siempre esta fuera del rango de los caracteres ASCII,por ejemplo -1.
Estructuras recursivas Terminos de salida Terminos de entrada E/S con caracteres Archivos
Ejemplo
I Contar vocales de un archivo.
1 vocs_file(Arch ,Total) :-
2 see(Arch),
3 cuenta_vocales_file (0,Total),
4 seen.
5
6 cuenta_vocales_file(Acc ,Res) :-
7 get0(X), process_vocales_file(X,Acc ,Res).
8
9 process_vocales_file (-1,Acc ,Acc).
10 process_vocales_file(X,Acc ,Res) :-
11 X =\= -1, processChar(X,Acc ,N),
12 cuenta_vocales_file(N,Res).
?- vocs_file(’/Users/aguerra/intro.tex’,R).
R = 2184
Estructuras recursivas Terminos de salida Terminos de entrada E/S con caracteres Archivos
Ejemplo
I El predicado copychars/1 copia una secuencia de caracteresque termina en “!” de la terminal a un archivo especificado:
1 copychars(Salida):-
2 telling(Actual), tell(Salida),
3 copychars_aux , told , tell(Actual).
4
5 copychars_aux :- get0(C), process_copy(C).
6
7 process_copy (33).
8 process_copy(C) :-
9 C =\= 33, put(C), copychars_aux.