3.2 LISTAS EN PROLOG.
La lista es una estructura de datos simple,
muy usada en la programación no numérica.
Una lista es una secuencia de elementos
tales como:
clara,tomas,jose,isabel
La sintaxis de PROLOG para las listas
consiste en englobar las secuencias de
elementos entre corchetes.
[clara,tomas,jose,isabel]
LISTAS EN PROLOG.
La representación interna de las listas en
PROLOG es con árboles binarios, donde la
rama de la izquierda es el primer elemento –
o cabeza– de la lista y la rama de la derecha
es el resto –o cola– de la lista. De la rama
que contiene el resto de la lista también se
distinguen dos ramas: la cabeza y la cola. Y
así sucesivamente hasta que la rama de la
derecha contenga la lista vacía
(representado por [])
LISTAS EN PROLOG.
De cualquier forma
consideraremos dos casos de
listas:
Las listas vacías. Escribiremos
la lista vacía como un átomo
de PROLOG, [].
Listas no vacías. La lista la
consideraremos formada por
dos partes; el primer
Ejemplo 3.1 elemento, al que llamaremos
la cabeza de la lista; y el resto
de la lista al que
llamaremos la cola de la lista.
En el ejemplo anterior, la
cabeza será clara y la cola
[tomas,jose,isabel].
EJEMPLO 3.2
[ana, [maria, juan], agustin]
PROLOG representará internamente como un
árbol:
EJEMPLO 3.3
La cabeza y la cola de una lista se pueden
separar con el símbolo “|”.
Las siguientes son expresiones válidas sobre
listas y se refieren a la misma lista:
[a,b,c] [a|[b,c]] [a,b|[c]] [a,b,c|[]] [a|X],[Y|
[b,c]]
El orden de los elementos en la lista importa
y un elemento se puede repetir en una lista,
de forma similar a como ocurre en las tuplas
y pares ordenados.
EJEMPLO 3.4
Determinar si un elemento es miembro de
una lista.
Los siguientes serían ejemplos del
funcionamiento de la relación “miembro”.
miembro(b,[a,b,c]). %PROLOG respondería sí.
miembro(b,[a,[b,c]]). %PROLOG respondería no.
miembro([b,c],[a,[b,c]]). %PROLOG respondería sí.
El símbolo “%” permite poner comentarios
que ocupen sólo la línea donde aparece
dicho símbolo.
Para comentarios más largos se puede
utilizar los símbolos “/*” para empezar y “*/”
para terminar.
EJEMPLO 3.4
La siguiente podría ser una definición de la
relación “miembro”:
miembro(X,[X|_]).
miembro(X,[_|R]):-miembro(X,R).
EJEMPLO 3.5
Concatenar dos listas y devolver el resultado
en una tercera lista, es decir:
concatenar([a,b,c],[d,e],[a,b,c,d,e]). %
PROLOG respondería que sí.
concatenar([a,b],[1,2,3],X). % PROLOG
respondería X=[a,b,1,2,3].
Solución
concatenar ([],L,L).
concatenar ([X|L1],L2,[X|L3]):-
concatenar (L1,L2,L3).
EJERCICIO 3.1
Utilizar la definición de concatenación para:
a) Descomponer una lista en dos, obteniendo todas las
posibles descomposiciones.
b) Borrar algunos elementos de una lista.
Por ejemplo: considera la lista L1=[a,b,c,d,z,z,e,z,z,z,f,g] y
borra todos los elementos que siguen a la secuencia z,z,z.
c) Borrar los tres últimos elementos de una lista.
d) Definir de nuevo la operación miembro.
e) Definir la relación para extraer el último elemento de la
lista
e.1) Utilizando la definición de concatenación.
e.2) Sin utilizarla.
EJERCICIOS 3.2, 3.3 Y 3.4
Borrar un elemento de una lista.
Añadir un elemento en una lista.
Comprobar si dos elementos son
consecutivos en una lista.
EJEMPLO 3.6
Calcular la inversa de una lista.
Ejemplo de utilización:
Inversa([a,b,c,d],[d,c,b,a]). %PROLOG
devolvería sí.
Solución 1:
inversa([],[]).
inversa([X|L1],L):- inversa(L1,Resto),
concatenar(Resto,[X],L).
EJEMPLO 3.6
Solución 2:
inversa(L1,L):- inversa (L1,[],L).
inversa([],L,L).
inversa([X|L1],L2,L3):- inversa(L1,[X|L2],L3).
/* Para las dos últimas reglas es indistinto el
orden, porque sólo una de las dos será cierta
cada vez */
EJERCICIOS 3.2.1
Resuelva los ejercicios planteados en la
plataforma.
3.3 CONSTRUCCIÓN DE EXPRESIONES
ARITMÉTICAS EN PROLOG
abs(X) /*valor absoluto de X*/
acos(X) /*arco coseno de X*/
asen(X) /*arco seno de X*/
atan(X) /*arco tangente de X*/
cos(X) /*coseno de X*/
exp(X) /*exponencial de X; [eX]*/
ln(X) /*logaritmo neperiano de X*/
log(X) /*logaritmo en base 2 de X*/
sin(X) /*seno de X*/
sqrt(X) /*raíz cuadrada de X*/
tan(X) /*tangente de X*/
round(X,N) % redondeo del real X con N
% decimales
3.4 COMPARACIÓN DE TÉRMINOS EN
PROLOG.
Los siguientes operadores son los que
permiten comparar término:
X<Y /* X es menor que Y */
X>Y /* X es mayor que Y */
X=<Y /* X es menos o igual que Y */
X>=Y /* X es mayor o igual que Y */
X=Y /* X es igual que Y */
X=\=Y /* X no es igual que Y */ (Strawberry
Prolog).
3.5 COMPARACIÓN DE EXPRESIONES
EN PROLOG.
Una expresión es un conjunto de téminos unidos por operadores
aritméticos. Los siguientes predicados predefinidos comparan
expresiones sin evaluarlas, mediante una comparación sintáctica
siguiendo el orden a continuación:
- variables,
- enteros y reales,
- átomos en orden alfabético,
- términos complejos: aridad, nombre y orden según la
definición recursiva.
X==Y /*la expresión X es igual que la expresión Y*/
X=\=Y /*la expresión X es distinta que la expresión Y*/
X<Y /*la expresión X es menor que la expresión Y*/
X>Y /*la expresión X es mayor que la expresión Y*/
X=<Y /*la expresión X es menor o igual que la expresión Y*/
X>=Y /*la expresión X es mayor o igual que la expresión Y*/
EJEMPLO 3.7
El siguiente operador permite evaluar
expresiones:
X is Y
X is (3*5+3)/2 % PROLOG contestaría X=9
esa asignación sólo podrá ser satisfecha si la
variable que aparece a la izquierda del “is”
no está instanciada, en caso contrario la
operación fallará.
Es decir, en PROLOG no se puede cambiar el
valor de una variable sin desistanciarla
mediante backtracking.
EJEMPLO 3.7
Los siguientes predicados predefinidos
comparan términos haciendo una evaluación
de expresiones:
X=:=Y
/* El resultado de evaluar la expresión X es
igual al resultado de evaluar la expresión Y*/
X=\=Y
/* El resultado de evaluar la expresión X es
distinto al resultado de evaluar la expresión Y*/
EJEMPLO 3.8
Escribir un predicado PROLOG para
determinar la longitud de una lista.
Ejemplo: ?-longitud([a,b,c,d,e],5).
Solución:
longitud([],0).
longitud([_|Resto],N):- longitud(Resto,N1),
N is N1+1.
EJERCICIOS 3.2.2
Resuelva los ejercicios planteados en la
plataforma.