Sie sind auf Seite 1von 36

1

MANUAL DE
PRCTICAS LIBRES DE
PROGRAMACIN LGICA [IA]
Universidad del Valle de Mxico
Campus Tlalpan, Departamento de Tecnociencias
Introduccin a la Inteligencia Artificial
Prof. L.I. Raymundo Lumbreras Lpez

2
1. Prlogo ___________________________________________________________4
2. I ntroduccin a Prolog _______________________________________________5
2.1 Introduccin informal _____________________________________________ 5
2.1.1 Preliminares ___________________________________________________________5
2.1.2 Programacin recursiva __________________________________________________7
2.1.3 Estructuras de datos_____________________________________________________8
2.2 Introduccin formal_______________________________________________9
2.2.1 Clusulas de Horn ______________________________________________________9
2.2.2 Hechos ______________________________________________________________9
2.2.3 Consultas_____________________________________________________________9
2.2.4 Trminos _____________________________________________________________9
2.2.5 Convenios sintcticos ___________________________________________________9
2.2.6 Unificacin___________________________________________________________10
2.2.7 Modelo de cmputo ____________________________________________________10
3. SWI -Prolog_______________________________________________________12
3.1 Introduccin ___________________________________________________12
3.2 Instalacin_____________________________________________________12
3.2.1 Pasos a seguir en la instalacin____________________________________________12
3.2.2 Editor_______________________________________________________________13
3.3 Trabajo con SWI-Prolog __________________________________________14
3.3.1 Preliminares __________________________________________________________14
3.3.2 Directorio de trabajo ____________________________________________________14
3.3.3 rdenes del sistema operativo ____________________________________________14
3.3.4 Prueba del ejemplo del apartado 2.1.1 _______________________________________14
3.3.5 Depuracin y traza de programas __________________________________________16
3.3.6 Ayuda interactiva______________________________________________________19
3.3.7 Historial_____________________________________________________________19
3.3.8 Interaccin con Windows________________________________________________19
3.4 Referencia de algunos predicados predefinidos________________________19
3.4.1 Control______________________________________________________________19
3.4.2 Manejo de la base de datos ______________________________________________20
3.4.3 Entrada/Salida ________________________________________________________20
3.4.4 Aritmtica ___________________________________________________________20
3.5 Operadores aritmticos __________________________________________20
3.6 Operadores lgicos ______________________________________________21
4. Sicstus Prolog_____________________________________________________22
4.1 Introduccin ___________________________________________________22
4.2 Instalacin_____________________________________________________22
4.2.1 Pasos a seguir en la instalacin____________________________________________22
Editor________________________________________________________________________23
4.3 Trabajo con Sicstus Prolog ________________________________________23
4.3.1 Dominios ____________________________________________________________23
4.3.2 Ejemplo de trabajo _____________________________________________________23
5. Sugerencias y avisos________________________________________________26
5.1 Estilo _________________________________________________________26

Introduccin a la Inteligencia Artificial
Prof. L.I. Raymundo Lumbreras Lpez


Universidad del Valle de Mxico
Campus Tlalpan, Departamento de Tecnociencias
3
5.2 Precauciones ___________________________________________________27
5.3 Elegancia______________________________________________________27
5.4 Errores conocidos _______________________________________________27
5.5 Documentacin a entregar con las prcticas __________________________27
6. Prcticas propuestas________________________________________________29
6.1 rbol genealgico_______________________________________________29
6.2 Expresiones aritmticas __________________________________________30
6.3 Intrprete Prolog _______________________________________________31
6.4 Traductor______________________________________________________31
7. Bibliografa_______________________________________________________33
8. Agradecimientos___________________________________________________34
9. ndice____________________________________________________________35
Introduccin a la Inteligencia Artificial
Prof. L.I. Raymundo Lumbreras Lpez

Universidad del Valle de Mxico
Campus Tlalpan, Departamento de Tecnociencias
4
1. Prlogo
La realizacin de estas prcticas libres es un apoyo de gran utilidad para el aprendizaje de la asignatura
Programacin Lgica. Por lo tanto, no es de obligada lectura, consulta o realizacin de las prcticas,
aunque son, todas, tareas recomendables.
Este manual est organizado en varios apartados que ofrecen todos los pasos necesarios para realizar las
prcticas propuestas. En el apartado 2 se realiza una introduccin al lenguaje Prolog desde los puntos de
vista formal e informal. Con l se pretende que se conozcan los mecanismos bsicos de Prolog a usar en el
desarrollo de las prcticas que se irn complementando con los explicados en las clases de teora. Por lo
tanto, no es un manual autocontenido. Complementariamente, en el apartado 7 se lista la bibliografa que
se ha usado para la elaboracin de este manual y de la asignatura en s, y que se puede consultar para
obtener toda la informacin necesaria para estas prcticas y temas avanzados. En el apartado 3 se
introducen los fundamentos de SWI-Prolog, una implementacin de distribucin libre que se puede usar
en el curso, necesarios para la realizacin de las prcticas que se proponen en el apartado 6.
Alternativamente se puede usar la implementacin de Sicstus Prolog, que se describe en el apartado 4, que
aporta sobre el sistema anterior la inclusin de bibliotecas de restricciones, que se introducirn al final del
curso y que se tratan en profundidad en la asignatura optativa "Programacin declarativa avanzada". El
inconveniente de este sistema es que necesita licencia para su uso, restringindose su uso a la comunidad
universitaria.
Introduccin a la Inteligencia Artificial
Prof. L.I. Raymundo Lumbreras Lpez

Universidad del Valle de Mxico
Campus Tlalpan, Departamento de Tecnociencias
5
2. Introduccin a Prolog
2.1 Introduccin informal
En este apartado se introduce informalmente el lenguaje de programacin Prolog, siguiendo un ejemplo
que se puede encontrar en Giannesini et al. (Vase la bibliografa).
2.1.1 Preliminares
Prolog es un lenguaje de programacin diseado para representar y hacer uso del conocimiento sobre un
dominio particular. Este dominio es un conjunto de objetos. El conocimiento se formaliza por medio de un
conjunto de relaciones que describen de forma simultnea las propiedades de los objetos y sus
interacciones.
Por ejemplo, se puede expresar el men de un restaurante como se enuncia a continuacin:
Dominio: Los platos que se sirven en el restaurante.
Relaciones: Inicialmente, las que clasifican los platos concretos, que son las siguientes:
entrada(ensalada).
entrada(sopa).
carne(ternera).
carne(cordero).
pescado(merluza).
pescado(mero).
postre(fruta).
postre(flan).
Esta declaracin de objetos y su clasificacin se ha realizado mediante reglas denominadas afirmaciones o
hechos y constituye un programa Prolog elemental. La entrada/salida (E/S) a un programa Prolog se realiza
mediante una pregunta. La forma ms elemental de E/S consiste en:
Entrada: Formulacin de una pregunta para comprobar si un hecho est declarado en el programa. Por
ejemplo:
? carne(ternera).
Salida: Respuesta afirmativa o negativa por parte del sistema. Para el ejemplo anterior:
S (normalmente en ingls, Yes, o simplemente Y).
En las preguntas se pueden utilizar variables. En este caso, el sistema responde con todos los valores de
las variables que hacen cierta la pregunta, o bien con la respuesta No si la pregunta no se satisface para
ningn valor de las variables. Por ejemplo:
entrada por el usuario: ? pescado(X).
salida del sistema: X={merluza,mero}
A partir de las relaciones que constituyen la base de hechos (o datos) inicial se pueden definir relaciones
ms complejas y generales. Por ejemplo, se puede definir la siguiente relacin:
plato_principal(X) :- carne(X).
plato_principal(X) :- pescado(X).
Esta relacin, que consta de dos clusulas, define lo que se entiende por plato principal y que se puede
leer de la siguiente forma:
X es un plato principal si X es carne.
X es un plato principal si X es pescado.
Las clusulas o reglas anteriores se componen de cabeza (a la izquierda de :-) y cuerpo (a la derecha de
:-). Declaran que es cierto lo que expresa la cabeza si es cierto lo manifestado por el cuerpo. Las
variables slo tienen alcance dentro de la clusula y hacen referencia a todos los objetos del dominio
(cuantificacin universal). Con la incorporacin de las dos reglas anteriores, se puede formular la siguiente
pregunta:
Introduccin a la Inteligencia Artificial
Prof. L.I. Raymundo Lumbreras Lpez

Universidad del Valle de Mxico
Campus Tlalpan, Departamento de Tecnociencias
6
? plato_principal(ternera).
cuya respuesta sera S.
La respuesta a:
? plato_principal(X).
sera: X = {ternera;cordero;merluza;mero}
Se pueden incorporar al programa nuevos conocimientos en forma de reglas sobre el dominio en cuestin.
Por ejemplo, la comida se compone tradicionalmente de una entrada, un plato principal (carne o pescado) y
un postre. Esto se puede representar con la siguiente regla:
comida(A,B,C) :- entrada(A),plato_principal(B),postre(C).
la cual se puede interpretar como: el triplete (A,B,C) es una comida si A es una entrada, B es un plato
principal y C es un postre.
Una vez incorporada la regla anterior al programa, la respuesta del sistema a la pregunta:
? comida(X,Y,Z).
que expresa el conjunto de todas las diferentes comidas que puede servir el establecimiento, sera:
{X=ensalada,Y=ternera,Z=fruta;
X=ensalada,Y=ternera,Z=flan;
X=ensalada,Y=cordero,Z=fruta;
X=ensalada,Y=cordera,Z=flan;
X=ensalada,Y=merluza,Z=fruta; ... }
Para precisar ms la pregunta se pueden incorporar ms condiciones en forma conjuntiva como, por
ejemplo:
? comida(X,Y,Z),pescado(Y).
que corresponde a la solicitud al sistema de todas las comidas diferentes que tienen pescado de segundo
plato.
Se puede ahora incorporar el conocimiento que se tiene acerca del valor calrico de los diferentes platos:
calorias(ensalada,30).
calorias(sopa,60).
calorias(ternera,200).
calorias(cordero,250).
calorias(merluza,100).
calorias(mero,150).
calorias(fruta,50).
calorias(flan,80).
La regla calorias(ensalada,30) establece que un plato de ensalada tiene 30 caloras
1
. A la
pregunta:
? calorias(X,100).
el sistema responde con todos los platos de 100 caloras:
X = {merluza}
Se puede definir el valor calrico V de una comida compuesta de una entrada E, el plato principal PP y el
postre P mediante la siguiente regla:
valor_calorico(E,PP,P,V) :-
comida(E,PP,P),
calorias(E,X),calorias(PP,Y),calorias(P,Z),
V is X+Y+Z.
En esta regla, V is X+Y+Z corresponde a la expresin en Prolog de la operacin de suma incorporada en
el sistema (is es la regla predefinida para evaluar expresiones aritmticas. En este caso hay que hacer
notar que acta como un operador infijo, al contrario del carcter prefijo de las reglas).
Basndose en el valor calrico, se pueden establecer diferentes tipos de men. Por ejemplo, un men
equilibrado es aqul que no sobrepasa las 200 caloras:
menu_equilibrado(X,Y,Z) :-
valor_calorico(X,Y,Z,V), V =< 200.
El programa completo estara, pues, compuesto de las siguientes reglas:

1
Ntese que no se escriben acentos en los programas. Esto es una limitacin de algunas implementaciones
de Prolog que, como es habitual, estn pensadas para el ingls y no para el resto de los idiomas. Quizs
esto cambie algn da.
Introduccin a la Inteligencia Artificial
Prof. L.I. Raymundo Lumbreras Lpez

Universidad del Valle de Mxico
Campus Tlalpan, Departamento de Tecnociencias
7
/* PROGRAMA COMPLETO */
entrada(ensalada).
entrada(sopa).
carne(ternera).
carne(cordero).
pescado(merluza).
pescado(mero).
postre(fruta).
postre(flan).
plato_principal(X) :- carne(X).
plato_principal(X) :- pescado(X).
comida(A,B,C) :- entrada(A),plato_principal(B),postre(C).
calorias(ensalada,30).
calorias(sopa,60).
calorias(ternera,200).
calorias(cordero,250).
calorias(merluza,100).
calorias(mero,150).
calorias(fruta,50).
calorias(flan,80).
valor_calorico(E,PP,P,V) :-
comida(E,PP,P),
calorias(E,X),calorias(PP,Y),calorias(P,Z),
V is X+Y+Z.
menu_equilibrado(X,Y,Z) :-
valor_calorico(X,Y,Z,V), V =< 200.
/* FIN DEL PROGRAMA */
E/S
? menu_equilibrado(X,Y,Z).
{X =ensalada,Y=merluza,Z=fruta}
Yes
2.1.2 Programacin recursiva
Con el programa del ejemplo anterior se realiza una bsqueda exhaustiva de soluciones probando de
manera ordenada cada una de las reglas del programa. Este mecanismo de bsqueda est implementado en
el sistema y es transparente al usuario. No obstante, se pueden programar bsquedas ms elaboradas
usando uno de los recursos ms importantes de la programacin lgica: la recursividad. Por ejemplo, se
puede definir el antepasado de una persona con la siguiente relacin:
antepasado(X,Y) :- progenitor(X,Y).
antepasado(X,Z) :- progenitor(X,Y),antepasado(Y,Z).
Con ella se representa el siguiente conocimiento: X es antepasado de Y si X es progenitor de Y, o bien, X
es antepasado de Z si X es progenitor de Y e Y es antepasado de Z. Con esta ltima afirmacin se liga la
cadena de progenitores hasta alcanzar el elemento Z que la cumpla (si existe).
Introduccin a la Inteligencia Artificial
Prof. L.I. Raymundo Lumbreras Lpez

Universidad del Valle de Mxico
Campus Tlalpan, Departamento de Tecnociencias
8
2.1.3 Estructuras de datos
2.1.3.1 Trminos estructurados
Los objetos de datos que se han utilizado hasta el momento en las reglas han sido objetos simples de tipo
constante (los nmeros y los tomos, que son el nombre de los objetos del programa Prolog) y variable
(objetos que se escriben empezando en mayscula). Sin embargo, Prolog permite adems el uso de objetos
estructurados (o simplemente estructuras) en las reglas. Las estructuras tienen diferentes componentes
combinadas mediante un funtor. Por ejemplo, la fecha se puede representar por medio de la siguiente
estructura:
fecha(24,abril,2003).
Los argumentos de las estructuras pueden ser a su vez estructuras. Por ejemplo, se puede definir el
siguiente trmino:
libro(el_quijote,123,fecha(2,enero,1995))
para representar el objeto libro cuyo ttulo es el_quijote, con nmero o signatura 123 y adquirido el 2 de
enero de 1995.
En general, el funtor de una estructura precede a los argumentos de la misma, que se encierran entre
parntesis. Sin embargo, Prolog permite utilizar otros operadores de forma infija y prefija. La razn de esta
posibilidad reside en facilitar la lectura de ciertos funtores de acuerdo con su empleo tradicional. Por
ejemplo, si se utiliza el operador de la suma como funtor de una estructura que representa la suma de dos
expresiones, en la forma estndar de Prolog se tiene:
+(A,B)
En cambio, en la forma tradicional infija se tiene:
A+B
Si bien conviene insistir en que se trata tan solo de un asunto de cosmtica sintctica que slo afecta a la
forma en que se presenta la estructura en la E/S.
A menudo se hace referencia a los trminos por su funtor, que est caracterizado por un nombre y su
aridad, como, por ejemplo, fecha/3.
2.1.3.2 Listas
Un tipo especial de funtor de dos argumentos se utiliza en Prolog para representar las listas (secuencia
ordinaria de objetos). As:
.(Cabeza,Cola)
representa una lista cuyo primer elemento es Cabeza y los restantes elementos se encuentran en la lista
Cola. Para hacer explcito el segundo elemento de la lista se aplica el funtor . a la lista Cola:
.(Cabeza, .(Cabeza2,Cola))
Para hacer explcitos todos los elementos de una lista y mantener los dos argumentos del funtor . se
necesita un smbolo que represente la lista vaca. Para ello se usa [] . As, la estructura:
.(a, .(b, .(c, [])))
representa a la lista [a,b,c].
Debido a su frecuente uso, Prolog permite representar listas en la forma habitual entre corchetes y
separando sus elementos por comas. Tambin admite otra forma:
[Cabeza|Cola]
que es equivalente a
.(Cabeza,Cola)
Tambin se permite hacer explcito ms de un elemento de la cabeza:
[a,b,c|Cola]
Argumentos
Funtor
Introduccin a la Inteligencia Artificial
Prof. L.I. Raymundo Lumbreras Lpez

Universidad del Valle de Mxico
Campus Tlalpan, Departamento de Tecnociencias
9
2.2 Introduccin formal
En este apartado se introduce formal y brevemente el lenguaje de programacin Prolog, recalcando
algunos conceptos vistos en el apartado anterior. No obstante, este apartado es un breve resumen muy
podado de lo que se puede encontrar en Lloyd.
2.2.1 Clusulas de Horn
Desde un punto de vista lgico, un programa Prolog est constituido por un conjunto de clusulas de
Horn. Una clusula de Horn tiene la forma general:
p(t
1
,t
2
,...,t
n
) :- p
1
(t
11
,...,t
1n1
),...,p
m
(t
m1
,...,t
mnm
).
donde m,n 0 y p, p
1
, ..., p
m
son smbolos de predicados (relaciones lgicas) con sus argumentos entre
parntesis. A los argumentos de los predicados se les denomina trminos.
Las clusulas de Horn son expresiones condicionales, siendo el smbolo :- el condicional o implicacin
lgica (normalmente se utiliza el smbolo ). As, la clusula anterior se puede leer de la siguiente forma:
Si p
1
(t
11
,...,t
1n1
) y ... y p
m
(t
m1
,...,t
mnm
) entonces p(t
1
,t
2
,...,t
n
).
O bien:
Es cierto p(t
1
,t
2
,...,t
n
) si es cierto p
1
(t
11
,...,t
1n1
) y ... y es cierto p
m
(t
m1
,...,t
mnm
)
2.2.2 Hechos
Cuando m=0, la clusula no tiene parte derecha (denominada tambin cuerpo):
p(t
1
,t
2
,...,t
n
).
y se denomina una afirmacin o hecho.
2.2.3 Consultas
Cuando la clusula no tiene parte izquierda (denominada tambin cabeza), se tiene una clusula negativa o
consulta:
? p
1
(t
11
,...,t
1n1
),...,p
m
(t
m1
,...,t
mnm
).
que son las clusulas con las que se realiza la entrada/salida del programa.
2.2.4 Trminos
Un trmino t
i
puede ser:
Una constante (un nmero o un tomo).
Una variable.
Una estructura f(s
1
,s
2
,...,s
n
) (o trmino estructurado), donde f es el funtor de la estructura, que tiene
aridad (nmero de argumentos) n y sus argumentos s
i
son, a su vez, trminos.
2.2.5 Convenios sintcticos
Los smbolos o identificadores de tomos, funtores y predicados comienzan por una letra minscula, los
smbolos de variables comienzan con una letra mayscula. No obstante, las variables tambin pueden
empezar por un subrayado (_), en cuyo caso se denominan annimas. Por ejemplo: _X o _x. Asimismo, los
tomos tambin pueden empezar en mayscula si se encierran entre comillas simples. Por ejemplo:
Segovia.
Cuando los identificadores estn formados por ms de una palabra se actuar de la siguiente manera:
Para variables, cada palabra comenzar en maysculas.
Ej: VariableMuda
Para el resto, las palabras del identificador se separan con smbolos de subrayado.
Ej: conflicto_de_planificacin
Se pueden aadir comentarios a los programas de dos formas:
Un comentario en una lnea va precedido por el carcter %.
Ej: % Esto es un comentario en una lnea
Un comentario que ocupe una o ms lneas se encierra entre los smbolos de inicio y fin /* y */,
respectivamente.
Ej: /* Esto es un comentario en varias
lneas */
Introduccin a la Inteligencia Artificial
Prof. L.I. Raymundo Lumbreras Lpez

Universidad del Valle de Mxico
Campus Tlalpan, Departamento de Tecnociencias
10
Nota: dependiendo de las implementaciones se pueden admitir smbolos de inicio y fin anidados.
2.2.6 Unificacin
La unificacin es una de las operaciones ms importantes de Prolog. Es la generalizacin del encaje de
patrones de la programacin funcional con la integracin de variables lgicas. El encaje de patrones
consiste en la igualdad sintctica de dos objetos. Una variable encaja con cualquier objeto, sin embargo,
una constante slo puede encajar con una constante igual u otra variable. Un trmino estructurado encaja
con cualquier variable o con un trmino estructurado que posea el mismo funtor y aridad, y adems se
debe cumplir que encajen sus argumentos (definicin inductiva).
Por ejemplo, la siguiente tabla muestra el resultado del encaje de dos argumentos:
Primer argumento Segundo argumento Resultado
X a xito, con X=a
a b Fallo
X f(a) xito, con X=f(a)
f(a) f(a) xito
f(a) s(a) Fallo
f(a) f(b) Fallo
La unificacin es, pues, la generalizacin de este concepto. Por una parte, permite que una variable se
pueda instanciar (o, lo que es igual, asignar una sola vez) a un valor y slo a uno (esto es lo equivalente a
la operacin de asignacin que se realiza en el encaje de patrones). Por otra parte, y gracias a la
bidireccionalidad de cmputo (se explica en el prximo apartado), es posible instanciarla a otros valores
en una rama diferente del rbol de bsqueda. Es importante insistir en que, al contrario de la programacin
imperativa, una variable lgica se instancia con xito a un nico valor cuando se obtiene una solucin. Por
supuesto, si se buscan otras soluciones, la variable puede tomar otros valores de su dominio. Pero esto
corresponde a una solucin diferente.
El resultado de una unificacin en forma de asignaciones de variables a valores se denomina sustitucin.
Una sustitucin es un conjunto de pares X=V, que expresa que la variable X se ha asignado al valor V.
2.2.7 Modelo de cmputo
Un cmputo Prolog consiste en un proceso de resolucin lineal (debido a Robinson) con unificacin
aplicado a una clusula negativa o consulta y al conjunto de clusulas que componen el programa. As, la
consulta:
? p(a,X).
tendra las dos posibles lecturas siguientes:
Para qu valores de la variable X resulta cierto p(a,X)?
Para qu valores de la variable X se deduce p(a,X) del conjunto de relaciones que componen las
clusulas del programa?
Segn el principio de resolucin, para resolver el objetivo p(a,X)se intenta unificar con la parte izquierda
de alguna clusula cuya cabeza sea el mismo predicado p. Si la unificacin es posible (a causa de los
argumentos de la cabeza y del objetivo), se sustituye el objetivo original por la parte derecha de la clusula
utilizada en la unificacin (con las sustituciones de variables que la unificacin implica). El proceso
contina hasta que se obtiene la clusula vaca (no hay ms objetivos a resolver).
Si se considera el siguiente programa (donde se numeran las clusulas):
1. p(a,f(T,b)) :- q(Y,c,a), r(f(T,b),b).
2. p(a,a).
3. q(c,c,a).
4. q(a,b,c) :- r(s(a,b),d).
5. r(f(b,b),b).
y con el objetivo anterior p(a,X), se desencadena el siguiente proceso:
? p(a,X). Resolviendo con 1, con la sustitucin X = f(T,b)
? q(Y,c,a), r(f(T,b),b). Resolviendo con 3, con la sustitucin Y = c
? r(f(T,b),b) Resolviendo con 5, con la sustitucin T = b
Introduccin a la Inteligencia Artificial
Prof. L.I. Raymundo Lumbreras Lpez

Universidad del Valle de Mxico
Campus Tlalpan, Departamento de Tecnociencias
11
? Clusula vaca, es decir, xito en el cmputo.
Por lo tanto, p(X,a) es cierto para la sustitucin X=f(b,b), que es el resultado (salida) del cmputo
que realiza Prolog.
El orden de utilizacin de las clusulas para resolver un objetivo es el determinado por su aparicin en el
programa. Cuando el objetivo se compone de varios subobjetivos se intenta resolver de izquierda a
derecha. sta es una de las posibles alternativas de bsqueda de soluciones en el programa, que se
denomina bsqueda en profundidad y de izquierda a derecha (depth-first left-to-right).
Aplicando esta estrategia para buscar una nueva solucin en el programa para el objetivo p(X,a), se
obtiene otra solucin con sustitucin de xito X = a. Esta sustitucin viene determinada por la clusula 2
del programa, habida cuenta de que no hay otras posibilidades de unificacin para los predicados r y q
en el orden establecido de bsqueda.
Introduccin a la Inteligencia Artificial
Prof. L.I. Raymundo Lumbreras Lpez

Universidad del Valle de Mxico
Campus Tlalpan, Departamento de Tecnociencias
12
3. SWI-Prolog
3.1 Introduccin
SWI-Prolog es una implementacin del lenguaje de programacin Prolog que se ejecuta bajo Windows. Se
dise en la Universidad de Amsterdam, en el Departamento SWI (Social Werke Informatik), teniendo
como objetivo disponer de una aplicacin porttil y modificable. Es porttil al haberse escrito en C, y
puede compilarse en diferentes sistemas; por ejemplo, en UNIX. Se ide modificable para experimentar la
relacin entre la programacin lgica y otros paradigmas de la programacin. Por ello, su cdigo fuente
est disponible y se puede alterar para ser ajustado a las necesidades propias.
No obstante su portabilidad, que limita su eficiencia en comparacin con otras implementaciones
comerciales, es suficientemente robusto para crear aplicaciones razonablemente complejas, adems de ser
un producto de distribucin libre (y, por tanto, gratuito). sta la causa por la que no se dispone de un
entorno de desarrollo tan elaborado como otras aplicaciones comerciales, pero suficiente para los
propsitos de estas prcticas.
Esta implementacin no es un intrprete de Prolog, es un compilador de Prolog a un lenguaje intermedio
que se encuentra entre la semntica de alto nivel de los predicados Prolog y las instrucciones mquina de
la mquina sobre la que se ejecuta, o mquina soporte, basadas en microprocesadores de tipo CISC o
RISC. Este lenguaje intermedio se ejecuta sobre una mquina simulada en la mquina soporte. Se puede
afirmar entonces que el compilador Prolog es un traductor cruzado que produce cdigo para una mquina
que no est implementada en hardware. Esta mquina es una versin de la WAM (Warren Abstract
Machine, diseada por D.H.D. Warren
2
), que es el estndar de facto de las implementaciones Prolog.
Con respecto a la sintaxis y semntica de SWI-Prolog (que, al igual que el resto de lenguajes de
programacin difiere para cada implementacin) respeta el estndar Prolog de Edimburgo, como se
describe en Clocksin y Mellish.
la ltima versin se puede obtener en:
http://www.swi-prolog.org/
3.2 Instalacin
Para instalar SWI-Prolog es necesario disponer de unos 3 Mb de espacio libre en disco fijo
3
en un sistema
Windows. Tambin es posible instalarlo en Linux (la conocida versin de libre distribucin para PC del
sistema operativo UNIX), para lo cual es necesario obtener los ejecutables de la fuente de distribucin
4
.
En la pgina Web de la asignatura se puede encontrar el sistema para Windows.
3.2.1 Pasos a seguir en la instalacin
1. Escoger y/o crear un directorio que vaya a contener la implementacin SWI-Prolog. Por ejemplo,
C:\Archivos de programa\SWIProlog.
2. Extraer los archivos de la distribucin ejecutando el archivo autoextractor swiprolg.exe (ojo, que
falta una o en prolg). Para ello hay que ejecutarlo en el directorio escogido.
3. SWI-Prolog ya est listo para ser usado ejecutando el archivo plwin.exe, que se encuentra en el
directorio BIN de la instalacin. Una vez realizada la instalacin, no se deben trasladar los archivos.
4. Al ejecutar el archivo plwin.exe desde el Explorador de Windows se produce una ventana en donde se
ejecuta SWI-Prolog con el siguiente aspecto:



2
En [At-Kaci] se puede encontrar una descripcin legible de este diseo.
3
Al que se le suele llamar duro, una traduccin quizs incorrecta porque, si se cae, no es razonable pensar
que siga funcionando.
4
Por el momento no se proporcionar ms informacin acerca de esta versin, al no haber sido probada.
Introduccin a la Inteligencia Artificial
Prof. L.I. Raymundo Lumbreras Lpez

Universidad del Valle de Mxico
Campus Tlalpan, Departamento de Tecnociencias
13


5. A continuacin se introduce progman_setup., teniendo en cuenta el punto de final y que hay que
pulsar INTRO. Esto provoca la generacin del grupo de programas SWI-Prolog, que contiene el
ejecutable SWI-Prolog.
3.2.2 Editor
Se puede usar cualquier editor para editar los programas Prolog. Sin embargo, es recomendable usar uno
que proporcione informacin acerca de la lnea que se est editando. Una posible eleccin es Edit.com, el
editor estndar de la interfaz de comandos del sistema operativo, que funciona bajo Windows incluso con
ratn. A diferencia de Wordpad o Bloc de notas, informa de los nmeros de lnea.
Si se desea instalar este editor en el grupo de programas SWI-Prolog se debe crear un acceso directo a
Edit.com, que se encuentra en la estructura de directorios del sistema operativo (generalmente en
\Windows\COMMAND). Para que funcione el ratn en la ventana para trasladar el cursor o seleccionar
elementos del men hay que desactivar la casilla de verificacin "Modalidad de edicin rpida" en
"Propiedades", que se accede pulsando con el botn derecho sobre la barra de ttulo del editor.
Para predeterminar este editor es necesario crear una variable de entorno denominada EDITOR, que debe
tomar el valor del nombre completo del archivo Edit.com (por ejemplo,
C:\Windows\COMMAND\Edit.com). As, cada vez que se use el predicado edit, se invocar al
editor predeterminado.
Llegados a este punto, la instalacin est completa y se puede empezar a trabajar con SWI-Prolog.
Introduccin a la Inteligencia Artificial
Prof. L.I. Raymundo Lumbreras Lpez

Universidad del Valle de Mxico
Campus Tlalpan, Departamento de Tecnociencias
14
3.3 Trabajo con SWI-Prolog
3.3.1 Preliminares
La forma ms cmoda de trabajar con un intrprete Prolog es quizs usar el editor para crear y modificar el
programa en lugar de trabajar directamente con la base de datos. Con el primer procedimiento se edita el
programa y a continuacin se debe cargar en la base de datos. Con el segundo procedimiento se deben
introducir una a una las relaciones del programa con los predicados predefinidos tipo assert, y para
borrarlas es necesarios usar los predicados del tipo retract. Aunque ambos sern discutidos ms
adelante, es ms cmoda la edicin de todo el programa seguido del borrado de la base de datos y la
nueva consulta de todo el programa. Borrar la base de datos no es una tarea obvia, por ello se recomienda
el siguiente proceso:
1. Salir de SWI-Prolog con el predicado halt/0.
2. Editar y guardar el programa fuente con el editor.
3. Iniciar de nuevo SWI-Prolog.
4. Consultar el programa fuente con el predicado consult/1.
Si se est seguro de no haber eliminado ninguna clusula del programa, sino de slo haberla modificado,
entonces se pueden saltar los pasos 1 y 3.
3.3.2 Directorio de trabajo
El directorio predeterminado de trabajo es c:, que corresponde al directorio raz c:\. Es posible cambiar
este directorio con el predicado cd/1. Su argumento es el directorio al que se desea cambiar. Es necesario
poner este directorio entre comillas simples () si contiene un nombre que no es sintcticamente correcto
como tomo (se puede consultar Clocksin y Mellish). Por ejemplo, podemos hacer:
?- cd(pl).
?- cd(prgs).
para cambiar al directorio c:\pl\prgs. Alternativamente se puede hacer:
?- cd(c:\pl\prgs).
Ntese que ahora se necesitan las comillas puesto que los caracteres : y \ no son vlidos para escribir
un tomo.
Si se desea cambiar de unidad se puede hacer con el mismo predicado. Por ejemplo:
?- cd(d:).
3.3.3 rdenes del sistema operativo
SWI-Prolog acoge la sintaxis de las rdenes UNIX. Por ello, los predicados de interaccin con el sistema
interactivo estn basados en esta sintaxis. Adems del ya visto cd, tenemos:
Para consultar cul es el directorio actual:
?- pwd.
Para ver los archivos del directorio actual:
?- ls.
Para ver los archivos de un directorio concreto:
?- ls(directorio).
directorio debe seguir las normas sintcticas de los tomos o ir entrecomillado en caso contrario,
como en cd.
3.3.4 Prueba del ejemplo del apartado 2.1.1
Siguiendo el texto del apartado 2.1.1, se van a introducir de manera incremental en el archivo
comidas.pl las diferentes clusulas de que consta el programa. En primer lugar se introducirn las
clusulas del predicado calorias/2. A continuacin se inicia SWI-Prolog, se cambia al directorio de
trabajo y se consulta el programa. El sistema responde como sigue:
Introduccin a la Inteligencia Artificial
Prof. L.I. Raymundo Lumbreras Lpez

Universidad del Valle de Mxico
Campus Tlalpan, Departamento de Tecnociencias
15

El sistema ha informado que se ha compilado satisfactoriamente el programa comidas, de 916 bytes de
tamao, en 0,00 segundos. Si, por el contrario, el programa hubiese contenido algn error como, por
ejemplo, la omisin de un punto al final de la clusula calorias(ternera,200)
5
, entonces se habra
obtenido la siguiente respuesta:

El sistema informa que ha ocurrido un error en la lnea 4 (c:/pl/prgs/comidas.pl:4: Syntax
error: Operator expected.)
6
. El informe de errores puede resultar confuso al principio. Con la
prctica y conociendo en profundidad la sintaxis de Prolog se pueden analizar fcilmente
7
.
Para corregir este error se edita el programa para aadir el punto de final (no es necesario cerrar la ventana
de edicin) y se vuelve a guardar. A continuacin se reinicia Prolog despus de haber cerrado la sesin
anterior con el predicado halt/0. Se consulta el programa y, cuando se hayan corregido otros posibles
errores, se puede realizar una consulta como:
?- calorias(X,Y).
X = ensalada
Y = 30
donde se ha obtenido la sustitucin de xito que corresponde a la aplicacin de la primera clusula del
predicado calorias/2. Si se desea obtener ms soluciones se debe pulsar el punto y coma (; ).
?- calorias(X,Y).
X = ensalada
Y = 30;
X = sopa
Y = 60;

5
ste es uno de los errores ms frecuentes al empezar a programar en Prolog.
6
Ntese la sintaxis UNIX al separar los subdirectorios con la barra de divisin (/) en lugar de la barra
inclinada (\).
7
Por poner un caso, los errores de C son mucho ms crpticos an para programadores experimentados.
Introduccin a la Inteligencia Artificial
Prof. L.I. Raymundo Lumbreras Lpez

Universidad del Valle de Mxico
Campus Tlalpan, Departamento de Tecnociencias
16
X = ternera;
Y = 200
A partir de aqu se pueden ir introduciendo incrementalmente los diferentes predicados del programa e ir
probndolos en el orden del apartado 2.1.1 hasta llegar al programa completo. Es importante al principio
hacer este proceso paso a paso para ir aislando los posibles errores que aparezcan. As, el siguiente paso
sera introducir y probar el predicado plato_principal/1. Se repetira el proceso hasta completar el
programa.
3.3.5 Depuracin y traza de programas
Como en la mayora de lenguajes de programacin se tiene disponible la posibilidad de realizar la
depuracin y traza de los programas. Sin embargo, debido a las caractersticas operacionales de Prolog que
lo diferencian de los lenguajes de programacin imperativa, es necesario introducir el concepto de los
puertos de entrada y salida de los predicados, que forma parte del denominado modelo de bloques de
procedimientos.
3.3.5.1 Modelo de bloques de procedimientos
El modelo de bloques de procedimientos es una forma de representar la ejecucin de un programa Prolog.
Bajo este modelo, un objetivo es un bloque o caja con cuatro puertos de acceso que pueden ser
observables para el programador que depure un programa. Dos son de entrada (Call y Redo) y otros dos
de salida (Exit y Fail). En la siguiente figura se muestran de manera grfica estos puertos:
Call: Es el puerto de entrada en la primera evaluacin de un objetivo.
Exit: Es el puerto de salida que se atraviesa cuando se satisface la ejecucin de un objetivo.
Fail: Es el puerto de salida que se atraviesa cuando falla la ejecucin de un objetivo.
Redo: Es el puerto de entrada que por el que se pasa cuando se reevala un objetivo (se solicita otra
solucin).
Siguiendo el ejemplo anterior podemos plantear el objetivo:
?- plato_principal(X).
De manera grfica se obtendra el resultado de la figura siguiente, donde las flechas representan el control
de flujo del programa, y las cajas o bloques, los procedimientos que se van a resolver. Los puertos de
entrada y salida estn etiquetados con su nombre.
Las lneas discontinuas agrupan una de las clusulas de un predicado y se numeran con respecto al orden
textual en el que aparecen en el programa (Ej.: 1-plato_principal es la primera clusula del
predicado plato_principal(X). Las cajas de lnea continua agrupan a un objetivo. En cada esquina
entran o salen las lneas de los puertos de entrada y salida respectivamente. Los puertos estn numerados
para distinguir el momento en el que se atraviesan. Por ejemplo, Exit 1 corresponde al puerto de salida de
plato_principal(X) para su primera solucin: X = ternera. Redo 2 corresponde al puerto de entrada
para buscar la tercera solucin de plato_principal(X). El puerto Fail del predicado
plato_principal(X)se atraviesa cuando se han agotado sus cuatro soluciones.
Objetivo
Call
Fail
Exit
Redo
Introduccin a la Inteligencia Artificial
Prof. L.I. Raymundo Lumbreras Lpez

Universidad del Valle de Mxico
Campus Tlalpan, Departamento de Tecnociencias
17
En la seccin 3.3.5.3 se ver la forma en que se puede observar el funcionamiento del proceso de
depuracin y traza con un ejemplo usando los predicados que se introducen en el siguiente apartado.
3.3.5.2 Predicados de depuracin y traza
trace Activa el depurador.
notrace Desactiva el depurador.
spy(Predicado/Aridad)
spy(Predicado)
Coloca un punto espa en el predicado que se especifica como
Predicado/Aridad o simplemente Predicado. El depurador
en modo traza slo se detiene en los predicados especificados. Si no
se especifica ninguno se detiene en todos.
nospy(Predicado/Aridad)
nospy(Predicado)
Elimina el punto espa del predicado que se especifica.
leash(Modo) Especifica los puertos de parada del depurador.
call: Slo en el puerto call.
redo: Slo en el puerto redo.
exit: Slo en el puerto exit.
fail: Slo en el puerto fail.
full: En todos los puertos anteriores.
half: Slo en call, redo y fail.
Sin ser estndar, SWI-Prolog ofrece otro puerto adicional: unify. Cuando el depurador se detiene en l se
pueden observar las instanciaciones producidas por la unificacin de la cabeza de la clusula con el
objetivo. Para observarlo se pueden usar como argumentos de leash: unify (slo para el puerto unify)
o all (para los 5 puertos).
plato_principal(X
)
2-plato_principal
1-plato_principal
carne(X)
1-carne
carne(ternera).
carne(cordero).
2-carne
Exit 1
Exit 2
Exit
Call
Call
Call
Call
Redo 2
Redo 1
Call
etc...
Fail
Introduccin a la Inteligencia Artificial
Prof. L.I. Raymundo Lumbreras Lpez

Universidad del Valle de Mxico
Campus Tlalpan, Departamento de Tecnociencias
18
3.3.5.3 Depuracin y traza del ejemplo del apartado 2.1.1
Una vez iniciado el sistema SWI-Prolog y cargado el programa se va a iniciar la sesin de depuracin a
partir del objetivo plato_principal(X). Para ello se activa la traza y a continuacin se emite el
objetivo. Ahora se pulsa INTRO cada vez que aparezca una interrogacin, y se pulsa punto y coma (;) cada
vez que se alcance una solucin, como se muestra en la siguiente figura.
El formato de los informes de depuracin es el siguiente:
Puerto: (N) Objetivo ?
Puerto es el puerto que se est atravesando. N es un nmero de referencia que el depurador asigna al
predicado que se est resolviendo. Objetivo es el objetivo que se est resolviendo con las
instanciaciones actuales de las variables.
En este ejemplo se pueden observar claramente los puertos de entrada y salida para cada objetivo salvo el
puerto fail del objetivo inicial, que no lo muestra el depurador, al igual que no muestra su puerto de
entrada call.
Al pulsar INTRO despus de la interrogacin se est continuando la ejecucin del objetivo. Sin embargo, el
primer objetivo que se resuelve es rl_add_history. ste es un objetivo del sistema SWI-Prolog que
se ejecuta cada vez que se emite una consulta, y tiene como propsito aadir la consulta a la lista de
consultas emitidas (historial), de manera anloga al historial UNIX. La manera de recuperar consultas
anteriores se realiza como en UNIX (Vase el apartado 3.3.7)
A partir de este punto, cuando se resuelve el objetivo plato_principal(X) se puede hacer una clara
correspondencia de esta figura con la figura anterior.
Adems de la opcin de continuar (que aparece como creep, y que corresponde a la conocida opcin de
depuracin "paso a paso") se pueden elegir otras, como por ejemplo:
s skip. Impide atravesar el puerto call y contina la traza en el puerto de salida correspondiente. Es
equivalente "paso a paso por procedimientos".
n nodebug. Finaliza la depuracin y contina con la ejecucin.
a abort. Finaliza la depuracin y la ejecucin.
Introduccin a la Inteligencia Artificial
Prof. L.I. Raymundo Lumbreras Lpez

Universidad del Valle de Mxico
Campus Tlalpan, Departamento de Tecnociencias
19
3.3.6 Ayuda interactiva
La ayuda interactiva proporciona una bsqueda y examen rpidos del manual de SWI-Prolog. El manual
interactivo puede mostrar las definiciones de los predicados as como secciones enteras del manual SWI-
Prolog. Como casi siempre, el manual viene en ingls.
Se puede solicitar ayuda de varios modos:
?- help.
Muestra ayuda de la ayuda.
?- help(Nombre/Aridad).
Muestra ayuda del predicado Nombre de aridad Aridad.
?- help(Nombre).
Muestra ayuda del predicado Nombre.
?- help(Apartado).
Muestra el apartado del manual Apartado. Los apartados se especifican con nmeros y los
subapartados se separan con guiones.
Ej.:
?- help(2-3).
Muestra el apartado 2.3 Online Help.
3.3.7 Historial
SWI-Prolog ofrece un mecanismo de sustitucin similar a csh de UNIX. Permite la composicin de nuevas
consultas en funcin de las emitidas anteriormente. Por ejemplo
8
.:
!!. Repetir la ltima consulta.
!cad. Repetir la ltima consulta que empezaba por cad.
^nuevo^viejo. Sustituir el trozo viejo por el nuevo de la ltima consulta.
h. Mostrar el historial de consultas.
!nmero. Repetir la consulta nmero.
3.3.8 Interaccin con Windows
Es posible copiar la salida de SWI-Prolog al Portapapeles de Windows. Para ello se pueden seguir dos
mtodos:
1. Indicar el principio del rea a copiar pulsando con el botn izquierdo del ratn, y el fin con el derecho.
2. Pulsar con el botn izquierdo del ratn y arrastrar para delimitar el rea a copiar.
El primer mtodo es til cuando el rea a copiar es mayor que la ventana y es preciso desplazar el texto
para encontrar el final del rea. Ntese que no es necesario pulsar ninguna combinacin de teclas a
continuacin; el simple hecho de realizar la seleccin implica la copia en el portapapeles.

3.4 Referencia de algunos predicados predefinidos
3.4.1 Control
halt Abandona el intrprete eliminando la base de datos (pero no el programa).
fail Este predicado siempre falla (se puede usar para realizar bsquedas exhaustivas por fallo).

8
Para obtener ms informacin acerca de cmo recuperar entradas pasadas consltese el apartado 2.4 del manual o
emitir la consulta help(2-4).
Introduccin a la Inteligencia Artificial
Prof. L.I. Raymundo Lumbreras Lpez

Universidad del Valle de Mxico
Campus Tlalpan, Departamento de Tecnociencias
20
3.4.2 Manejo de la base de datos
asserta(Clusula) Aade Clusula al comienzo de las clusulas del predicado
correspondiente.
Ej.: asserta(concatenar([],X,X)).
Coloca concatenar([],X,X) como primera clusula del predicado
concatenar.
assertz(Clusula) Igual que asserta pero al final.
consult(Archivo) Aade el contenido del archivo Archivo al final de la base de datos.
listing Visualiza la base de datos completa (incluidos los predicados incluidos en el
sistema SWI-Prolog en el inicio, aunque no los predefinidos).
listing(Predicado) Visualiza las clusulas con cabeza Predicado.
retract(Clusula) Elimina Clusula del predicado correspondiente.
Ej.: retract(concatenar([],X,X)).
Elimina la clusula concatenar([],X,X) de la base de datos.
3.4.3 Entrada/Salida
get0(Carcter) Lee un carcter de la corriente de entrada activa (generalmente la consola, es decir,
lee del teclado) y lo almacena en Carcter.
nl Provoca un salto de lnea en pantalla.
write(Trmino) Escribe el trmino Trmino en pantalla.
3.4.4 Aritmtica
is Predicado infijo para evaluacin de expresiones aritmticas.
3.5 Operadores aritmticos
+ Suma.
- Resta.
* Multiplicacin.
/ Divisin.
// Divisin entera.
mod Resto de la divisin entera.
^ Exponenciacin.
sqrt Raz cuadrada.
- Complemento (operador unario).
/\ Conjuncin lgica bit a bit para enteros.
\/ Disyuncin lgica bit a bit para enteros.
\ Complemento lgico bit a bit para enteros.
<< Desplazamiento a la izquierda. Operador binario. Primer argumento: nmero a desplazar. Segundo
argumento: nmero de posiciones a desplazar. Los enteros son de 27 bits.
>> Desplazamiento a la derecha. Operador binario. Primer argumento: nmero a desplazar. Segundo
argumento: nmero de posiciones a desplazar.
abs Valor absoluto. Operador unario.
sin Seno.
cos Coseno.
tan Tangente.
asin Arcoseno.
acos Arcocoseno.
atan Arcotangente.
exp Exponencial del nmero e.
log Logaritmo neperiano (en base e).
Introduccin a la Inteligencia Artificial
Prof. L.I. Raymundo Lumbreras Lpez

Universidad del Valle de Mxico
Campus Tlalpan, Departamento de Tecnociencias
21
log10 Logaritmo decimal.
3.6 Operadores lgicos
< Menor
> Mayor
>= Mayor o igual
=< Menor o igual
=:= Igual
=\= Distinto
Introduccin a la Inteligencia Artificial
Prof. L.I. Raymundo Lumbreras Lpez

Universidad del Valle de Mxico
Campus Tlalpan, Departamento de Tecnociencias
22
4. Sicstus Prolog
4.1 Introduccin
Sicstus Prolog es una implementacin del lenguaje de programacin Prolog que se ejecuta bajo diferentes
sistemas operativos, como UNIX, Linux y Windows. Se dise en el instituto sueco de informtica (SICS,
Swedish Institute on Computer Science), una organizacin investigadora independiente sin nimo de lucro
para promover el uso de las nuevas ideas y resultados provenientes de la investigacin en la industria y la
sociedad en general. Aunque originalmente fue distribuido gratuitamente, actualmente es un sistema
comercial sujeto a contratos de licencia. Es uno de los sistemas de referencia en el mbito acadmico.
Es un sistema actual que adopta el estndar internacional ISO/IEC 13211-1 (PROLOG: Part 1---General
Core) y se ha construido sobre un motor Prolog de alto rendimiento con generacin de cdigo nativo para
procesadores Sparc. El motor Prolog, al igual que el sistema SWI, es una extensin de la mquina WAM.
La versin 3.6 del sistema y su manual estn disponibles en la pgina Web de la asignatura en varios
archivos de distribucin:
http://www.fdi.ucm.es/profesor/fernan/PLOG/
y las ltimas versiones se pueden obtener en:
http://www.sics.se/sicstus/
4.2 Instalacin
Para instalar Sicstus Prolog es necesario disponer de unos 8 Mb de espacio libre en disco fijo adems de
tener instalado previamente Windows. Tambin es posible instalarlo en otros sistemas operativos, para lo
cual es necesario obtener los archivos de la fuente de distribucin
(http://www.sics.se/sicstus/). Slo se pueden obtener versiones de evaluacin por periodos
de tiempo limitados. En la pgina Web de la asignatura se puede encontrar el sistema para Windows. La
distribucin consta de los siguientes archivos:
sp3w32.exe. Primer archivo comprimido del sistema base, incluyendo el manual en formato hlp de
Windows.
sp3w32.w02. Segundo archivo comprimido del sistema base.
MANHTML.ZIP. Manual en formato HTML.
manps.zip. Manual en formato PostScript.
4.2.1 Pasos a seguir en la instalacin
Ejecutar el archivo sp3w32.exe y seguir las instrucciones en pantalla. Se obtendr un grupo de
programas que contiene el acceso directo al programa como consola DOS (Sicstus Prolog (console)) o
como ventana Windows (Sicstus Prolog), siendo esta ltima la que se usar habitualmente, la ayuda del
programa y las notas de la versin. Al ejecutar Sicstus Prolog se obtiene una ventana con el siguiente
aspecto:
Introduccin a la Inteligencia Artificial
Prof. L.I. Raymundo Lumbreras Lpez

Universidad del Valle de Mxico
Campus Tlalpan, Departamento de Tecnociencias
23
4.2.2 Editor
Con respecto al editor se hacen los mismos comentarios que para SWI: se recomienda usar un editor con
informacin del nmero de lnea para resolver las referencias a los nmeros de lnea que aparecen en los
informes de errores. En concreto, el manual explica cmo instalar y usar Emacs.
4.3 Trabajo con Sicstus Prolog
En este apartado, en lugar de mostrar el trabajo con Sicstus Prolog con respecto a la programacin lgica,
se mostrarn algunos aspectos del trabajo con respecto a la programacin con restricciones.
4.3.1 Dominios
El tipo de dominio de las variables lgicas usadas en el contexto de la programacin con restricciones
define las restricciones que se pueden aplicar sobre ellas, el resolutor usado para la propagacin y la
posible representacin del problema. Aunque muchos problemas se pueden modelar con diferentes
dominios, lo ms probable es que uno en concreto sea el que ms se adapte a l en trminos de la
expresin del problema y su resolucin (rendimiento). Al plantear un problema hay que decidir uno y slo
un dominio: no se pueden mezclar dominios entre s en una misma resolucin (salvo el caso especial de los
reales y los racionales).
En Sicstus podemos encontrar los siguientes dominios:
Dominio Booleano. Las variables pueden tomar valores binarios (0/1) y se usa un resolutor basado en
diagramas de decisin booleanos bastante eficiente. Vase el Captulo 30 del manual.
Dominio de los reales. Las variables pueden tomar valores reales comprendidos entre la
representacin mnima y mxima del sistema. En este dominio se plantean un gran nmero de
problemas prcticos de inters y se resuelven con gran eficacia. Puede resolver restricciones lineales
y retrasar las no lineales hasta que eventualmente se conviertan en lineales. Admite combinar
variables reales con enteras para resolver problemas de optimizacin lineal entera mixta. Vase el
Captulo 31 del manual.
Dominio de los racionales. Es similar al anterior con respecto a las restricciones que se pueden
plantear pero slo se admite la representacin de racionales. No alcanza el mismo grado de aplicacin
prctica. Se describe en el mismo captulo.
Dominio finito. Las variables pueden tomar valores enteros. El resolutor integra propagacin para
acotar los dominios de las variables y etiquetado para asignarles valores. Es un dominio de gran
importancia prctica para resolver problemas como planificacin, horarios, empaquetado y otros en
los que es caracterstico el carcter discreto de las cantidades. Vase el Captulo 32.
4.3.2 Ejemplo de trabajo
Para plantear un programa con restricciones es necesario cargar inicialmente la biblioteca del dominio finito
elegido mediante:
Introduccin a la Inteligencia Artificial
Prof. L.I. Raymundo Lumbreras Lpez

Universidad del Valle de Mxico
Campus Tlalpan, Departamento de Tecnociencias
24
use_module(library(biblioteca)).
Donde biblioteca es:
clpb para booleanos.
clpr para reales.
clpq para racionales.
clpfd para finitos.
El siguiente programa ilustra el uso del dominio de los reales para resolver ecuaciones. Las restricciones en
este dominio se encierran entre llaves.
?- {2*A+3*B=C/2}, C=10.0, A=B.
A = 1.0,
B = 1.0,
C = 10.0
La relacin 2*A+3*B=C/2 se entiende como tal, no como una unificacin sintctica de trminos como
ocurre en Prolog; es decir, el doble del valor de A sumado al triple del valor de B debe ser igual a la mitad
del valor de C, independientemente de si se puede comprobar o calcular en el momento en que se plantea
la restriccin. Ntese, por otra parte, que A=B no es una restriccin (no es una ecuacin que se enve al
resolutor) sino que es simplemente una unificacin Prolog que establece que los trminos (nmeros en
este caso) ligados a las variables A y B deben ser iguales.
Otro ejemplo tpico es el puzzle aritmtico SEND+MORE=MONEY, donde las letras representan cifras que
se deben leer como cantidades que satisfacen esa ecuacin. Este ejemplo se formula bien con dominios
finitos. En este tipo de dominio las restricciones estn caracterizadas por su forma (el nombre del
predicado usado y los operadores que intervienen), en lugar de delimitarse entre llaves como en el caso
anterior.
:- use_module(library(clpfd)).
mm([S,E,N,D,M,O,R,Y]) :-
domain([S,E,N,D,M,O,R,Y], 0, 9),
S#>0, M#>0,
all_different([S,E,N,D,M,O,R,Y]),
sum(S,E,N,D,M,O,R,Y),
labeling([], [S,E,N,D,M,O,R,Y]).
sum(S, E, N, D, M, O, R, Y) :-
1000*S + 100*E + 10*N + D
+ 1000*M + 100*O + 10*R + E
#= 10000*M + 1000*O + 100*N + 10*E + Y.
| ?- mm([S,E,N,D,M,O,R,Y]).
D = 7,
E = 5,
M = 1,
N = 6,
O = 0,
R = 8,
S = 9,
Y = 2 ?
La relacin S#>0 impone que S sea estrictamente mayor que cero, una relacin que se enva al resolutor
(en general, las relaciones aritmticas siempre van precedidas por el smbolo del sostenido). El predicado
predefinido all_different impone que las variables que son su argumento deben ser distintas
entre s, y labeling provoca que se etiqueten las variables que contenidas en las restricciones
Introduccin a la Inteligencia Artificial
Prof. L.I. Raymundo Lumbreras Lpez

Universidad del Valle de Mxico
Campus Tlalpan, Departamento de Tecnociencias
25
enviadas al resolutor.
Introduccin a la Inteligencia Artificial
Prof. L.I. Raymundo Lumbreras Lpez

Universidad del Valle de Mxico
Campus Tlalpan, Departamento de Tecnociencias
26
5. Sugerencias y avisos
5.1 Estilo
Aunque hay muchas propuestas sobre el estilo de programacin, aqu nos centraremos en uno de los
estilos del formato de los programas. Se puede resumir en las siguientes directrices:
Escribir las cabezas en una lnea separada del cuerpo.
Escribir los objetivos sangrados, uno en cada lnea.
Utilizar nombres de tomos significativos.
Ej.: Factorial en lugar de Fac (que podra significar Facultad, Factora, Facineroso, ...)
9
.
Agrupar las reglas del mismo predicado.
Separar los predicados diferentes.
Escribir comentarios acerca de la semntica pretendida para cada predicado (al menos).
Escribir los datos referentes al programa como comentario en su cabecera.
Ej.: Fragmento de la prctica 1.

9
No importa que sean nombres largos, hay toda una lnea para escribir un tomo si se siguen las directrices
anteriores.
/************************************************************************/
/* */
/* Programa: */
/* Prctica 1: rbol genealgico. */
/* */
/* Programador: */
/* Programacin Lgica */
/* */
/* Fecha: */
/* 28 de agosto de 1996 */
/* */
/* Nota: */
/* Ahora debera estar de vacaciones */
/* */
/************************************************************************/
/* Para todas las relaciones binarias de parentesco Relacin(X,Y) se
significa que X tiene relacin de Relacin con Y (Es decir, X es Relacin
de Y).
Ej.: abuelo(X,Y) = X tiene relacin de abuelo con Y = X es abuelo de Y.
Para las relaciones unarias Caracterstica(X) se significa que X tiene
caracterstica Caracterstica (es decir, X es caracterstica).
Ej.: hombre(X) = X tiene caracterstica de hombre = X es hombre */
/* Base de datos de hechos */
/* El predicado hombre/1 denota que su argumento es hombre */
hombre(pablo).
hombre(eladio).
...
/* Base de datos de reglas de inferencia */
...
/* El predicado hija/2 denota que su primer argumento es hija de su segundo*/
hija(X,Y) :-
progenitor(Y,X),
mujer(X).
...
Introduccin a la Inteligencia Artificial
Prof. L.I. Raymundo Lumbreras Lpez

Universidad del Valle de Mxico
Campus Tlalpan, Departamento de Tecnociencias
27
5.2 Precauciones
Conviene tener presentes los siguientes puntos para evitar problemas aadidos en la programacin:
1. Los nombres de las variables empiezan por mayscula o por el carcter subrayado (_).
2. Los nombres de los tomos no pueden empezar por mayscula a menos que se encuentren entre
comillas simples.
3. Las reglas siempre terminan con un punto.
4. Las variables tienen alcance local a la clusula donde se usan.
5. Aunque un programa sea sintcticamente correcto, ello no implica su validez semntica
10
(atentos a los
nombres de las variables y predicados).
6. Es obligado agrupar las clusulas por predicado. No se pueden tener clusulas desperdigadas por todo
el programa.
7. No usar puntos para separar los objetivos. Esto puede ser sintcticamente correcto en algunos casos y
muy difcil de encontrar la causa del error.
5.3 Elegancia
Como nota final, hay que insistir en que un programa Prolog complicado probablemente equivalga a un
programa que se ha diseado sin tener una idea clara del problema que se intenta resolver. Los programas
elegantes son concisos, funcionan para todos los casos previstos y son fciles de entender y, por tanto,
de mantener. Los programas desgarbados tienen infinitos predicados, casi nunca funcionan y nadie puede
entender (ni siquiera el que los program). En [OKeefe] no se sugiere que se hagan programas elegantes,
se postula que deben ser elegantes. Esto nos lo podemos aplicar a nosotros mismos si queremos dejar de
perder horas intiles en la depuracin de los programas desgarbados.
P.D. La elegancia es un signo de distincin.
5.4 Errores conocidos
A continuacin se mencionan algunos de los errores detectados en la implementacin SWI-Prolog.
1. Si la ltima lnea del archivo no termina en un retorno de carro, se producir un error en la consulta del
programa como el del ejemplo siguiente:
?- consult(aleator).
[WARNING: (s:/fernan/docs/docencia/plog/plog9697/fuentes/aleator.pl:4)
/fernan/docs/docencia/plog/plog9697/fuentes/aleator.pl:4: Syntax error:
Unexpected end of file]
aleator compiled, 0.05 sec, 232 bytes.

5.5 Documentacin a entregar con las prcticas
Al programa debidamente documentado, como se ha indicado en el apartado 5.1, debe acompaarle una
memoria personal
11
que indique el proceso de elaboracin del programa. Se deben discutir las opciones
elegidas y justificarlas. No se trata ahora slo de presentar una solucin al problema, sino de convencer de
que es una buena solucin. En definitiva hay que razonar todos los pasos que se han seguido.
Es necesario incluir pruebas de la funcionalidad de la prctica que reflejen, de manera lo ms exhaustiva
posible, su validacin funcional. Es decir, incluir el conjunto de consultas con las respuestas obtenidas
que mejor representen su funcionalidad.
La existencia de errores identificados en el programa no devala la calificacin de la prctica; al contrario,
puede mejorarla si se presenta claramente el error identificado.
El esquema de la memoria debe ser el siguiente: Solucin planteada, comentarios (con referencia a los
errores encontrados y si se han podido resolver), validacin funcional (consultas emitidas y respuestas
computadas por el sistema) y listado del programa (debidamente comentado).

10
Como ocurre en todos los lenguajes de programacin.
11
Cada alumno debe entregar una memoria de su cosecha.
Introduccin a la Inteligencia Artificial
Prof. L.I. Raymundo Lumbreras Lpez

Universidad del Valle de Mxico
Campus Tlalpan, Departamento de Tecnociencias
28
Recomendacin: es mejor entregar una buena prctica incompleta a una prctica arreglada
12
o sin
calidad
13
.

12
La que, sin funcionar, se pretende convencer de que es una prctica que funciona.
13
Aqulla que contiene programas y/o documentacin desgarbados.
Introduccin a la Inteligencia Artificial
Prof. L.I. Raymundo Lumbreras Lpez

Universidad del Valle de Mxico
Campus Tlalpan, Departamento de Tecnociencias
29
6. Prcticas propuestas
6.1 rbol genealgico
Objetivo:
Diseo de una base de datos de personas y sus relaciones de parentesco.
Enunciado:
Implementar una base de datos de personas de una familia que las relacione con los siguientes hechos
(deben haber al menos 4 niveles en el rbol genealgico):
Hecho Significado
padre(X,Y) X es padre de Y
madre(X,Y) X es madre de Y
hombre(X) X es hombre
mujer(X) X es mujer
marido(X,Y) X es marido de Y
En funcin de la base de datos anterior implementar las siguientes relaciones:
Relacin Significado
esposa(X,Y) X es la esposa de Y (Y es el marido de X)
conyuge(X,Y) X es cnyuge de Y (X es el marido o la esposa de Y)
progenitor(X,Y) X es progenitor (padre o madre) de Y
hijo(X,Y) X es hijo de Y
hija(X,Y) X es hija de Y
vastago(X,Y) X es vstago (hijo o hija) de Y
hermano(X,Y) X es hermano de Y
hermana(X,Y) X es hermana de Y
abuelo(X,Y) X es abuelo de Y
abuela(X,Y) X es abuela de Y
nieto(X,Y) X es nieto de Y
nieta(X,Y) X es nieta de Y
ascendiente(X,Y) X es ascendiente (o antepasado) de Y
descendiente(X,Y) X es descendiente (o sucesor) de Y
yerno(X,Y) X es yerno de Y (X es el marido de la hija de Y)
nuera(X,Y) X es nuera de Y (X es la esposa del hijo de Y)
cunyado(X,Y) X es cuado de Y (X es hermano del cnyuge de Y)
cunyada(X,Y) X es cuada de Y (X es hermana del cnyuge de Y)
concunyado(X,Y) X es concuado de Y (X es el marido de la cuada de Y)
concunyada(X,Y) X es concuada de Y (X es la esposa del cuado de Y)
suegro(X,Y) X es suegro de Y (X es el padre del cnyuge de Y)
suegra(X,Y) X es suegra de Y (X es la madre del cnyuge de Y)
Probar la correccin de las relaciones anteriores e implementar relaciones para:
Imprimir en pantalla todas las personas que sean hermanos(as) de alguien, de la forma:
X es hermano de Y.
Obtener el rbol genealgico de una persona. La respuesta construida debe ser un trmino.
Obtener todas las relaciones existentes de una persona con el resto.
Ntese que las relaciones que se deben implementar no contienen caracteres del conjunto extendido de
ASCII (acentos, ees, ...).
Introduccin a la Inteligencia Artificial
Prof. L.I. Raymundo Lumbreras Lpez

Universidad del Valle de Mxico
Campus Tlalpan, Departamento de Tecnociencias
30
6.2 Expresiones aritmticas
Objetivo:
Diseo de un sistema aritmtico de Peano que incluya la descripcin del tipo de datos nmero natural y
varias operaciones asociadas a l.
Enunciado:
a) Definir el tipo de datos entero positivo en base al constructor sucesor (s/1).
b) Implementar la relacin polinomio:
polinomio(P) :- nat(P).
polinomio(P) :- constant(P).
polinomio(P1+P2) :- polinomio(P1),polinomio(P2).
polinomio(P1-P2) :- polinomio(P1),polinomio(P2).
polinomio(-P) :- polinomio(P).
polinomio(P1*P2) :- polinomio(P1), polinomio(P2).
Nota: la segunda clusula se entiende para representar parmetros, como la a en -s(s(0))*(x-
a*1).
c) Implementar las siguientes relaciones:
Relacin Significado
sum(X,Y,Z) Z es la suma de X e Y
prod(X,Y,Z) Z es el producto de X e Y
mod(X,Y,Z) Z es el cociente de la divisin entera entre X e Y
rem(X,Y,Z) Z es el resto de la divisin entera entre X e Y
fact(X,Y) Y es el factorial de X
pot(X,N,Y) Y es la potencia N-sima de X
ack(X,Y,Z) Z es el resultado de la aplicacin de la funcin de Ackermann a X e Y,
estando definida como sigue:
ackermann(0,N) = N+1
ackermann(M,0) = ackermann(M-1,1)
ackermann(M,N) = ackermann(M-1,ackermann(M,N-1))
mcm(X,Y,Z) Z es el mnimo comn mltiplo de X e Y
d) Implementar con la relacin imprimir(P) la impresin (visualizacin en pantalla) de polinomios
sustituyendo las aplicaciones de s/1 por el nmero correspondiente al que representa (Ej: P = -
2*(x-a*1) en lugar de -s(s(0))*(x-a*1)).
e) Implementar la evaluacin de polinomios para valores de los parmetros y variables con la relacin:
eval(Polinomio,AsignacinDeValores,Valor).
AsignacinDeValores debe ser una lista con elementos de la forma t
i
=v
i
, donde t
i
es una variable
o un parmetro y v
i
es su valor correspondiente.
Ej: eval(s(s(0))*(x-a*s(0)), [x=s(s(0)),a=s(0)], s(s(0)))
Qu problemas aparecen con los valores negativos? Qu ocurre si se deja algn parmetro o variable
sin especificar en la lista y cmo se podra solucionar? (Vase tambin en relacin a esta pregunta el
siguiente punto)
f) Implementar la simplificacin de polinomios.
g) Implementar la relacin derivada/3 y aplicar la simplificacin, donde derivada(X,Y,Z) representa
que Z es la derivada del polinomio X con respecto a Y.
h) Implementar la relacin integral/3 Se puede aprovechar alguna relacin anterior? Qu problemas
aparecen?
Introduccin a la Inteligencia Artificial
Prof. L.I. Raymundo Lumbreras Lpez

Universidad del Valle de Mxico
Campus Tlalpan, Departamento de Tecnociencias
31
6.3 Analizador sintctico y traductor
Objetivo:
Diseo de un analizador sintctico y un traductor entre dos idiomas utilizando gramticas lgicas.
Enunciado:
Realizar los siguientes apartados:
a) Definir una base de datos de nombres, verbos, determinantes, adjetivos y pronombres.
b) Definir la relacin sintagma_verbal para varios de sus casos posibles, en el que sintagma verbal
pueda estar compuesto por:
verbo
verbo y sintagma nominal
c) Definir la relacin sintagma_nominal para varios de sus casos posibles, en el que sintagma
nominal pueda estar compuesto por:
pronombre
nombre
determinante y nombre
determinante, adjetivo y nombre
determinante, nombre y adjetivo
d) Definir la relacin oracin que pueda analizar oraciones compuestas por sintagma nominal y
sintagma verbal. Usarla para analizar (comprobar si una lista de identificadores es una oracin) y
generar oraciones.
e) Aadir informacin de gnero, el nmero y la persona a los trminos lxicos de la base de datos, de
forma que las frases concuerden en gnero, nmero y persona.
f) Aadir informacin semntica que asegure que las frases generadas tengan sentido (por ejemplo,
[el,msico,come,una,manzana] tiene sentido, pero [el,msico,come,un,violn] no).
g) Definir una base de datos lxica en la que aparezca la correspondencia entre dos idiomas para nombres,
verbos, determinantes, adjetivos y pronombres.
h) Definir la relacin traducir/2 que tenga como objetivo realizar o comprobar la traduccin de las
oraciones que se proporcionen como sus argumentos.
Introduccin a la Inteligencia Artificial
Prof. L.I. Raymundo Lumbreras Lpez

Universidad del Valle de Mxico
Campus Tlalpan, Departamento de Tecnociencias
32
6.4 Intrprete de Prolog
Objetivo:
Diseo de un intrprete Prolog dotado de depurador.
Enunciado:
Realizar los siguientes apartados:
a) Implementar la unificacin explcitamente con la relacin unif(X,Y) sin occur-check.
b) Implementar la unificacin explcitamente con la relacin unif(X,Y) con occur-check.
c) Proponer una medida de la complejidad de la unificacin y estudiar el rendimiento de unif/2 con
varios ejemplos que se planteen. Resumir los resultados en una tabla.
d) Realizar un intrprete bsico de Prolog con la relacin interpretar(Objetivo), donde se haga
explcita la reduccin de los objetivos.
e) Ampliar el apartado anterior aadiendo la unificacin explcita del segundo apartado En qu mejora
este intrprete al estndar de Prolog?
f) Aadir un argumento extra al intrprete de manera que la relacin quede como
interpretar(Objetivo, ModoDepuracin) y que tenga como fin realizar la depuracin de
la reduccin de Objetivo segn indique ModoDepuracin. Al menos debe haber un modo para
indicar los puertos call (Vase el apartado 3.3.5).
Introduccin a la Inteligencia Artificial
Prof. L.I. Raymundo Lumbreras Lpez

Universidad del Valle de Mxico
Campus Tlalpan, Departamento de Tecnociencias
33
7. Bibliografa
1. [At-Kaci] "The WAM: A (Real) Tutorial","Paris Research Laboratory", Informe tcnico n 5, 1990.
2. [Clocksin y Mellish] W.F. Clocksin, C.S. Mellish, Programacin en Prolog, Ed. Gustavo Gili S.A.,
1987.
3. [Coelho y Cotta] H. Coelho, J.C. Cotta, Prolog by Example, Springer-Verlag, 1988.
4. [Giannessini et al] F. Giannesini, H. Kanoui, R. Pasero, M. van Caneghem, Prolog, Addison-Wesley
Publishing Company, 1986.
5. [Lloyd] J.W. Lloyd, Foundations of Logic Programming, Springer-Verlag, 1984.
6. [Maier y Warren] D. Maier, D.S. Warren, Computing with Logic, The Benjamin/Cummings Publishing
Company, Inc., 1988.
7. [OKeefe] R.A. OKeefe, The Craft of Prolog, The MIT Press, 1990.
8. [Sterling y Shapiro] L. Sterling, E. Shapiro, The Art of Prolog, The MIT Press, 1987.
9. [Wielemaker] Jan Wielemaker, SWI-Prolog 2.7. Reference Manual, University of Amsterdam, Dept. of
Social Science Informatics (SWI), 1996.
Introduccin a la Inteligencia Artificial
Prof. L.I. Raymundo Lumbreras Lpez

Universidad del Valle de Mxico
Campus Tlalpan, Departamento de Tecnociencias
34
8. Agradecimientos
En general, se debe agradecer la labor de los investigadores en el rea de programacin lgica que han
sabido transmitir su entusiasmo por un paradigma de la programacin declarativa a travs de Prolog.
Es obligado agradecer al autor de la implementacin SWI-Prolog, Jan Wielemaker, el hacerla disponible
lbremente para aprender y experimentar con ella.
Este manual recoge aportaciones de otros autores que se citan en la bibliografa y de J.J. Ruz, que
proporcion las notas del curso Sistemas de clculo que imparti en la Facultad de Ciencias Fsicas de la
UCM.
Introduccin a la Inteligencia Artificial
Prof. L.I. Raymundo Lumbreras Lpez

Universidad del Valle de Mxico
Campus Tlalpan, Departamento de Tecnociencias
35
9. ndice
-, 19

- (complemento), 19
- (sustraccin), 19
"
", 19
*
*, 19
/
/, 19
/", 19
//, 19
;
;, 14
^
^, 19
+
+, 19
<
<, 20
<<, 19
=
=:=, 20
=<, 20
=\=, 20
>
>, 20
>=, 20
>>, 19
A
abort, 17
abs, 19
acos, 19
afirmacin, 9
Agradecimientos, 31
aridad, 9
Aritmtica, 19
asin, 19
asserta, 18
assertz, 19
atan, 19
tomos, 7
Ayuda interactiva, 18
B
Bibliografa, 30
C
Call, 15
cd/1, 13
clusula negativa, 9
consult, 13, 19
consulta, 9
Control, 18
Convenciones sintcticas, 9
copiar, 18
cos, 19
creep, 17
D
depth-first left-to-right, 10
Depuracin y traza de programas, 15
Directorio de trabajo, 13
dominio, 5, 6, 10, 22, 23
Dominio Booleano, 22
Dominio de los racionales, 22
Dominio de los reales, 22
Dominio finito, 22
Dominios, 22
E
Edit.com, 12
Editor, 12, 22
Elegancia, 25
encaje de patrones, 9
Entrada/Salida, 19
Estilo, 24
Estructuras de datos, 7
Exit, 15
exp, 19
F
Fail, 15
full, 16
funtor, 7, 9
Introduccin a la Inteligencia Artificial
Prof. L.I. Raymundo Lumbreras Lpez

Universidad del Valle de Mxico
Campus Tlalpan, Departamento de Tecnociencias
36
G
get0, 19
H
half, 16
halt, 13, 14, 18
hecho, 9
help, 18
historial, 17
Historial, 18
Horn, 8
I
Instalacin, 11, 21
instanciar, 10
Introduccin a Prolog, 5
Introduccin informal, 5
is, 19
L
leash, 16
listas, 8
listing, 19
log, 19
log10, 19
ls, 13
M
Manejo de la base de datos, 18
mquina soporte, 11
mod, 19
Modelo de bloques de procedimientos, 15
Modelo de cmputo, 10
N
nl, 19
nodebug, 17
nospy, 16
notrace, 16
O
Operadores aritmticos, 19
Operadores lgicos, 20
rdenes del sistema operativo, 13
P
Prcticas recomendadas, 24, 26
Precauciones, 25
Programacin recursiva, 7
programas desgarbados, 25
programas elegantes, 25
Prolog, 11
Prlogo, 4
puertos de acceso, 15
punto espa, 16
pwd, 13
R
Redo, 15
Referencia de algunos predicados predefinidos, 18
resolucin lineal, 10
retract, 13, 19
rl_add_history, 17
Robinson, 10
S
SICS, 21
Sicstus Prolog, 4, 21, 22
sin, 19
skip, 17
spy, 16
sqrt, 19
Step by Step, 17
Sugerencias y avisos, 24
SWI, 4, 11, 12, 13, 16, 17, 18, 19, 21, 22, 25, 30, 31
T
tan, 19
trmino, 9
Trminos estructurados, 7
Trabajo con SWI-Prolog, 13, 22
trace, 16
U
Unificacin, 9
unify, 16
W
WAM, 11, 21, 30
Warren Abstract Machine, 11
Web, 11, 21
Windows, 11, 12, 18, 21
write, 19
Introduccin a la Inteligencia Artificial
Prof. L.I. Raymundo Lumbreras Lpez

Universidad del Valle de Mxico
Campus Tlalpan, Departamento de Tecnociencias

Das könnte Ihnen auch gefallen