You are on page 1of 11

UPIICSA Unidad Profesional Interdisciplinaria de Ciencias Sociales y Administrativas

__________________________________________________
FUNDAMENTOS DE INTELIGENCIA ARTIFICIAL

FORMAS DE REPRESENTAR EL CONOCIMIENTO

SISTEMAS DE PRODUCCIN
LISTAS
Las listas son una herramienta importante en la matemtica moderna y en la
computacin simblica. Las listas son una estructura esencial en el leguaje
PROLOG. Una lista es una sucesin de elementos individuales que pueden estar
relacionados mutuamente en alguna forma. Ejemplos de lista son:
Lista
Letras del alfabeto
Grandes felinos
Constantes enteros y variables

Elementos de la lista
a, b, c, d, e
leon, tigre, puma, lince
f, r, 3, X, y, z

Estructura de las listas


Es necesario tener en cuenta el concepto de su divisin en dos partes: cabeza y
cola. La cabeza de la lista es el primer elemento de la misma. La cola es el resto de
la lista sin importar lo que pueda contener.
Su funcionamiento es el siguiente:
La lista len, tigre, lince, puma se divide en cabeza y cola
Cabeza= len
Cola= tigre, lince, puma
Es conveniente mencionar que las colas de la lista forma tambin una lista en s
misma. Si la cola de una lista solo tiene un elemento, tambin se considera como
una lista.
Si fuera necesario dividir una lista de un solo elemento ( ejemplo Juan) en cabeza y
cola podra hacerse en la siguiente forma:

CLASE_8_LISTAS.docx

M. en C. Lilia Gonzlez Arroyo

UPIICSA Unidad Profesional Interdisciplinaria de Ciencias Sociales y Administrativas


__________________________________________________
FUNDAMENTOS DE INTELIGENCIA ARTIFICIAL

Cabeza= Juan
Cola= lista vaca
Lgicamente, la lista vaca es algo parecido a los conceptos ms familiares de cero,
conjunto nulo y vacio.
Este es un concepto til y necesario para la utilizacin de las listas de los
programas Prolog.
A partir de los elementos anteriores es posible deducir que una lista sin elementos
no presenta problemas lgicos y que por ello es posible designarla simplemente
como la lista vaca.
Existen dos smbolos especiales que se utilizan:
1. El corchete abierto/cerrado.
Por ejemplo:
[a, b, c, d]
[len, tigre, lince, puma]
[X]
La lista vaca se representa por [].
2. El separador. Su smbolo es | y se usa para permitir que una lista se
represente como una cabeza y una cola. El elemento a la izquierda del
separador es la cabeza de la lista y el que est a la derecha, es la cola:
[H | T]

Para mostrar cmo puede accederse a las listas y sus contenidos en un programa
Prolog, la mejor forma es simular una sesin en una terminal.
Aqu se impondr que la base de conocimiento consiste exclusivamente de una sola
clausula en la cual el predicado letras considera, como nico argumento,
la lista [a, b, c, d]. Es posible representar la afirmacin de esta manera:
Letras ([a, b, c, d]).

CLASE_8_LISTAS.docx

M. en C. Lilia Gonzlez Arroyo

UPIICSA Unidad Profesional Interdisciplinaria de Ciencias Sociales y Administrativas


__________________________________________________
FUNDAMENTOS DE INTELIGENCIA ARTIFICIAL

Ahora se efectuarn algunas operaciones sencillas sobre la lista.


Prolog
Usuario
?-

letras (X).

X = [a, b, c, d]
?-

letras ([HT]).

H=a
T = [b, c, d]
?-

letras ([X, YT]).

X=a
Y=b
T = [c, d]
?-

letras ([H_]).

H=a
?-

letras ([_,HT]).

H=b
T = [c, d]

(fin de la sesin)

CLASE_8_LISTAS.docx

M. en C. Lilia Gonzlez Arroyo

UPIICSA Unidad Profesional Interdisciplinaria de Ciencias Sociales y Administrativas


__________________________________________________
FUNDAMENTOS DE INTELIGENCIA ARTIFICIAL

En Prolog, una lista es simplemente una coleccin de trminos. Los trminos


pueden ser cualquier tipo de datos Prolog, incluyendo las estructuras y otras listas.
Por ejemplo, una lista de cosas en la cocina se representa como:
[Manzana, brcoli, nevera]

Esto nos da una forma alternativa de representar la ubicacin de las cosas.


EJEMPLOS:
loc_list([manzana,elbrcoli,lasgalletas],cocina).
loc_list([escritorio,computadora],oficina).
loc_list([linterna,sobre],escritorio).
loc_list([sello,clave],sobre).
loc_list(['lavadora'],bodega).
loc_list ([nani], "lavadora").

CLASE_8_LISTAS.docx

M. en C. Lilia Gonzlez Arroyo

UPIICSA Unidad Profesional Interdisciplinaria de Ciencias Sociales y Administrativas


__________________________________________________
FUNDAMENTOS DE INTELIGENCIA ARTIFICIAL

Utilizando la lista vaca, se puede describir la falta de contenidos de un lugar o


cosa.
loc_list ([], vestbulo).
Con lo que sabemos ahora acerca de las listas se puede pedir:
?-loc_list(X,cocina).
X=[manzana,elbrcoli,lasgalletas]
?-[_,X,_]=[manzanas,elbrcoli,lasgalletas].
X = elbrcoli
He aqu algunos ejemplos ms:
? - [H | T] = [manzana, el brcoli, nevera].
H = manzana
T = [brcoli, nevera]
En los ejemplos anteriores y posteriores, la cola es una lista con un elemento.
? - [H | T] = [a, [b, c, d]].
H=a
T = [[b, c, d]]
En el siguiente caso, la cola es la lista vaca.
? - [H | T] = [manzana].
H = manzanas
T = []

La lista vaca no unifica con la sintaxis de la lista estndar, ya que no tiene cabeza.
? - [H | T] = [].
no

CLASE_8_LISTAS.docx

M. en C. Lilia Gonzlez Arroyo

UPIICSA Unidad Profesional Interdisciplinaria de Ciencias Sociales y Administrativas


__________________________________________________
FUNDAMENTOS DE INTELIGENCIA ARTIFICIAL

EJERCICIO
Una base del conocimiento contiene las siguientes clausulas:
CLAUSULAS
peces([tiburon,lucio,salmon,bacalao]).
pajaros([halcon,paloma,gorrion,canario]).
PREGUNTAS
pajaros([_|T]).
pajaros([H,H2|T]).
pajaros(Pajaros).
peces([tiburon,X,salomon,Y]).
pajaros(X,Y,Z).
RESULTADOS:
peces([H,T]).
no
?- peces([H|T]).
H = tiburon
T = [lucio, salmon, bacalao]
yes
?- pajaros([_|T]).
T = [paloma, gorrion, canario]
pajaros([H,H2|T]).
H = halcon
H2 = paloma
T = [gorrion, canario]
pajaros(Pajaros).
Pajaros = [halcon, paloma, gorrion, canario]
yes
?- peces([tiburon,X,salomon,Y]).
no
?- peces([tiburon, X,salomon, Y]).
no
?- pajaros(X,Y,Z).
no
?CLASE_8_LISTAS.docx

M. en C. Lilia Gonzlez Arroyo

UPIICSA Unidad Profesional Interdisciplinaria de Ciencias Sociales y Administrativas


__________________________________________________
FUNDAMENTOS DE INTELIGENCIA ARTIFICIAL

OPERACIONES CON LISTAS


La base para tener xito con estas tcnicas es la comprensin de la estructura de las
listas as como la aplicacin de la concurrencia.
Para empezar, se sabe que un elemento que represente la cabeza de una lista
debe ser una entrada en esa lista y es posible utilizar esta propiedad para escribir
una condicin a la frontera como:
Entry (E, L):-L = [E_]
Donde:
E: es una entrada en una lista L
L: esta compuesto por una cabeza E
_: variable en blanco para cualquier cola
En PROLOG la clusula se escribe de la siguiente manera:
entry (E, [E])
Se hace una necesaria segunda clusula recurrente que permita identificar las
dems entradas, se utiliza la propiedad de que cualquier entrada en la cola de la
lista tambin debe ser una entrada en la lista misma.
Entry (E, [_T]):-entry (E,T).
Con base en el par de clusulas que define el procedimiento:
Entry (E, [E_]).
Entry (E, [_T]):-entry (E, T)
USO DEL entry PARA DEFINIR OTRAS REGLAS UTILES
Reglas de entrada para definir la pertenencia a una categora especfica. Ejemplo:
Empleados (gerente, [gmez, snchez, prez]).
Empleados (administrativos, [villar, jimnez, chapa]).
Empleados (manuales, [gonzles, flores, salas]).
Primero se identifica a un individuo (ej. gerente), se establece la categora y
despus se busca en la lista seleccionada:
Gerente (G):-empleados (gerente, L).
Entry (G,L).
es posible definir empleado como:
Empleado (E):-empleados (_, L);
Entry (E, L).
CLASE_8_LISTAS.docx

M. en C. Lilia Gonzlez Arroyo

UPIICSA Unidad Profesional Interdisciplinaria de Ciencias Sociales y Administrativas


__________________________________________________
FUNDAMENTOS DE INTELIGENCIA ARTIFICIAL

CONJUNCION DE DOS LISTAS


Supngase que se desea conjuntar dos listas. Ej. Se requiere conjuntar las listas [a,
b, c] y [d, e, f] para formar la lista [a, b, c, d, e, f]. Un metodo seria el siguiente:
Concatenate ([], X, X).
Concatenate ([IX], Y [IZ]):-concatenate (X, Y, Z).
De esta forma la pregunta
?- concatenate ([a, b, c], [d, ,e, f], L).
Obtendra la respuesta
L = [a, ,b, c, d, e, f]
Procedimiento:
Se elimina concurrentemente la cabeza de la primera lista (a).
Continan debido a la definicin de la regla y terminan al efectuarse un
empate con la 1 clusula de la regla (concatnate ([], X, X).)
Cuando se lleva a cabo el empate se ha demostrado que la ultima cabeza a
eliminar de la 1 lista se vuelve cabeza del resultado.
A medida que terminan, las cabezas sucesivas de la primera lista se agregan
a la lista resultante L.
DETERMINACION DEL ENSIMO TRMINO DE UNA LISTA
Aqu se desea saber qu elemento de una lista est en la ensima posicin.
Ej. Se desea acceder al 3er elemento. Esto puede lograrse eliminando
recurrentemente N elementos de una lista. La variable E controla en nmero de
elementos que se han eliminado. Cuando R = 1, entonces X asigna al ensimo
elemento.
nth (X, 1, [X_]).
nth (X, N, [_I]):-R is N-1,
nth (X, R, L).
* Longitud de una lista
% Si queremos hallar la longitud de una lista.
% La longitud de una lista vacia es 0.
% La longitud de cualquier lista es la longitud de la cola + 1.
longitud([],0).
longitud([H|T],N):-longitud(T,N0), N is N0 + 1.
?- longitud([a,b,c],L).
CLASE_8_LISTAS.docx

M. en C. Lilia Gonzlez Arroyo

UPIICSA Unidad Profesional Interdisciplinaria de Ciencias Sociales y Administrativas


__________________________________________________
FUNDAMENTOS DE INTELIGENCIA ARTIFICIAL

L=3
?- longitud([a,b,c],4).
* Bsqueda de un elemento
% Si queremos determinar si un elemento pertenece a una lista.
% El elemento pertenece a la lista si coincide con la cabeza de la lista.
% El elemento pertenece a la lista si se encuentra en la cola de la lista.
pertenece(X,[X|_]) :- !.
pertenece(X,[_|R]):- pertenece(X,R).
?- pertenece(b,[a,b,c]).
Yes
?- pertenece(b,[a,[b,c]]).
No
?- pertenece([b,c],[a,[b,c]]).
Yes

* Eliminar elemento de una lista


% Si queremos eliminar un elemento de la lista.
% Si X es la cabeza de la lista, la cola T es la lista sin X
% Si X no es la cabeza de la lista, conservamos la cabeza de la lista
% como parte de la respuesta y continuamos eliminando X de la cola T.
elimina(X,[X|T],T).
elimina(X,[H|T],[H|T1]):- elimina(X,T,T1).
?- elimina(1,[1,2,3,4],R).
R = [2,3,4]
?- elimina(1,R,[2,3]).
R = [1, 2, 3]
R = [2, 1, 3]
R = [2, 3, 1]

CLASE_8_LISTAS.docx

M. en C. Lilia Gonzlez Arroyo

UPIICSA Unidad Profesional Interdisciplinaria de Ciencias Sociales y Administrativas


__________________________________________________
FUNDAMENTOS DE INTELIGENCIA ARTIFICIAL

* Concatenar listas
% Si queremos concatenar dos listas lista.
% Concatenar una lista vacia con L es L.
% Concatenar X|L1 con L2 es poner el primer
% elemento de la primera lista (X) ms la
% concatenacin del resto de la lista (L1) con L2
concatenar([],L,L).
concatenar([X|L1],L2,[X|L3]):-concatenar(L1,L2,L3).
?- concatenar([1,2],[3,4],R).
R = [1, 2, 3, 4].
* Comprobar si una lista es la inversa de otra
% Si queremos calcular la inversa de una lista.
% La inversa de una lista vaca es una lista vaca.
% La inversa de H|T es la inversa de T concatenada con H.
inversa([],[]).
inversa([H|T],L):- inversa(T,R), concatenar(R,[H],L).
?- inversa([a,b,c,d],[d,c,b,a]).
Yes
% Utilizando un parmetro acumulador.
inver(L1,L2):-inver(L1,L2,[]).
inver([],L,L).
inver([H|T],L,S):-inver(T,L,[H|S]).
?- inver([a,b,c,d],[d,c,b,a]).
Yes

Crea las siguientes operaciones para las listas:


APPEND: une una lista2 al final de lista1 dejando el resultado en salida
ULTIMO: indica el ltimo elemento de una lista en salida
PALINDROME: indica si una lista forma un palndrome o no
CLASE_8_LISTAS.docx

10

M. en C. Lilia Gonzlez Arroyo

UPIICSA Unidad Profesional Interdisciplinaria de Ciencias Sociales y Administrativas


__________________________________________________
FUNDAMENTOS DE INTELIGENCIA ARTIFICIAL

BIBLIOGRAFA.
INTELIGENCIA ARTIFICIAL, ELAINE RICH, MC GRAW HILL, 1991.
PROLOG. Programacin y Aplicaciones, D. BURNHAM, LIMUSA

CLASE_8_LISTAS.docx

11

M. en C. Lilia Gonzlez Arroyo

You might also like