Universidad
del Valle de México
Campus Tlalpan, Departamento de Tecnociencias
MANUAL DE PRÁCTICAS LIBRES DE PROGRAMACIÓN LÓGICA [IA]
Introducción Introducción a la Inteligencia Artificial Prof. L.I. Raymundo Lumbreras López
1
Universidad
del Valle de México
Campus Tlalpan, Departamento de Tecnociencias
1. Pr ól ogo ____________________ ______________________________ ____________________ ____________________ ___________________4 _________4 2. I ntr oducción oducción a Prol Pr ol og ________ ____________ ________ ________ ________ ________ ________ ________ ________ ________ _______5 ___5
2.1 2.1.1 2.1.2 2.1.3
2.2 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 2.2.6 2.2.7
Intr Introd oduc ucci ción ón info inform rmal al ______________________________ _______________ _____________________________ _______________ _ 55 Preliminares ___ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ _____5 __5 Prog Progra rama maci ción ón recu recurs rsiv ivaa ___ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ _____7 __7 Estr Estruc uctu tura rass de dato datos_ s____ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ____8 _8
Intr Introd oduc ucci ción ón form formal_____ al_______________ ____________________ ____________________ ____________________ ____________9 __9 Clá Cláusu usulas de Hor Horn __ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ __99 Hech Hechos os __ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ __99 Cons Consul ulta tas____ s_______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ___99 Términos __ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ___9 _9 Conv Conven enio ioss sint sintác ácti tico coss __ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ___9 _9 Uni Unific ficaci ación ón___ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ _____1 __100 Mode Modelo lo de cómp cómput utoo __ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____1 __100
3. SWI -Pr olog ol og ____________________ ______________________________ ____________________ ____________________ _______________12 _____12
3.1
Intr Introd oduc ucci ción ón ____________________ ______________________________ ____________________ ____________________ ___________12 _12
3.2
Insta Instalac lación_____ ión_______________ ____________________ ____________________ ____________________ __________________12 ________12
3.2.1 3.2.2
3.3 3.3.1 3.3.2 3.3.3 3.3.4 3.3.5 3.3.6 3.3.7 3.3.8
3.4 3.4.1 3.4.2 3.4.3 3.4.4
Paso Pasoss a segu seguir ir en la inst instal alac ació ión_ n____ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ____12 _12 Edit Editor or___ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______1 ___133
Trab Trabaj ajoo con con SWISWI-Pr Prol olog og ___________________ _____________________________ ____________________ _____________14 ___14 Preliminares ___ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ____14 _14 Dire Direct ctor orio io de traba rabajjo ___ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ____14 _14 Órde Órdene ness del del sist sistem emaa op oper erat ativ ivoo ___ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ _____1 __144 Prue Prueba ba de del ejem ejempl ploo de dell apa apartad rtadoo 2.1. 2.1.11 ___ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______1 ___144 Depu Depura raci ción ón y traz trazaa de prog progra rama mass ___ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______1 ___166 Ayud Ayudaa inte intera ract ctiv iva_ a____ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ _____1 __199 Hist Histor oria ial___ l______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ____19 _19 Inte Intera racc cció iónn con con Wind Window ows___ s______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______1 ___199
Referen Referencia cia de alguno algunoss predicad predicados os predefin predefinido idos__ s_________________ ______________________ _______ 19 Cont Contro roll___ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ _____1 __199 Mane Manejo jo de de la la base base de dat datos os __ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____2 __200 Entr Entrad ada/ a/Sa Sallida ida ___ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ _____2 __200 Aritmética __ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ___2 _200
3.5
Opera Operado dores res aritm aritméti éticos cos ___________________ _____________________________ ____________________ _____________20 ___20
3.6
Operad Operadore oress lógico lógicoss ____________________ ______________________________ ____________________ ________________21 ______21
4. Sicstus Pr olog ol og ____________________ ______________________________ ____________________ ____________________ _____________22 ___22
4.1
Intr Introd oduc ucci ción ón ____________________ ______________________________ ____________________ ____________________ ___________22 _22
4.2
Insta Instalac lación_____ ión_______________ ____________________ ____________________ ____________________ __________________22 ________22
4.2.1 Paso Pasoss a segu seguir ir en la inst instal alac ació ión_ n____ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ____22 _22 Edito Editor_______________________________ r_____________________________________________________ _________________________________________23 ___________________23
4.3 4.3.1 4.3.2
Trab Trabaj ajoo con con Sics Sicstu tuss Prol Prolog og ____________________ ______________________________ ____________________23 __________23 Dominios __ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____2 __233 Eje Ejemplo de traba abajo ___ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ _____2 __233
5. Suger Suger encias y avisos__________ avisos ____________________ ____________________ ____________________ __________________26 ________26
5.1
Esti Estilo lo ___________________ _____________________________ ____________________ ____________________ __________________26 ________26 Introducción Introducción a la Inteligencia Artificial Prof. L.I. Raymundo Lumbreras López
2
Universidad
del Valle de México
Campus Tlalpan, Departamento de Tecnociencias
5.2
Prec Precau auci cion ones es ________ ____________ ________ ________ ________ ________ ________ ________ ________ ________ ________ _______27 ___27
5.3
Eleg Elegan anci ciaa ________ ____________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ______27 __27
5.4
Errore Erroress conoci conocidos________________ dos__________________________ ____________________ _____________________27 ___________27
5.5
Docume Documenta ntació ción n a entreg entregar ar con las prácti prácticas cas __________________________ _____________ _____________ 27
6. Pr ácticas cti cas propues pr opuestas tas_________ ___________________ ____________________ ____________________ ___________________29 _________29
6.1
Árbol Árbol geneal genealógi ógico co ____________________ ______________________________ ____________________ _________________29 _______29
6.2
Expres Expresion iones es aritm aritméti éticas cas ____________________ ______________________________ ____________________ ____________30 __30
6.3
Intérp Intérpret retee Prolog Prolog ____________________ ______________________________ ____________________ _________________31 _______31
6.4
Trad Traduc ucto torr____________________ ______________________________ ____________________ ____________________ ______________31 ____31
7. B i bl i ogr af ía_____________________ a_______________________________ ____________________ ____________________ ______________33 ____33 8. A grade gr adecim cimii entos ____________________ ______________________________ ____________________ _____________________34 ___________34 9. Índi ce__________________ ce____________________________ ____________________ ____________________ ____________________ ____________35 __35
Introducción Introducción a la Inteligencia Artificial Prof. L.I. Raymundo Lumbreras López
3
Universidad
del Valle de México
Campus Tlalpan, Departamento de Tecnociencias
1. Prólogo La realización de estas prácticas libres es un apoyo de gran utilidad para el aprendizaje de la asignatura Programación Lógica. Por lo tanto, no es de obligada lectura, consulta o realización de las prácticas, aunque son, todas, tareas recomendables. Este manual está organizado en varios apartados que ofrecen todos los pasos necesarios para realizar las prácticas propuestas. En el apartado 2 se realiza una introducción al lenguaje Prolog desde los puntos de vista formal e informal. Con él se pretende que se conozcan los mecanismos básicos de Prolog a usar en el desarrollo de las prácticas que se irán complementando con los explicados en las clases de teoría. Por lo tanto, no es un manual autocontenido. Complementariamente, en el apartado 7 se lista la bibliografía que se ha usado para la elaboración de este manual y de la asignatura e n sí, y que se puede consultar para obtener toda la información necesaria para estas prácticas y temas avanzados. En el apartado 3 se introducen los fundamentos de SWI-Prolog, una implementación de distribución libre que se puede usar en el curso, necesarios para la realización de las prácticas que se proponen en el apartado 6. Alternativamente se puede usar la implementación de Sicstus Prolog, que se describe en el apartado 4, que aporta sobre el sistema anterior la inclusión de bibliotecas de restricciones, que se introducirán al final del curso y que se tratan en profundidad en la asignatura optativa "Programación declarativa avanzada". El inconveniente de este sistema es que necesita licencia para su uso, restringiéndo se su uso a la comunidad universitaria.
Introducción a la Inteligencia Artificial Prof. L.I. Raymundo Lumbreras López
4
Universidad
del Valle de México
Campus Tlalpan, Departamento de Tecnociencias
2. Introducción a Prolog
2.1 Introdu cción infor mal En este apartado se introduce informalmente el lenguaje de programación Prolog, siguiendo un ejemplo que se puede encontrar en Giannesini et al. (Véase la bibliografía).
2.1.1 Preliminares Prolog es un lenguaje de programación diseñado para representar y hacer uso del conocimiento sobre u n dominio particular. Este dominio es un conjunto de objetos. El conocimiento se formaliza por medio de un conjunto de relaciones que describen de forma simultánea las pro piedades de los objetos y sus interacciones. Por ejemplo, se puede expresar el menú de un restaurante como se enuncia a continuación: 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 declaración de objetos y su clasificación 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 más elemental de E/S consiste en: Entrada: Formulación 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 inglés, 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 ningún valor de las variables. Por ejemplo: ? pescado(X). entrada por el usuario: X={merluza,mero} salida del sistema: A partir de las relaciones que constituyen la base de hechos (o datos) inicial se pueden definir relaciones más complejas y generales. Por ejemplo, se puede definir la siguiente relación: plato_principal(X) :- carne(X). plato_principal(X) :- pescado(X). Esta relación, que consta de dos cláusulas, 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 cláusulas 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 sólo tienen alcance dentro de la cláusula y hacen referencia a todos los objetos del dominio (cuantificación universal). Con la incorporación de las dos reglas anteriores, se puede formular la siguiente pregunta: •
•
Introducción a la Inteligencia Artificial Prof. L.I. Raymundo Lumbreras López
5
Universidad
del Valle de México
Campus Tlalpan, Departamento de Tecnociencias ? plato_principal(ternera). cuya respuesta sería Sí. La respuesta a: ? plato_principal(X). sería: X = {ternera;cordero;merluza;mero} Se pueden incorporar al programa nuevos conocimientos en forma de reglas sobre el dominio en cuestión. 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, sería: {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 más la pregunta se pueden incorporar más 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 calórico 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 calorías 1. A la pregunta: ? calorias(X,100). el sistema responde con todos los platos de 100 calorías: X = {merluza} Se puede definir el valor calórico 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 expresión en Prolog de la operación de suma incorporada en el sistema ( is es la regla predefinida para evaluar expresiones aritméticas. En este caso hay que hacer notar que actúa como un operador infijo, al contrario del carácter prefijo de las reglas). Basándose en el valor calórico, se pueden establecer diferentes tipos de menú. Por ejemplo, un menú equilibrado es aquél que no sobrepasa las 200 calorías: menu_equilibrado(X,Y,Z) :valor_calorico(X,Y,Z,V), V =< 200. El programa completo estaría, pues, compuesto de las siguientes reglas:
1
Nótese que no se escriben acentos en los programas. Esto es una limitación de algunas implementaciones de Prolog que, como es habitual, están pensadas para el inglés y no para el resto de los idiomas. Quizás esto cambie algún día. Introducción a la Inteligencia Artificial Prof. L.I. Raymundo Lumbreras López
6
Universidad
del Valle de México
Campus Tlalpan, Departamento de Tecnociencias /* 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 Programación recursiva Con el programa del ejemplo anterior se realiza una búsqueda exhaustiva de soluciones probando de manera ordenada cada una de las reglas del programa. Este mecanismo de búsqueda está implementado en el sistema y es transparente al usuario. No obstante, se pueden p rogramar búsquedas más elaboradas usando uno de los recursos más importantes de la programación lógica: la recursividad. Por ejemplo, se puede definir el antepasado de una persona con la siguiente relación: 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 afirmación se liga la cadena de progenitores hasta alcanzar el elemento Z que la cumpla (si existe). Introducción a la Inteligencia Artificial Prof. L.I. Raymundo Lumbreras López
7
Universidad
del Valle de México
Campus Tlalpan, Departamento de Tecnociencias
2.1.3 Estructuras de datos 2.1.3.1 Té rmi nos estructu rados Los objetos de datos que se han utilizado hasta el momento en las reglas han sido objetos simples de tipo constante (los números y los átomos, que son el nombre de los objetos del programa Prolog) y variable (objetos que se escriben empezando en mayúscula). Sin embargo, Prolog permite además el uso de objetos estructurados (o simplemente estructuras) en las reglas. Las estructuras tienen diferentes componentes combinadas mediante un funt or . Por ejemplo, la fecha se puede representar por medio de la siguiente estructura: fecha(24,abril,2003).
Argumentos Funtor Los argumentos de las estructuras pueden ser a su vez estructuras. Por ejemplo, se puede definir el siguiente término: libro(el_quijote,123,fecha(2,enero,1995)) para representar el objeto libro cuyo título es el_quijote, con número 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 paréntesis. Sin embargo, Prolog permite utilizar otros operadores de forma infija y prefija. La razón 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 estándar 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 cosmética sintáctica que sólo afecta a la forma en que se presenta la estructura en la E/S. A menudo se hace referencia a los términos 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 encuen tran en la lista Cola. Para hacer explícito el segundo elemento de la lista se aplica el funtor “ .” a la lista Cola: .(Cabeza, .(Cabeza2,Cola)) Para hacer explícitos todos los elementos de una lista y mantener los dos argumentos del funtor “ .” se necesita un símbolo que represente la lista vacía. 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. También admite otra forma: [Cabeza|Cola] que es equivalente a .(Cabeza,Cola) También se permite hacer explícito más de un elemento de la cabeza: [a,b,c|Cola]
Introducción a la Inteligencia Artificial Prof. L.I. Raymundo Lumbreras López
8
Universidad
del Valle de México
Campus Tlalpan, Departamento de Tecnociencias
2.2 Introdu cción form al En este apartado se introduce formal y brevemente el lenguaje de programación Prolog, recalcando algunos conceptos vistos en el apartado anterior. No obstante, este aparta do es un breve resumen muy podado de lo que se puede encontrar en Lloyd.
2.2.1 Cláusulas de Horn Desde un punto de vista lógico, un programa Prolog está constituido por un conjunto de cláusula s de Horn. Una cláusula 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 símbolos de predicado s (relaciones lógicas) con sus argumentos entre paréntesis. A los argumentos de los predicados se les denomina términos. Las cláusulas de Horn son expresiones condicionales, siendo el símbolo “ :-” el condicional o implicación
lógica (normalmente se utiliza el símbolo “ ←”). Así, la cláusula 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 p1(t 11 ,...,t 1n1 ) y ... y es cierto p m(t m1 ,...,t mnm )
2.2.2 Hechos Cuando m=0, la cláusula no tiene parte derecha (denominada también cuerpo): p(t 1 ,t 2 ,...,t n ).
y se denomina una afirmación o hecho.
2.2.3 Consultas Cuando la cláusula no tiene parte izquierda (denominada también cabeza ), se tiene una cláusula negativa o consulta: ? p 1(t 11 ,...,t 1n1 ),...,p m(t m1 ,...,t mnm ).
que son las cláusulas con las que se realiza la entrada/salida del programa.
2.2.4 Términos Un término t i puede ser: Una constante (un número o un átomo). Una variable. Una estructura f(s1 ,s2 ,...,sn ) (o término estructurado), donde f es el funtor de la estructura, que tiene aridad (número de argumentos) n y sus argumentos si son, a su vez, términos. • • •
2.2.5 Convenios sintácticos Los símbolos o identificadores de átomos, funtores y predicados comienzan por una letra minúscula, los símbolos de variables comienzan con una letra mayúscula. No obstante, las variables también pueden empezar por un subrayado (_), en cuyo caso se denominan anónimas. Por ejemplo: _X o _x . Asimismo, los átomos también pueden empezar en mayúscula si se encierran entre comillas simples. Por ejemplo: ‘Segovia’. Cuando los identificadores están formados por más de una palabra se actuará de la siguiente manera: Para variables, cada palabra comenzará en mayúsculas. Ej: VariableMuda Para el resto, las palabras del identificador se separan con símbolos de subrayado. Ej: conflicto_de_planificación •
•
Se pueden añadir comentarios a los programas de dos formas: Un comentario en una línea va precedido por el carácter ‘ %’. Ej: % Esto es un comentario en una línea Un comentario que ocupe una o más líneas se encierra entre los símbolos de inicio y fin ‘ /*’ y ‘*/’, respectivamente. Ej: /* Esto es un comentario en varias líneas */ •
•
Introducción a la Inteligencia Artificial Prof. L.I. Raymundo Lumbreras López
9
Universidad
del Valle de México
Campus Tlalpan, Departamento de Tecnociencias Nota: dependiendo de las implementaciones se pueden admitir símbolos de inicio y fin anidados.
2.2.6 Unificación La unificación es una de las operaciones más importantes de Prolog. Es la generalización del encaje de patrones de la programación funcional con la integración de variables lógicas. El encaje de patrones consiste en la igualdad sintáctica de dos objetos. Una variable encaja con cualquier objeto, sin embargo, una constante sólo puede encajar con una constante igual u otra variable. Un término estructurado encaja con cualquier variable o con un término estructurado que posea el mismo funtor y aridad, y además se debe cumplir que encajen sus argumentos (definición 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 unificación es, pues, la generalización 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 sólo a uno (esto es lo equivalente a la operación de asignación que se realiza en el encaje de patrones). Por otra parte, y gracias a la bidireccionalidad de cómputo (se explica en el próximo apartado), es posible instanciarla a otros valores en una rama diferente del árbol de búsqueda. Es importante insistir en que, al contrario de la programación imperativa, una variable lógica se instancia con éxito a un único valor cuando se obtiene una solución. Por supuesto, si se buscan otras soluciones, la variable pu ede tomar otros valores de su dominio . Pero esto corresponde a una solución diferente. El resultado de una unificación en forma de asignaciones de variables a valores se denomina sust itución . Una sustitución es un conjunto de pares X=V, que expresa que la variable X se ha asignado al valor V.
2.2.7 Modelo de cómputo Un cómputo Prolog consiste en un proceso de resolución lineal (debido a Robinson) con unificación aplicado a una cláusula negativa o consulta y al conjunto de cláusulas que componen el programa. Así, la consulta: ? p(a,X). tendría 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 cláusulas del programa? Según el principio de resolución, para resolver el objetivo p(a,X)se intenta unificar con la parte izquierda de alguna cláusula cuya cabeza sea el mismo predicado p. Si la unificación es posible (a causa de los argumentos de la cabeza y del objetivo), se sustituye el objetivo original por la parte derecha de la cláusula utilizada en la unificación (con las sustituciones de variables que la unificación implica). El proceso continúa hasta que se obtiene la cláusula vacía (no hay más objetivos a resolver). Si se considera el siguiente programa (donde se numeran las cláusulas): 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). ? q(Y,c,a), r(f(T,b),b). ? r(f(T,b),b)
Resolviendo con 1, con la sustitución X = f(T,b) Resolviendo con 3, con la sustitución Y = c Resolviendo con 5, con la sustitución T = b
Introducción a la Inteligencia Artificial Prof. L.I. Raymundo Lumbreras López
10
Universidad
? •
del Valle de México
Campus Tlalpan, Departamento de Tecnociencias Cláusula vacía, es decir, éxito en el cómputo.
Por lo tanto, p(X,a) es cierto para la sustitución X=f(b,b), que es el resultado (salida) del cómputo que realiza Prolog. El orden de utilización de las cláusulas para resolver un objetivo es el determinado por su aparición 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 búsque da de soluciones en el programa, que se denomina búsqueda en profundidad y de izquierda a derecha ( depth-first left-to-right ). Aplicando esta estrategia para buscar una nueva solución en el programa para el objetivo p(X,a), se obtiene otra solución con sustitución de éxito X = a . Esta sustitución viene determinada por la cláusula 2 del programa, habida cuenta de que no hay otras posibilidades de unificación para los predicados r y q en el orden establecido de búsqueda.
Introducción a la Inteligencia Artificial Prof. L.I. Raymundo Lumbreras López
11
Universidad
del Valle de México
Campus Tlalpan, Departamento de Tecnociencias
3. SWI-Prolog 3.1 Introducción SWI-Prolog es una implementación del lenguaje de programación Prolog que se ejecuta bajo Windows . Se diseñó en la Universidad de Amsterdam, en el Departamento SWI ( Socia l Werke Informatik ), teniendo como objetivo disponer de una aplicación portátil y modificable. Es portátil al haberse escrito en C, y puede compilarse en diferentes sistemas; por ejemplo, en UNIX. Se ideó modificable para experimentar la relación entre la programación lógica y otros paradigmas de la programación. Por ello, su código fuente está disponible y se puede alterar para ser ajustado a las necesida des propias. No obstante su portabilidad, que limita su eficiencia en comparación con otras implementaciones comerciales, es suficientemente robusto para crear aplicaciones razonablemente complejas, además de ser un producto de distribución 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 propósitos de estas prácticas. Esta implementación no es un intérprete de Prolog, es un compilador de Prolog a un lenguaje intermedio que se encuentra entre la semántica de alto nivel de los predicados Prolog y las instrucciones máquina de la máquina sobre la que se ejecuta, o máquina soporte, basadas en microprocesadores de tipo CISC o RISC. Este lenguaje intermedio se ejecuta sobre una máquina simulada en la máquina soporte. Se puede afirmar entonces que el compilador Prolog es un traductor cruzado que produce código para una máquina que no está implementada en hardware . Esta máquina es una versión de la WAM ( Warren Abstract Machine , diseñada por D.H.D. Warren 2), que es el estándar de facto de las implementaciones Prolog. Con respecto a la sintaxis y semántica de SW I-Prolog (que, al igual que el resto de lenguajes de programación difiere para cada implementación) respeta el estándar Prolog de Edimburgo, como se describe en Clocksin y Mellish. la última versión se puede obtener en: http://www.swi-prolog.org/
3.2 Instalación Para instalar SWI-Prolog es necesario disponer de unos 3 Mb de espacio libre en disco fijo 3 en un sistema Windows. También es posible instalarlo en Linux (la conocida versión de libre distribución para PC del sistema operativo UNIX), para lo cual es necesario obtener los ejecutables de la fuente de distribución 4. En la página Web de la asignatura se puede encontrar el sistema para Windows .
3.2.1 Pasos a seguir en la instalación 1. Escoger y/o crear un directorio que vaya a contener la implementación SWI-Prolog. Por ejemplo, C:\Archivos de programa\SWIProlog. 2. Extraer los archivos de la distribución 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 instalación. Una vez realizada la instalación, 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 [Aït-Kaci] se puede encontrar una descripción legible de este diseño. Al que se le suele llamar duro, una traducción quizás incorrecta porque, si se cae, no es razonable pensar que siga funcionando. 4 Por el momento no se proporcionará más información acerca de esta versión, al no haber sido probada. 3
Introducción a la Inteligencia Artificial Prof. L.I. Raymundo Lumbreras López
12
Universidad
del Valle de México
Campus Tlalpan, Departamento de Tecnociencias
5. A continuación se introduce progman_setup., teniendo en cuenta el punto de final y que hay que pulsar INTRO. Esto provoca la generación 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 información acerca de la línea que se esté editando. Una posible elección es Edit.com, el editor estándar de la interfaz de comandos del sistema operativo, que funciona bajo Windows incluso con ratón. A diferencia de Wordpad o Bloc de notas, informa de los números de línea. 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 ratón en la ventana para trasladar el cursor o seleccionar elementos del menú hay que desactivar la casilla de verificación "Modalidad de edición rápida" en "Propiedades", que se accede pulsando con el botón derecho sobre la barra de título 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 instalación está completa y se puede empezar a trabajar con SWI-Prolog.
Introducción a la Inteligencia Artificial Prof. L.I. Raymundo Lumbreras López
13
Universidad
del Valle de México
Campus Tlalpan, Departamento de Tecnociencias
3.3 Trabajo con SWI-Prolog
3.3.1 Preliminares La forma más cómoda de trabajar con un intérprete Prolog es quizás 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 continuación 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 serán discutidos más adelante, es más cómoda la edición 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 cláusula del programa, sino de sólo 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 raíz 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 sintácticamente 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’). Nótese que ahora se necesitan las comillas puesto que los caracteres ‘:’ y ‘\’ no son válidos 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 interacción con el sistema interactivo están basados en esta sintaxis . Además del ya visto cd, tenemos: Para consultar cuál 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 sintácticas 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 cláusulas de que consta el programa. En primer lugar se introducirán las cláusulas del predicado calorias/2. A continuación se inicia SWI-Prolog, se cambia al directorio de trabajo y se consulta el programa. El sistema responde como sigue:
Introducción a la Inteligencia Artificial Prof. L.I. Raymundo Lumbreras López
14
Universidad
del Valle de México
Campus Tlalpan, Departamento de Tecnociencias
El sistema ha informado que se ha compilado satisfactoriamente el programa comidas, de 916 bytes de tamaño, en 0,00 segundos. Si, por el contrario, el programa hubiese contenido algún error como, por ejemplo, la omisión de un punto al final de la cláusula calorias(ternera,200)5, entonces se habría obtenido la siguiente respuesta:
El sistema informa que ha ocurrido un error en la línea 4 ( c:/pl/prgs/comidas.pl:4: Syntax error: Operator expected.)6. El informe de errores puede resultar confuso al principio. Con la práctica y conociendo en profundidad la sintaxis de Prolog se pueden analizar fácilmente 7. Para corregir este error se edita el programa para añadir el punto de final (no es necesario cerrar la ventana de edición) y se vuelve a guardar. A continuación se reinicia Prolog después de haber cerrado la sesión 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 sustitución de éxito que corresponde a la aplicación de la primera cláusula del predicado calorias/2. Si se desea obtener más 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 más frecuentes al empezar a programar en Prolog. Nótese la sintaxis UNIX al separar los subdirectorios con la barra de división (/) en lugar de la barra inclinada (\). 7 Por poner un caso, los errores de C son mucho más crípticos aún para programadores experimentados. 6
Introducción a la Inteligencia Artificial Prof. L.I. Raymundo Lumbreras López
15
Universidad
del Valle de México
Campus Tlalpan, Departamento de Tecnociencias X = ternera; Y = 200
A partir de aquí se pueden ir introduciendo incrementalmente los diferentes predicados del programa e ir probándolos 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 aisland o los posibles errores que aparezcan. Así, el siguiente paso sería introducir y probar el predicado plato_principal/1. Se repetiría el proceso hasta completar el programa.
3.3.5 Depuración y traza de programas Como en la mayoría de lenguajes de programación se tiene disponible la posibilidad de realizar la depuración y traza de los programas. Sin embargo, debido a las características operacionales de Prolog que lo diferencian de los lenguajes de programación 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 M odelo de bloques de procedimientos El modelo de bloques de procedimientos es una forma de representar la ejecución de un programa Prolog. Bajo este modelo, un objetivo es un bloque o caja con cuatro puerto s 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 gráfica estos puertos: Call
Exit Objetivo
Fail
Redo
Call: Es el puerto de entrada en la primera evaluación de un objetivo. Exit: Es el puerto de salida que se atraviesa cuando se satisface la ejecución de un objetivo. Fail: Es el puerto de salida que se atraviesa cuando falla la ejecución de un objetivo. Redo: Es el puerto de entrada que por el que se pasa cuando se reevalúa un objetivo (se solicita otra solución). Siguiendo el ejemplo anterior podemos plantear el objetivo: ?- plato_principal(X). De manera gráfica se obtendría 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 están etiquetados con su nombre. Las líneas discontinuas agrupan una de las cláusulas 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 cláusula del predicado plato_principal(X) . Las cajas de línea continua agrupan a un objetivo. En cada esquina entran o salen las líneas de los puertos d e entrada y salida respectivamente. Los puertos e stán 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 solución: X = ternera. Redo 2 corresponde al puerto de entrada para buscar la tercera solución de plato_principal(X). El puerto Fail del predicado plato_principal(X) se atraviesa cuando se han agotado sus cuatro soluciones.
Introducción a la Inteligencia Artificial Prof. L.I. Raymundo Lumbreras López
16
Universidad
del Valle de México
Campus Tlalpan, Departamento de Tecnociencias plato_principal(X Call ) 1-plato_principal carne(X)
Call
Exit 1
1-carne Call
Exit
Exit 2
carne(ternera).
2-carne Call carne(cordero).
Redo 1
2-plato_principal
etc...
Call
Redo 2 Fail
En la sección 3.3.5.3 se verá la forma en que se puede observar el funcionamiento del proceso de depuración y traza con un ejemplo usando los predicados que se introducen en el s iguiente apartado.
3.3.5.2 Pr edicados de depur ación y tr aza trace notrace spy(Predicado/Aridad) spy(Predicado)
nospy(Predicado/Aridad) nospy(Predicado) leash(Modo)
Activa el depurador. Desactiva el depurador. Coloca un punto espía en el predicado que se especifica como Predicado/Aridad o simplemente Predicado. El depurador en modo traza sólo se detiene en los predicados especificados. Si no se especifica ninguno se detiene en todos. Elimina el punto espía del predicado que se especifica. Especifica los puertos de parada del depurador. call: Sólo en el puerto call. redo: Sólo en el puerto redo. exit: Sólo en el puerto exit. fail: Sólo en el puerto fail. full: En todos los puertos anteriores. half: Sólo en call, redo y fail.
Sin ser estándar, SWI-Prolog ofrece otro puerto adicional: unify . Cuando el depurador se detiene en él se pueden observar las instanciaciones producidas por la unificación de la cabeza de la cláusula con el objetivo. Para observarlo se pueden usar como argumentos de leash: unify (sólo para el puerto unify) o all (para los 5 puertos).
Introducción a la Inteligencia Artificial Prof. L.I. Raymundo Lumbreras López
17
Universidad
del Valle de México
Campus Tlalpan, Departamento de Tecnociencias
3.3.5.3 Depur ación y traza del ejemplo del apar tado 2.1.1 Una vez iniciado el sistema SWI-Prolog y cargado el programa se va a iniciar la sesión de depuración a partir del objetivo plato_principal(X). Para ello se activa la traza y a continuación se emite el objetivo. Ahora se pulsa INTRO cada vez que aparezca una interrogación, y se pulsa punto y coma (;) cada vez que se alcance una solución, como se muestra en la siguiente figura.
El formato de los informes de depuración es el siguiente: Puerto : ( N ) Objetivo ? Puerto es el puerto que se está atravesando. N es un número de referencia que el depurador asigna al predicado que se está resolviendo. Objetivo es el objetivo que se está resolviendo co n las instanciaciones actuales de las variables. En este ejemplo se pueden observar claramente los puertos de entrada y salida para cad a 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 después de la interrogación se está continuando la ejecución 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 propósito añadir la consulta a la lista de consultas emitidas ( historial ), de manera análoga al historial UNIX. La manera de recuperar consultas anteriores se realiza como en UNIX (Véase 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. Además de la opción de continuar (que aparece como creep, y que corresponde a la conocida opción de depuración "paso a paso") se pueden elegir otras, como por ejemplo: s n a
skip. Impide atravesar el puerto call y continúa la traza en el puerto de salida correspondiente. Es equivalente "paso a paso por procedimientos". nodebug. Finaliza la depuración y continúa con la ejecución. abort. Finaliza la depuración y la ejecución. Introducción a la Inteligencia Artificial Prof. L.I. Raymundo Lumbreras López
18
Universidad
del Valle de México
Campus Tlalpan, Departamento de Tecnociencias
3.3.6 Ayuda interactiva La ayuda interactiva proporciona una búsqueda y examen rápidos del manual de SWI-Prolog. El manual interactivo puede mostrar las definiciones de los predicados así como secciones enteras del manual SWIProlog. Como casi siempre, el manual viene en inglés. 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 números y lo s 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 sustitución similar a csh de UNIX. Permite la composición de nuevas consultas en función 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. !número. Repetir la consulta número.
3.3.8 Interacción con Windows Es posible copiar la salida de SWI-Prolog al Portapapeles de Windows. Para ello se pueden seguir dos métodos: 1. Indicar el principio del área a copiar pulsando con el botón izquierdo del ratón, y el fin con el derecho. 2. Pulsar con el botón izquierdo del ratón y arrastrar para delimitar el área a copiar. El primer método es útil cuando el área a copiar es mayor que la ventana y es preciso desplazar el texto para encontrar el final del área. Nótese que no es necesario pulsar ninguna combinación de teclas a continuación; el simple hecho de realizar la selección implica la copia en el portapapeles.
3.4 Referencia de alguno s predicados predefinidos
3.4.1 Control halt fail
Abandona el intérprete eliminando la base de datos (pero no el programa). Este predicado siempre falla (se puede usar para realizar búsquedas exhaustivas por fallo).
8
Para obtener más información acerca de cómo recuperar entradas pasadas consúltese el apartado 2.4 del manual o emitir la consulta help(2-4) . Introducción a la Inteligencia Artificial Prof. L.I. Raymundo Lumbreras López
19
Universidad
del Valle de México
Campus Tlalpan, Departamento de Tecnociencias
3.4.2 Manejo de la base de datos Añade Cláusula al comienzo de las cláusulas del predicado correspondiente. Ej.: asserta(concatenar([],X,X)). Coloca concatenar([],X,X) como primera cláusula del predicado concatenar. assertz(Cláusula) Igual que asserta pero al final. consult(Archivo ) Añade 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 cláusulas con cabeza Predicado. retract(Cláusula) Elimina Cláusula del predicado correspondiente. Ej.: retract(concatenar([],X,X)). Elimina la cláusula concatenar([],X,X) de la base de datos. asserta(Cláusula)
3.4.3 Entrada/Salida get0(Carácter ) nl write(Término )
Lee un carácter de la corriente de entrada activa (generalmente la consola, es decir, lee del teclado) y lo almacena en Carácter . Provoca un salto de línea en pantalla. Escribe el término Término en pantalla.
3.4.4 Aritmética is Predicado infijo para evaluación de expresiones aritméticas.
3.5 Op erad o res ari tm é tic os + * / // mod ^ sqrt /\ \/ \ << >> abs sin cos tan asin acos atan exp log
Suma. Resta. Multiplicación. División. División entera. Resto de la división entera. Exponenciación. Raíz cuadrada. Complemento (operador unario). Conjunción lógica bit a bit para enteros. Disyunción lógica bit a bit para enteros. Complemento lógico bit a bit para enteros. Desplazamiento a la izquierda. Operador binario. Primer argumento: número a desplazar. Segundo argumento: número de posiciones a desplazar. Los enteros son de 27 bits. Desplazamiento a la derecha. Operador binario. Primer argumento: número a desplazar. Segundo argumento: número de posiciones a desplazar. Valor absoluto. Operador unario. Seno. Coseno. Tangente. Arcoseno. Arcocoseno. Arcotangente. Exponencial del número e. Logaritmo neperiano (en base e). Introducción a la Inteligencia Artificial Prof. L.I. Raymundo Lumbreras López
20
Universidad
del Valle de México
Campus Tlalpan, Departamento de Tecnociencias log10 Logaritmo decimal.
3.6 Operado res lógicos < > >= =< =:= =\=
Menor Mayor Mayor o igual Menor o igual Igual Distinto
Introducción a la Inteligencia Artificial Prof. L.I. Raymundo Lumbreras López
21
Universidad
del Valle de México
Campus Tlalpan, Departamento de Tecnociencias
4. Sicstus Prolog 4.1 Introducción Sicstus Prolog es una implementación del lenguaje de programación Prolog que se ejecuta bajo diferentes sistemas operativos, como UNIX, Linux y Windows. Se diseñó en el instituto sueco de informática (SICS, Swedish Institute on Computer Science), una organización investigadora independiente sin ánimo de lucro para promover el uso de las nuevas ideas y resultados provenientes de la investigación 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 académico. Es un sistema actual que adopta el estándar internacional ISO/IEC 13211-1 (PROLOG: Part 1---General Core) y se ha construido sobre un motor Prolog de alto rendimiento con generación de código nativo para procesadores Sparc. El motor Prolog, al igual que el sistema SWI, es una extensión de la máquina WAM. La versión 3.6 del sistema y su manual están disponibles en la página Web de la asignatura en varios archivos de distribución: http://www.fdi.ucm.es/profesor/fernan/PLOG/ y las últimas versiones se pueden obtener en: http://www.sics.se/sicstus/
4.2 Instalación Para instalar Sicstus Prolog es necesario disponer de unos 8 Mb de espacio libre en disco fijo además de tener instalado previamente Windows. También es posible instalarlo en otros sistemas operativos, para lo cual es necesario obtener los archivos de la fuente de distribución (http://www.sics.se/sicstus/ ). Sólo se pueden obtener versiones de evaluación por periodos de tiempo limitados. En la página Web de la asignatura se puede encontrar el sistema para Windows. La distribución 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 instalación 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 versión. Al ejecutar Sicstus Prolog se obtiene una ventana con el siguiente aspecto:
Introducción a la Inteligencia Artificial Prof. L.I. Raymundo Lumbreras López
22
Universidad
del Valle de México
Campus Tlalpan, Departamento de Tecnociencias
4.2.2 Editor Con respecto al editor se hacen los mismos comentarios que para SWI: se recomienda usar un editor con información del número de línea para resolver las referencias a los números de línea que aparecen en los informes de errores. En concreto, el manual explica cómo 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 programación lógica, se mostrarán algunos aspectos del trabajo con respecto a la programación con restricciones.
4.3.1 Dominios El tipo de dominio de las variables lógicas usadas en el contexto de la programación con restricciones define las restricciones que se pueden aplicar sobre ellas, el resolutor usado para la propagación y la posible representación del problema. Aunque muchos problemas se pueden modelar con diferentes dominios, lo más probable es que uno en concreto sea el que más se adapte a él en términos de la expresión del problema y su resolución (rendimiento). Al plantear un problema hay que decidir uno y sólo un dominio: no se pueden mezclar dominios entre sí en una misma resolución (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 decisión booleanos bastante eficiente. Véase el Capítulo 30 del manual. Dominio de los reales. Las variables pueden tomar valores reales comprendidos entre la representación mínima y máxima del sistema. En este dominio se plantean un gran número de problemas prácticos de interés 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 optimización lineal entera mixta. Véase el Capítulo 31 del manual. Dominio de los racionales. Es similar al anterior con respecto a las restricciones que se pueden plantear pero sólo se admite la representación de racionales. No alcanza el mismo grado de aplicación práctica. Se describe en el mismo capítulo. Dominio finito. Las variables pueden tomar valores enteros. El resolutor integra propagación para acotar los dominios de las variables y etiquetado para asignarles valores. Es un dominio d e gran importancia práctica para resolver problemas como planificación, horarios, empaquetado y otros en los que es característico el carácter discreto de las cantidades. Véase el Capítulo 32. •
•
•
•
4.3.2 Ejemplo de trabajo Para plantear un programa con restricciones es necesario cargar inicialmente la biblioteca del dominio finito elegido mediante: Introducción a la Inteligencia Artificial Prof. L.I. Raymundo Lumbreras López
23
Universidad
del Valle de México
Campus Tlalpan, Departamento de Tecnociencias 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 relación 2*A+3*B=C/2 se entiende como tal, no como una unificación sintáctica de términos 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 restricción. Nótese, por otra parte, que A=B no es una restricción (no es una ecuación que se env íe al resolutor) sino que es simplemente una unificación Prolog que establece que los términos (números en este caso) ligados a las variables A y B d eben ser iguales. Otro ejemplo típico es el puzzle aritmético SEND+MORE=MONEY, donde las letras representan cifras que se deben leer como cantidades que satisfacen esa ecuación. Este ejemplo se formula bien con dominios finitos. En este tipo de dominio las restricciones están 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, 1000*S + 1000*M #= 10000*M + 1000*O | D E M N O R S Y
R, Y) :+ 100*E + 10*N + D + 100*O + 10*R + E + 100*N + 10*E + Y.
?- mm([S,E,N,D,M,O,R,Y]). = 7, = 5, = 1, = 6, = 0, = 8, = 9, = 2 ?
La relación S#>0 impone que S sea estrictamente mayor que cero, una relación que se envía al resolutor (en general, las relaciones aritméticas siempre van precedidas por el símbolo 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 Introducción a la Inteligencia Artificial Prof. L.I. Raymundo Lumbreras López
24
Universidad
del Valle de México
Campus Tlalpan, Departamento de Tecnociencias
enviadas al resolutor.
Introducción a la Inteligencia Artificial Prof. L.I. Raymundo Lumbreras López
25
Universidad
del Valle de México
Campus Tlalpan, Departamento de Tecnociencias
5. Sugerencias y avisos 5.1 Estilo Aunque hay muchas propuestas sobre el estilo de programación, aquí nos centraremo s en uno de los estilos del formato de los programas. Se puede resumir en las siguientes directrices: Escribir las cabezas en una línea separada del cuerpo. Escribir los objetivos sangrados, uno en cada línea. Utilizar nombres de átomos significativos. Ej.: Factorial en lugar de Fac (que podría significar Facultad, Factoría, Facineroso, ...) 9. Agrupar las reglas del mismo predicado. Separar los predicados diferentes. Escribir comentarios acerca de la semántica pretendida para cada predicado (al menos). Escribir los datos referentes al programa como comentario en su cabecera. • • •
• • • •
Ej.: Fragmento de la práctica 1. /************************************************************************/ /* */ /* Programa: */ /* Práctica 1: Árbol genealógico. */ /* */ /* Programador: */ /* Programación Lógica */ /* */ /* Fecha: */ /* 28 de agosto de 1996 */ /* */ /* Nota: */ /* Ahora debería estar de vacaciones */ /* */ /************************************************************************/ /* Para todas las relaciones binarias de parentesco Relación(X,Y) se significa que X tiene relación de Relación con Y (Es decir, X es Relación de Y). Ej.: abuelo(X,Y) = X tiene relación de abuelo con Y = X es abuelo de Y. Para las relaciones unarias Característica(X) se significa que X tiene característica Característica (es decir, X es característica). Ej.: hombre(X) = X tiene característica 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). ... 9
No importa que sean nombres largos, hay toda una línea para escribir un átomo si se siguen las directrices anteriores. Introducción a la Inteligencia Artificial Prof. L.I. Raymundo Lumbreras López
26
Universidad
del Valle de México
Campus Tlalpan, Departamento de Tecnociencias
5.2 Precauciones Conviene tener presentes los siguientes puntos para evitar problemas añadidos en la programación: 1. Los nombres de las variables empiezan por mayúscula o por el carácter subrayado (_). 2. Los nombres de los átomos no pueden empezar por mayúscula a menos que se encuentren entre comillas simples. 3. Las reglas siempre terminan con un punto. 4. Las variables tienen alcance local a la cláusula donde se usan. 5. Aunque un programa sea sintácticamente correcto, ello no implica su validez semántica 10 (atentos a los nombres de las variables y predicados). 6. Es obligado agrupar las cláusulas por predicado. No se pueden tener cláusulas desperdigadas por todo el programa. 7. No usar puntos para separar los objetivos. Esto puede ser sintácticamente correcto en algunos casos y muy difícil 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 diseñado sin tener una idea clara del problema que se intenta resolver. Los programas elegantes son concisos, funcionan para todos los casos previstos y son fáciles 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 [O’Keefe] 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 inútiles en la depuración de los programas desgarbados. P.D. La elegancia es un signo de distin ción.
5.4 Errores cono cidos A continuación se mencionan algunos de los errores detectados en la implementación SWI-Prolog. 1. Si la última línea 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 Doc um entación a entreg ar co n las prácticas Al programa debidamente documentado, como se ha indicado en el apartado 5.1, debe acompañarle una memoria personal11 que indique el proceso de elaboración del programa. Se deben discutir las opciones elegidas y justificarlas. No se trata ahora sólo de presentar una solución al problema, sino de convencer de que es una buena solución. En definitiva hay que razonar todos los pasos que se han seguido. Es necesario incluir pruebas de la funcionalidad de la práctica que reflejen, de manera lo más exhaustiva posible, su validación 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 devalúa la calificación de la práctica; al contrario, puede mejorarla si se presenta claramente el error identificado. El esquema de la memoria debe ser el siguiente: Solución planteada, comentarios (con referencia a los errores encontrados y si se han podido resolver), validación funcional (consultas emitidas y respuestas computadas por el sistema) y listado del programa (debidamente comentado).
10 11
Como ocurre en todos los lenguajes de programación. Cada alumno debe entregar una memoria de su cosecha. Introducción a la Inteligencia Artificial Prof. L.I. Raymundo Lumbreras López
27
Universidad
del Valle de México
Campus Tlalpan, Departamento de Tecnociencias Recomendación: es mejor entregar una buena práctica incompleta a una práctica arreglada12 o sin calidad 13.
12 13
La que, sin funcionar, se pretende convencer de que es una práctica que funciona. Aquélla que contiene programas y/o documentación desgarbados. Introducción a la Inteligencia Artificial Prof. L.I. Raymundo Lumbreras López
28
Universidad
del Valle de México
Campus Tlalpan, Departamento de Tecnociencias
6. Prácticas propuestas 6.1 Árbol genealógico Objetivo: Diseño 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 genealógico):
Hecho padre(X,Y) madre(X,Y) hombre(X) mujer(X) marido(X,Y)
Significado X es padre de Y X es madre de Y X es hombre X es mujer X es marido de Y
En función de la base de datos anterior implementar las siguientes relaciones :
Relación esposa(X,Y) conyuge(X,Y) progenitor(X,Y) hijo(X,Y) hija(X,Y) vastago(X,Y) hermano(X,Y) hermana(X,Y) abuelo(X,Y) abuela(X,Y) nieto(X,Y) nieta(X,Y) ascendiente(X,Y) descendiente(X,Y) yerno(X,Y) nuera(X,Y) cunyado(X,Y) cunyada(X,Y) concunyado(X,Y) concunyada(X,Y) suegro(X,Y) suegra(X,Y)
Significado X es la esposa de Y (Y es el marido de X) X es cónyuge de Y (X es el marido o la esposa de Y) X es progenitor (padre o madre) de Y X es hijo de Y X es hija de Y X es vástago (hijo o hija) de Y X es hermano de Y X es hermana de Y X es abuelo de Y X es abuela de Y X es nieto de Y X es nieta de Y X es ascendiente (o antepasado) de Y X es descendiente (o sucesor) de Y X es yerno de Y (X es el marido de la hija de Y) X es nuera de Y (X es la esposa del hijo de Y) X es cuñado de Y (X es hermano del cónyuge de Y) X es cuñada de Y (X es hermana del cónyuge de Y) X es concuñado de Y (X es el marido de la cuñada de Y) X es concuñada de Y (X es la esposa del cuñado de Y) X es suegro de Y (X es el padre del cónyuge de Y) X es suegra de Y (X es la madre del cónyuge de Y)
Probar la corrección 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 genealógico de una persona. La respuesta construida debe ser un término. Obtener todas las relaciones existentes de una persona con el resto. Nótese que las relaciones que se deben implementar no contienen caracteres del conjunto extendido de ASCII (acentos, eñes, ...). • •
Introducción a la Inteligencia Artificial Prof. L.I. Raymundo Lumbreras López
29
Universidad
del Valle de México
Campus Tlalpan, Departamento de Tecnociencias
6.2 Ex p res io n es ari tm é tic as Objetivo: Diseño de un sistema aritmético de Peano que incluya la descripción del tipo de datos número 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 relación 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 cláusula se entiende para representar parámetros, como la a en -s(s(0))*(xa*1). c) Implementar las siguientes relaciones:
Relación sum(X,Y,Z) prod(X,Y,Z) mod(X,Y,Z) rem(X,Y,Z) fact(X,Y) pot(X,N,Y) ack(X,Y,Z)
Significado Z es la suma de X e Y Z es el producto de X e Y Z es el cociente de la división entera entre X e Y Z es el resto de la división entera entre X e Y Y es el factorial de X Y es la potencia N-ésima de X Z es el resultado de la aplicación de la función 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 mínimo común múltiplo de X e Y
d) Implementar con la relación imprimir(P) la impresión (visualización en pantalla) de polinomios sustituyendo las aplicaciones de s/1 por el número correspondiente al que representa (Ej: P = 2*(x-a*1) en lugar de -s(s(0))*(x-a*1) ). e) Implementar la evaluación de polinomios para valores de los parámetros y variables con la relación: eval(Polinomio,AsignaciónDeValores,Valor) . AsignaciónDeValores debe ser una lista con elementos de la forma t i=vi, donde t i es una variable o un parámetro 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 algún parámetro o variable sin especificar en la lista y cómo se podría solucionar? (Véase también en relación a esta pregunta el siguiente punto) f) Implementar la simplificación de polinomios. g) Implementar la relación derivada/3 y aplicar la simplificación, donde derivada(X,Y,Z) representa que Z es la derivada del polinomio X con respecto a Y. h) Implementar la relación integral/3 ¿Se puede aprovechar alguna relación anterior? ¿Qué problemas aparecen?
Introducción a la Inteligencia Artificial Prof. L.I. Raymundo Lumbreras López
30
Universidad
del Valle de México
Campus Tlalpan, Departamento de Tecnociencias
6.3 An alizado r sintáctico y traduc tor Objetivo: Diseño de un analizador sintáctico y un traductor entre dos idiomas utilizando gramáticas lógicas. Enunciado: Realizar los siguientes apartados: a) Definir una base de datos de nombres, verbos, determinantes, adjetivos y pronombres. b) Definir la relación sintagma_verbal para varios de sus casos posibles, en el que sintagma verb al pueda estar compuesto por: verbo verbo y sintagma nominal c) Definir la relación 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 relación oración que pueda analizar oraciones compuestas por sintagma nominal y sintagma verbal. Usarla para analizar (comprobar si una lista de identificadores es una oración) y generar oraciones. e) Añadir información de género, el número y la persona a los términos léxicos de la base de datos, de forma que las frases concuerden en género, número y persona. f) Añadir información semántica que asegure que las frases generadas tengan sentido (por ejemplo, [el,músico,come,una,manzana] tiene sentido, pero [el,músico,come,un,violín] no). g) Definir una base de datos léxica en la que aparezca la correspondencia entre dos idiomas para nombres, verbos, determinantes, adjetivos y pronombres. h) Definir la relación traducir/2 que tenga como objetivo realizar o comprobar la traducción de las oraciones que se proporcionen como sus argumentos. • •
• • • • •
Introducción a la Inteligencia Artificial Prof. L.I. Raymundo Lumbreras López
31
Universidad
del Valle de México
Campus Tlalpan, Departamento de Tecnociencias
6.4 Int é rp ret e de Pr o lo g Objetivo: Diseño de un intérprete Prolog dotado de depurador. Enunciado: Realizar los siguientes apartados: a) Implementar la unificación explícitamente con la relación unif(X,Y) sin occur-check . b) Implementar la unificación explícitamente con la relación unif(X,Y) con occur-check . c) Proponer una medida de la complejidad de la unificación y estudiar el rendimiento de unif/2 con varios ejemplos que se planteen. Resumir los resultados en una tabla. d) Realizar un intérprete básico de Prolog con la relación interpretar(Objetivo) , donde se haga explícita la reducción de los objetivos. e) Ampliar el apartado anterior añadiendo la unificación explícita del segundo apartado ¿En qué mejora este intérprete al estándar de Prolog? f) Añadir un argumento extra al intérprete de manera que la relación quede como interpretar(Objetivo, ModoDepuración) y que tenga como fin realizar la depuración de la reducción de Objetivo según indique ModoDepuración. Al menos debe haber un modo para indicar los puertos call (Véase el apartado 3.3.5).
Introducción a la Inteligencia Artificial Prof. L.I. Raymundo Lumbreras López
32
Universidad
del Valle de México
Campus Tlalpan, Departamento de Tecnociencias
7. Bibliografía 1. [Aït-Kaci] "The WAM: A (Real) Tutorial","Paris Research Laboratory", Informe técnico nº 5, 1990. 2. [Clocksin y Mellish] W.F. Clocksin, C.S. Mellish, “Programación 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. [O’Keefe] R.A. O’Keefe, “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.
Introducción a la Inteligencia Artificial Prof. L.I. Raymundo Lumbreras López
33
Universidad
del Valle de México
Campus Tlalpan, Departamento de Tecnociencias
8. Agradecimientos En general, se debe agradecer la labor de los investigadores en el área de programación lógica que han sabido transmitir su entusiasmo por un paradigma de la programación declarativa a través de Prolog. Es obligado agradecer al autor de la implementación SWI-Prolog, Jan Wielemaker, el hacerla disponible líbremente para aprender y experimentar con ella. Este manual recoge aportaciones de otros autores que se citan en la bibliografía y de J.J. Ruz, que proporcionó las notas del curso Sistemas de cálculo que impartió en la Faculta d de Ciencias Físicas de la UCM.
Introducción a la Inteligencia Artificial Prof. L.I. Raymundo Lumbreras López
34
Universidad
del Valle de México
Campus Tlalpan, Departamento de Tecnociencias
9. Índice -, 19
— — - (complemento), 19 - (sustracción), 19
—"—
Aritmética, 19 asin, 19 asserta, 18 assertz, 19 atan, 19 átomos, 7 Ayuda interactiva, 18
—B—
", 19
—*—
Bibliografía, 30
—C—
*, 19
—/— /, 19 /", 19 //, 19
—;— ;, 14
Call, 15 cd/1, 13 cláusula negativa, 9 consult, 13, 19 consulta, 9 Control, 18 Convenciones sintácticas, 9 copiar, 18 cos, 19 creep, 17
—^— ^, 19
—D— depth-first left-to-right , 10
—+— +, 19
—<— <, 20 <<, 19
Depuración 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
—=— =:=, 20 =<, 20 =\=, 20
—>— >, 20 >=, 20 >>, 19
—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
—A— abort, 17 abs, 19 acos, 19 afirmación, 9 Agradecimientos, 31 aridad, 9 Introducción a la Inteligencia Artificial Prof. L.I. Raymundo Lumbreras López
—F— Fail, 15 full, 16 funtor, 7, 9
35