Las listas son estructuras de datos muy poderosas para almacenar y manipular conjunto de términos. Se trata de un par ordenado donde cada componente es un término, una lista o el término NIL (que es la lista vacía y se escribe []). La primer componente de la lista se llama cabeza de la lista y la segunda cola. Denotamos a lista de la siguiente manera:
<Lista> := [ <H> | <T> ] ó [].
Donde
<H>:= <término> ó <lista>
<T>:= <término> ó <lista>
Veamos algunos ejemplos:
[ 1 | [ 2 | [ 3 | [] ] ] ] es la lista cuya primera componente o cabeza es el termino constante 1 y la cola es la lista [ [ 2 | [ 3 | [] ] ] ].
Por abuso de notación, a la lista del ejemplo la denominamos [ 1, 2, 3 ].
Otros ejemplos:
[ 1, [a, b, [c]], 3, [pepe], [] ] es la lista cuya primera componente o cabeza es el termino constante 1 y la cola es la lista [[a, b, [c]], 3, [pepe], [] ]
[numero(1), letra(a), [numero(2),letra(b)]] es una lista cuya primera componente o cabeza es el término formado por la estructura o functor numero(1) y la cola es la lista [letra(a), [numero(2),letra(b)]].
¿Cómo es el proceso de unificación cuando se tienen listas? El proceso es básicamente similar a la unificación con términos. Veamos algunos ejemplos:
[X,Y] y [a,b] unifican con {X=a, Y=b}
[X,Y] y [[1,2,3],[4,5]] unifican con {X=[1,2,3], Y=[4,5]}
[X|Y] y [1,2,3] unifican con {X=1, Y=[2,3]}. En este ejemplo, cabe destacar que la lista [1,2,3] es equivalente a la lista [ 1 | [ 2 | [ 3 | [] ] ] ] donde la cabeza es 1, que unifica con X y la cola es la lista [[ 2 | [ 3 | [] ] ] ] ó lo que es lo mismo, la lista [2,3] que unifica con Y.
[X,Y] y [letra(a)|[letra(b)|letra(c)]]. Unifican con {X=letra(a), Y=[letra(b),letra(c)]}
[X|Y] y [] no unifican dado que la primera lista es una lista con al menos un elemento y la lista vacía no tiene elementos.
Tener en cuenta que [X,Y | Z] unifica con cualquier lista que tenga al menos dos elementos, es decir unifica, por ejemplo con [1,2] con la sustitución:{X=1, Y=2, Z=[] }
También unifica con la lista [1, 2, 3] con la sustitución {X=1, Y=2, Z=[3] }
Dando un ejemplo más realista, podríamos tener una base con las materias que cursa cada alumno, del siguiente modo:
cursa(juan, [matematicas, historia, computacion]).
cursa(ana, [matematicas, arte, historia]).
cursa(pedro, [geologia, logica, geografia]).
cursa(maria, [logica, arte, computacion]).
cursa(jose, [logica, historia, geografia]).
Más aún, podríamos decir que cada posición en la lista de materias, significa algo, como por ejemplo, que la primera posición corresponde a la primera hora, la segunda a la segunda hora y la tercera a la tercera hora, de modo que Juan, por ejemplo, cursa primero matemáticas, luego historia y en la tercera hora computación.