5. Entrada y Salida en PROLOG

21
5. Entrada y Salida en PROLOG 5. Entrada y Salida en PROLOG 1. 1. Escritura de términos Escritura de términos 2. 2. Lectura de términos Lectura de términos 3. 3. Escritura y lectura de Escritura y lectura de caracteres caracteres 4. 4. Escritura en fichero Escritura en fichero 5. 5. Lectura de fichero Lectura de fichero

description

5. Entrada y Salida en PROLOG. Escritura de términos Lectura de términos Escritura y lectura de caracteres Escritura en fichero Lectura de fichero. 1. Escritura de términos (I). Predicado predefinido “ write(X) ”: Siempre se satisface Si X está instanciada, se muestra en pantalla. - PowerPoint PPT Presentation

Transcript of 5. Entrada y Salida en PROLOG

Page 1: 5. Entrada y Salida en PROLOG

5. Entrada y Salida en PROLOG5. Entrada y Salida en PROLOG

1.1. Escritura de términosEscritura de términos

2.2. Lectura de términosLectura de términos

3.3. Escritura y lectura de caracteresEscritura y lectura de caracteres

4.4. Escritura en ficheroEscritura en fichero

5.5. Lectura de ficheroLectura de fichero

Page 2: 5. Entrada y Salida en PROLOG

1. Escritura de términos (I)1. Escritura de términos (I)

Predicado predefinido “Predicado predefinido “write(X)write(X)”:”: Siempre se satisfaceSiempre se satisface Si X está instanciada, se muestra en pantalla.Si X está instanciada, se muestra en pantalla. Si no, se saca la variable interna (‘_G244’).Si no, se saca la variable interna (‘_G244’). Nunca se intenta re-satisfacer.Nunca se intenta re-satisfacer.

?- write(Beatriz)._G244Beatriz = _G244 ;No?- write("Beatriz").[66, 101, 97, 116, 114, 105, 122]Yes

?- write(beatriz).beatrizYes?- write('Beatriz').BeatrizYes

Page 3: 5. Entrada y Salida en PROLOG

Escritura de términos (II)Escritura de términos (II)

““nlnl” provoca un salto de línea. (?- nl.)” provoca un salto de línea. (?- nl.)

““tab(X)tab(X)” escribe X espacios en blanco. ” escribe X espacios en blanco. No coincide con la función de una máquina No coincide con la función de una máquina

de escribir convencional.de escribir convencional. Ambas sólo se satisfacen una sola vez.Ambas sólo se satisfacen una sola vez.

““display(X)display(X)” ” muestra X sin muestra X sin interpretar los functores/operadores.interpretar los functores/operadores.

Page 4: 5. Entrada y Salida en PROLOG

Escritura de términos (III)Escritura de términos (III)

?- nl, write('Beatriz'), tab(5), write('Gonzalez'), nl, write('Francisco'), tab(5), write('Perez').

Beatriz Gonzalez

Francisco Perez

Yes

?- L = [1, 2, 3, 4, 5], write(L).

[1, 2, 3, 4, 5]

L = [1, 2, 3, 4, 5]

yes

?- L = [1, 2, 3, 4, 5], display(L).

.(1, .(2, .(3, .(4, .(5, [])))))

L = [1, 2, 3, 4, 5]

yes

Page 5: 5. Entrada y Salida en PROLOG

Escritura de términos (IV)Escritura de términos (IV)

?- write(a+b*c/d), nl, display(a+b*c/d), nl.?- write(a+b*c/d), nl, display(a+b*c/d), nl.a+b*c/da+b*c/d+(a, /(*(b, c), d))+(a, /(*(b, c), d))YesYes

Por ejemplo, el operador “+” es declarado Por ejemplo, el operador “+” es declarado infijo con dos argumentos.infijo con dos argumentos.

““display” puede ser útil para recordar el orden display” puede ser útil para recordar el orden de precedencia:de precedencia:

?- write((a+b)*c/d), nl, display((a+b)*c/d), nl.?- write((a+b)*c/d), nl, display((a+b)*c/d), nl.(a+b)*c/d(a+b)*c/d/(*(+(a, b), c), d)/(*(+(a, b), c), d)YesYes

Page 6: 5. Entrada y Salida en PROLOG

2. Lectura de términos (I)2. Lectura de términos (I)

““read(X)”, lee por teclado un término, que se instanciará a read(X)”, lee por teclado un término, que se instanciará a la variable X.la variable X.

El término debe ir seguido de “.” y un carácter no El término debe ir seguido de “.” y un carácter no imprimible como el espacio o el retorno de carro.imprimible como el espacio o el retorno de carro.

hola :- write('Nombre: '), read(Nombre),hola :- write('Nombre: '), read(Nombre),write('Primer Apellido: '), read(Apellido1),write('Primer Apellido: '), read(Apellido1),write('Segundo Apellido: '), read(Apellido2), nl, write('Segundo Apellido: '), read(Apellido2), nl, write('Hola '), write(Nombre), tab(1),write('Hola '), write(Nombre), tab(1),write(Apellido1), tab(1), write(Apellido2).write(Apellido1), tab(1), write(Apellido2).

?- hola.?- hola.Nombre: Carlos.Nombre: Carlos.Primer Apellido: Alonso.Primer Apellido: Alonso.Segundo Apellido: Gonzalez.Segundo Apellido: Gonzalez.

Hola _L131 _L132 _L133 Hola _L131 _L132 _L133 (Lee términos: funciona con (Lee términos: funciona con minúsculas sólo)minúsculas sólo)

Page 7: 5. Entrada y Salida en PROLOG

Lectura de términos (II)Lectura de términos (II)

?- hola.?- hola.Nombre: carlos.Nombre: carlos.Primer Apellido: alonso.Primer Apellido: alonso.Segundo Apellido: gonzalez.Segundo Apellido: gonzalez.

Hola carlos alonso gonzalezHola carlos alonso gonzalez

?- hola.?- hola.Nombre: ‘Carlos’.Nombre: ‘Carlos’.Primer Apellido: ‘Alonso’.Primer Apellido: ‘Alonso’.Segundo Apellido: ‘Gonzalez’.Segundo Apellido: ‘Gonzalez’.

Hola Carlos Alonso GonzalezHola Carlos Alonso Gonzalez

Las mayúsculas se utilizan para designar a variables, por Las mayúsculas se utilizan para designar a variables, por eso se mostraba el valor del puntero a estas supuestas eso se mostraba el valor del puntero a estas supuestas variables: Carlos, Alonso y Gonzalezvariables: Carlos, Alonso y Gonzalez..

Podemos introducir términos en minúsculas, o cadenas.Podemos introducir términos en minúsculas, o cadenas.

Page 8: 5. Entrada y Salida en PROLOG

Lectura de términos (III)Lectura de términos (III)

¿Qué ocurre si ponemos?¿Qué ocurre si ponemos?

?- hola.?- hola.

Nombre: “Carlos”.Nombre: “Carlos”.

Primer Apellido: “Alonso”.Primer Apellido: “Alonso”.

Segundo Apellido: “Gonzalez”.Segundo Apellido: “Gonzalez”.

Hola ??Hola ??

Hola [67, 97, 114, 108, 111, 115] [65, 108, 111, 110, 115, 111] Hola [67, 97, 114, 108, 111, 115] [65, 108, 111, 110, 115, 111] [71, 111, 110, 122, 97, 108, 101, 122][71, 111, 110, 122, 97, 108, 101, 122]

Page 9: 5. Entrada y Salida en PROLOG

3. Escritura y lectura de 3. Escritura y lectura de caracteres (I)caracteres (I)

El carácter es la unidad más pequeña objeto El carácter es la unidad más pequeña objeto de lectura o escritura.de lectura o escritura.

Si una variable está instanciada a un código Si una variable está instanciada a un código ASCII (entero positivo): ASCII (entero positivo): ““put(X)put(X)” escribe el correspondiente carácter. ” escribe el correspondiente carácter.

No admite resatisfacción.No admite resatisfacción.

?- put(104), put(111), put(108), put(97).?- put(104), put(111), put(108), put(97).

holahola

?- X = 104, Y = 111, Z = 108, W=97, put(X), ?- X = 104, Y = 111, Z = 108, W=97, put(X), put(Y), put(Z), put(W).put(Y), put(Z), put(W).

hola.hola.

Page 10: 5. Entrada y Salida en PROLOG

Escritura y lectura de caracteres (II)Escritura y lectura de caracteres (II)

““get0(X)get0(X)” y “” y “get(X)get(X)” son objetivos que se ” son objetivos que se satisfacen si X no está instanciada.satisfacen si X no está instanciada.

Si X está instanciada, intenta hacer Si X está instanciada, intenta hacer matchingmatching con entrada.con entrada.

Además, no se resatisfacen.Además, no se resatisfacen.

Diferencia: “get0(X)” espera a instanciar en X Diferencia: “get0(X)” espera a instanciar en X el primer carácter tecleado, mientras que el primer carácter tecleado, mientras que “get(X)” captura el primero imprimible.“get(X)” captura el primero imprimible.

?- get(X).?- get(X).

|:<|:<CR>CR>

|: .|: .

X = 46X = 46

?- get0(X).?- get0(X).

|: <CR>|: <CR>

X = 10 ;X = 10 ;

Page 11: 5. Entrada y Salida en PROLOG

Ejercicios: L/E de términos Ejercicios: L/E de términos

Ejemplo: escritura estructurada de listas.Ejemplo: escritura estructurada de listas. La complejidad de la escritura de listas se debe al La complejidad de la escritura de listas se debe al

posible anidamiento con otras listas o estructuras.posible anidamiento con otras listas o estructuras. muestra(X, I):muestra(X, I): “muestra términos lista” “muestra términos lista”

X debe instanciar a la lista que se quiere mostrarX debe instanciar a la lista que se quiere mostrar I espacios sangría inicialI espacios sangría inicial ?- muestra([1, 2, 3], 1).?- muestra([1, 2, 3], 1).

112233

?- muestra([1,2,[3,4], 5, 6], 6).?- muestra([1,2,[3,4], 5, 6], 6).1122

33 44

5566

Page 12: 5. Entrada y Salida en PROLOG

4. Escritura en fichero (I)4. Escritura en fichero (I)

Existe un Existe un Canal de salida activoCanal de salida activo: por : por defecto, la pantalla.defecto, la pantalla.

““tell(X)”, establece la salida según lo tell(X)”, establece la salida según lo instanciado por X.instanciado por X.

Es un predicado que requiere que X esté Es un predicado que requiere que X esté instanciada; en caso contrario, se instanciada; en caso contrario, se produce un error.produce un error.

Como objetivo, no permite la Como objetivo, no permite la resatisfacción.resatisfacción.

Page 13: 5. Entrada y Salida en PROLOG

Escritura en fichero (II)Escritura en fichero (II)

Ejercicio:Ejercicio: Desviar la salida del predicado “muestra” Desviar la salida del predicado “muestra”

hacia el fichero c:\tmp\salida.txthacia el fichero c:\tmp\salida.txt?- tell(‘c:/tmp/salida.txt’).?- tell(‘c:/tmp/salida.txt’).

?- muestra([1, 2, [3, 4], 5, 6], -3).?- muestra([1, 2, [3, 4], 5, 6], -3).

?- told.?- told.

Este último predicado cierra el fichero y Este último predicado cierra el fichero y restablece la pantalla como canal de restablece la pantalla como canal de salida.salida.

Page 14: 5. Entrada y Salida en PROLOG

Escritura en fichero (III)Escritura en fichero (III)

Para averiguar el canal activo, se emplea el Para averiguar el canal activo, se emplea el predicado “predicado “telling(X)telling(X)”. Aquí X está por ”. Aquí X está por instanciar.instanciar.

?- telling(X).?- telling(X).X = user ;X = user ;NoNo

?- tell('d:/tmp/salida.prolog').?- tell('d:/tmp/salida.prolog').YesYes

?- telling(X).?- telling(X).X = '$stream'(112102) ;X = '$stream'(112102) ;NoNo

?- told.?- told.YesYes

Page 15: 5. Entrada y Salida en PROLOG

Escritura en fichero (IV)Escritura en fichero (IV)

Para volver a la pantalla como canal Para volver a la pantalla como canal activo, sin cerrar el fichero abierto activo, sin cerrar el fichero abierto previamente, se emplea: “tell(user)”.previamente, se emplea: “tell(user)”.

?- tell(‘c:/tmp/pp1.txt’), ?- tell(‘c:/tmp/pp1.txt’), muestra([1, 2, [3, 4], 5, 6], -3),muestra([1, 2, [3, 4], 5, 6], -3),tell(user), muestra([1, 2, [3, 4], 5, 6]),tell(user), muestra([1, 2, [3, 4], 5, 6]),tell(‘c:/tmp/pp2.txt’), tell(‘c:/tmp/pp2.txt’), muestra([7, [8, [9, [0]]]], 0),muestra([7, [8, [9, [0]]]], 0),told, muestra([7, [8, [9, [0]]]], 0), told.told, muestra([7, [8, [9, [0]]]], 0), told.

Ejercicio: insertar “telling” en esta Ejercicio: insertar “telling” en esta secuencia para averiguar el canal activo.secuencia para averiguar el canal activo.

Page 16: 5. Entrada y Salida en PROLOG

5. Lectura de ficheros (I)5. Lectura de ficheros (I)

Las mismas consideraciones, sólo que:Las mismas consideraciones, sólo que: El canal de entrada por defecto será el El canal de entrada por defecto será el

teclado (user).teclado (user).

El predicado “tell” se sustituye por “see”:El predicado “tell” se sustituye por “see”: ?- see(X).?- see(X). ?- seeing(X).?- seeing(X). ?- seen.?- seen.

Si la lectura se efectúa para ampliar la Si la lectura se efectúa para ampliar la base de conocimiento, se empleará base de conocimiento, se empleará “consult”.“consult”.

Page 17: 5. Entrada y Salida en PROLOG

Lectura de ficheros (II)Lectura de ficheros (II)

Ejemplo: construir una base de conocimiento fruto de la Ejemplo: construir una base de conocimiento fruto de la unión otras tres.unión otras tres.

?- consult(‘muestra').?- consult(‘muestra').% muestra compiled 0.00 sec, 40 bytes% muestra compiled 0.00 sec, 40 bytes

?- consult(‘campeones').?- consult(‘campeones').% campeones compiled 0.00 sec, 80 bytes% campeones compiled 0.00 sec, 80 bytes

?- consult(‘densidad').?- consult(‘densidad').% Densidad compiled 0.02 sec, 60 bytes% Densidad compiled 0.02 sec, 60 bytes

?- [‘muestra’, ‘campeones’, ‘densidad’].?- [‘muestra’, ‘campeones’, ‘densidad’].% muestra compiled 0.00 sec, 40 bytes% muestra compiled 0.00 sec, 40 bytes% campeones compiled 0.00 sec, 80 bytes% campeones compiled 0.00 sec, 80 bytes% Densidad compiled 0.02 sec, 60 bytes% Densidad compiled 0.02 sec, 60 bytes

Page 18: 5. Entrada y Salida en PROLOG

ENTRADAS y SALIDASENTRADAS y SALIDAS

UNIVERSIDAD DE VALLADOLID

Page 19: 5. Entrada y Salida en PROLOG

L/E de términos (II)L/E de términos (II)

pp([H|T], I) :- !, J is I+3, pp(H, J), ppx(T, J), nl.

pp(X, I) :- tab(I), write(X), nl.

ppx([], _).

ppx([H|T], I) :- pp(H, I), ppx(T, I).

?- pp([1,2,[3,4], 5, 6], 0).

1

2

3

4

5

6

Yes

I es un contador de columna

?- pp([1,2,[3,4], 5, 6], 7).

1

2

3

4

5

6

Yes

Page 20: 5. Entrada y Salida en PROLOG

Ejercicios: L/E de términosEjercicios: L/E de términos

Ejercicio 1:Ejercicio 1: Crear un predicado denominado espacios(X), Crear un predicado denominado espacios(X),

cuya función sea similar a tab(X) mediante el cuya función sea similar a tab(X) mediante el empleo de put(32) de manera recursiva.empleo de put(32) de manera recursiva.

Ejercicio 2:Ejercicio 2: Empleando una estrategia similar al ejercicio Empleando una estrategia similar al ejercicio

anterior, simular igualmente al predicado anterior, simular igualmente al predicado “write” mediante otro denominado “write” mediante otro denominado “escribecadena” utilizando el desglose de las “escribecadena” utilizando el desglose de las listas –cadenas de caracteres- (cabeza y listas –cadenas de caracteres- (cabeza y cola) y “put”.cola) y “put”.

Page 21: 5. Entrada y Salida en PROLOG

Escritura y lectura de caracteres Escritura y lectura de caracteres (IV)(IV)

Ejercicio 3:Ejercicio 3:?- leer(S).?- leer(S).

El ladron, que es muy habil con las manos, le birlo la El ladron, que es muy habil con las manos, le birlo la cartera a Juan.cartera a Juan.

S=[el, ladron, ‘,’, que, es, muy, habil, con, las, manos, S=[el, ladron, ‘,’, que, es, muy, habil, con, las, manos, ‘,’, le, birlo, la, cartera, a, juan]‘,’, le, birlo, la, cartera, a, juan]

Consideraciones:Consideraciones: Los espacios son separadores de palabras.Los espacios son separadores de palabras. , ; : ? ! . Son palabras por sí mismas, ; : ? ! . Son palabras por sí mismas . ! ? Son la última palabra de la frase. ! ? Son la última palabra de la frase