Tipos de datos
Todos sabemos que los datos que maneja Prolog son los términos.
Sin embargo, podemos construir otros
tipos de datos a partir de estos. De hecho, algunos estan predefinidos
para mayor gloria del programador, son el caso de las listas y las cadenas de
caracteres.
En cualquier caso, el lector debe asumir que Prolog
no es un lenguaje tipado,
puesto que no existen declaraciones
explícitas de tipo tal y como ocurre en los lenguajes
imperativos. El hecho de que no existan dichas declaraciones se debe
sencillamente a que no hacen falta.
Registros
Los registros son agrupaciones ordenadas de datos que
en Prolog podemos escribir como términos que almacenan cada dato
en un argumento. Por ejemplo, supongamos que queremos un registro
para representar los datos personales de la gente:
persona('Eva','Fina','Y Segura',15)
persona('Fulanito','De Tal','Y Tal',32)
Mediante el término persona/4
representamos a un individuo.
El primer argumento es el nombre, el segundo y tercero son los
apellidos y el cuarto es la edad.
Puesto que los términos son anidables
podemos crear registros complejos:
persona('Menganito',edad(32),direccion('Leganitos',13,'Madrid'))
Árboles
Puesto que los términos pueden ser recursivos es fácil
crear estructuras de datos recurrentes. Como ejemplo, veamos como
definir árboles binarios.
Para ello representamos el árbol vacío mediante una constante,
por ejemplo, empty/0, y un nodo cualquiera puede
ser representado mediante el término tree/3. El
primer argumento representa un dato cualquiera asociado al nodo.
El segundo argumento representa la rama izquierda, y el tercer
argumento la correspondiente rama derecha. Son ejemplos de árboles:
empty
tree(dato1,empty,empty)
tree(dato1,tree(dato2,empty,empty),tree(dato3,empty,empty))
tree(dato4,empty,tree(dato5,tree(dato6,empty,empty),empty))
Listas
Las listas en Prolog podrian definirse del mismo modo que los árboles
puesto que los términos se pueden anidar todas las veces que sea
necesario. Por ejemplo, la lista de números del uno al cinco se
puede representar así:
lista(1,lista(2,lista(3,lista(4,lista(5,vacio)))))
Afortunadamente, las listas están predefinidas en el lenguaje
para una mayor comodidad. De modo que la lista anterior la podemos
escribir así:
[1, 2, 3, 4, 5]
Esta es la forma de escribir las listas definiendo todos los elementos,
pero podemos manipular las listas distinguiendo cabeza y resto:
[C|R].
Donde la variable C representa la cabeza, y R el
resto. Por ejemplo:
L = [1, 2, 3, 4, 5],
M = [0|L].
La lista M sería equivalente a [0,1,2,3,4,5]
. Es importante no confundir los términos
[C|R] y
[C,R].
La diferencia es muy sutil:
L = [1, 2, 3, 4, 5],
M = [0,L].
El resultado sería M = [0,[1,2,3,4,5]],
que es una lista de dos elementos.
Naturalmente, existe la lista vacía, que se representa como
[].
Además resulta conveniente tener en cuenta que:
- Existen bibliotecas para hacer cosas más complicadas con
las listas, como concatenar, aplanar, etc.
- Los elementos de las listas son términos y pueden ser
heterogéneos. Por ejemplo:
[1,p(a),[a,b],f(g(h))].
- Las listas también son términos, solamente las
escribimos de una manera más cómoda. Así,
la lista [1,a,2] es en realidad
el término
'.'(1,'.'(a,'.'(2,[]))).
Cadenas de caracteres
Las cadenas de caracteres son en Prolog
listas de códigos ASCII.
Afortunadamente se pueden escribir de una manera cómoda poniendo
los caracteres entre comillas dobles. Por ejemplo, la expresión
"ABC" es en realidad la lista
[65,66,67].
Así, podemos tratar las cadenas de caracteres como cadenas o
como listas según nos interese. Naturalmente, todo el
código que nos sirve para listas nos sirve para cadenas. Por
ejemplo, el predicado que concatena dos listas támbien sirve
para concatenar dos cadenas de texto (¿ no es genial ?).
Constantes
Como ya es sabido, las constantes en Prolog son términos
cero-arios (átomos).
A pesar de su simpleza, pueden ser muy útiles para
representar información ya que pueden contener cualquier
caracter. Se utilizan, por ejemplo, para representar nombres de
ficheros. Recuerde que las constantes numéricas también
son términos cero-arios (pero no son átomos).
Conversión entre números, átomos
y cadenas de caracteres
Existe cierta correspondencia entre estos elementos. Tanto los
números como los átomos se pueden convertir a cadena
de caracteres mediante los predicados
number_codes/2 y atom_codes/2
respectivamente.
Utilizando las cadenas de caracteres como elemento intermedio, es
posible convertir de átomos a números y viceversa:
atom_codes(Atomo,Aux),number_codes(Numero,Aux).
Observe que dichos predicados son reversibles.
© Copyright 2000-2001
Angel Fernández Pineda.