Indice Lección 1 Lección 2 Lección 3 Lección 4 Lección 5

Guía de Ejercicios en Prolog

Lección 4 - Listas

Una de las estructuras de datos más importantes de Prolog son las listas:

[esta, es, una, lista]
[]
a = [a]
      

El último elemento de cualquier lista es la lista vacía [].

[a, b, c] = [a, b, c, []] 

Toda lista no vacía puede separarse entre cabeza y cola. Éstas pueden separarse con |:

[a| [b, c, d]] = [a, b, c, d]
[a| []] = [a]

1.- Trata de predecir la unificación que resulta en los siguientes ejemplos y confirma luego ejecutándo:

?- [X| Y] = [a, b, c, d].
?- [X, Y| Z] = [a, b, c].
?- [X, Y| Z] = [a, b, c, d].
?- [X, Y, Z| A] = [a, b, c].
?- [X, Y, Z| A] = [a, b].
?- [X, Y, a] = [Z, b, Z].
?- [X, Y| Z] = [a, W].

2.- Otra de los usos que se le da a las listas es el de record/estructura, al estilo de C:

['Bernardita', 'Arellano', 26, 'Abogada']
['Francisco', 'Pérez', 24, 'Pedagogo']
['Hugo', 'Fernández', 25, 'Vago']

Define un predicado edad(Estructura, Edad) que toma una de las estructuras anteriores y que instancia Edad con la edad.

3.- Para hacer uso total del poder de las listas, necesitas una estrategia para lidiar con sus elementos sin conocer previamente su posición. Para ésto debes acostumbrarte a trabajar con recursión.

Define el predicado miembro_de(Elemento, Lista) que es verdadero si Elemento está en Lista.

4.- Define el predicado append(L1, L2, L) que concatena las listas L1 y L2 y deja el resultado en L.

5.- Define el predicado reverse(L, LR) que es verdadero si LR es la lista L invertida.

6.- Los strings en Prolog consisten en listas de los códigos ASCII de los caracteres. Así:

"Hola" = [72, 111, 108, 97]

Define el predicado alreves(S, SR) que es verdadero si SR es el string S al revés.

Ahora, utiliza alreves/2 para definir el predicado escribe_alreves(S) que escribe el string S invertido en pantalla. Utiliza la función put(X) que escribe el caracter con código ASCII X en pantalla.

?- escribe_alreves("hola").
aloh

Nota: Para leer un caracter, puedes utilizar get(X).