Curso intermedio de programación en Prolog

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.

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
SIGUIENTE ARTÍCULO