25
Estructuras recursivas erminos de salida erminos de entrada E/S con caracteres Archivos Metodolog´ ıa de Programaci´on I Tutorial de Prolog (3/3) Dr. Alejandro Guerra-Hern´ andez Departamento de Inteligencia Artificial Facultad de F´ ısica e Inteligencia Artificial [email protected] http://www.uv.mx/aguerra Maestr´ ıa en Inteligencia Artificial 2011

2011-prolog-slides-09.pdf

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.

Estructuras recursivas Terminos de salida Terminos de entrada E/S con caracteres Archivos

Ejercicio

I Escriban un predicado triangulo/1 cuyo argumento es unentero positivo y su salida es como sigue:

?- triangulo (5).

*

* *

* * *

* * * *

* * * * *

true.