0% encontró este documento útil (0 votos)
187 vistas20 páginas

3.2 Listas - Prolog

Este documento describe las listas en Prolog. Explica que una lista es una secuencia de elementos entre corchetes y que internamente Prolog representa las listas como árboles binarios. También cubre temas como listas vacías, la cabeza y cola de una lista, operaciones como concatenar y miembro de una lista, y ejemplos de definiciones y uso de predicados sobre listas.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
187 vistas20 páginas

3.2 Listas - Prolog

Este documento describe las listas en Prolog. Explica que una lista es una secuencia de elementos entre corchetes y que internamente Prolog representa las listas como árboles binarios. También cubre temas como listas vacías, la cabeza y cola de una lista, operaciones como concatenar y miembro de una lista, y ejemplos de definiciones y uso de predicados sobre listas.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

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.

También podría gustarte