manual de prácticas libres de programación · pdf fileprof. l.i. raymundo...

36
1 MANUAL DE PRÁCTICAS LIBRES DE PROGRAMACIÓN LÓGICA [IA] Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias Introducción a la Inteligencia Artificial Prof. L.I. Raymundo Lumbreras López

Upload: dangtuong

Post on 06-Feb-2018

256 views

Category:

Documents


36 download

TRANSCRIPT

Page 1: MANUAL DE PRÁCTICAS LIBRES DE PROGRAMACIÓN · PDF fileProf. L.I. Raymundo Lumbreras López Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias . 8 2.1.3

1

MANUAL DE PRÁCTICAS LIBRES DE

PROGRAMACIÓN LÓGICA [IA]

Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias

Introducción a la Inteligencia Artificial Prof. L.I. Raymundo Lumbreras López

Page 2: MANUAL DE PRÁCTICAS LIBRES DE PROGRAMACIÓN · PDF fileProf. L.I. Raymundo Lumbreras López Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias . 8 2.1.3

2

1. Prólogo ___________________________________________________________4

2. Introducción a Prolog _______________________________________________5

2.1 Introducción informal _____________________________________________ 52.1.1 Preliminares ___________________________________________________________52.1.2 Programación recursiva __________________________________________________72.1.3 Estructuras de datos_____________________________________________________8

2.2 Introducción formal_______________________________________________92.2.1 Cláusulas de Horn ______________________________________________________92.2.2 Hechos ______________________________________________________________92.2.3 Consultas_____________________________________________________________92.2.4 Términos _____________________________________________________________92.2.5 Convenios sintácticos ___________________________________________________92.2.6 Unificación___________________________________________________________102.2.7 Modelo de cómputo ____________________________________________________10

3. SWI-Prolog _______________________________________________________12

3.1 Introducción ___________________________________________________12

3.2 Instalación_____________________________________________________123.2.1 Pasos a seguir en la instalación____________________________________________123.2.2 Editor_______________________________________________________________13

3.3 Trabajo con SWI-Prolog __________________________________________143.3.1 Preliminares __________________________________________________________143.3.2 Directorio de trabajo ____________________________________________________143.3.3 Órdenes del sistema operativo ____________________________________________143.3.4 Prueba del ejemplo del apartado 2.1.1 _______________________________________143.3.5 Depuración y traza de programas __________________________________________163.3.6 Ayuda interactiva______________________________________________________193.3.7 Historial_____________________________________________________________193.3.8 Interacción con Windows________________________________________________19

3.4 Referencia de algunos predicados predefinidos________________________193.4.1 Control______________________________________________________________193.4.2 Manejo de la base de datos ______________________________________________203.4.3 Entrada/Salida ________________________________________________________203.4.4 Aritmética ___________________________________________________________20

3.5 Operadores aritméticos __________________________________________20

3.6 Operadores lógicos ______________________________________________21

4. Sicstus Prolog _____________________________________________________22

4.1 Introducción ___________________________________________________22

4.2 Instalación_____________________________________________________224.2.1 Pasos a seguir en la instalación____________________________________________22 Editor________________________________________________________________________23

4.3 Trabajo con Sicstus Prolog ________________________________________234.3.1 Dominios ____________________________________________________________234.3.2 Ejemplo de trabajo _____________________________________________________23

5. Sugerencias y avisos ________________________________________________26

5.1 Estilo _________________________________________________________26

Introducción a la Inteligencia Artificial Prof. L.I. Raymundo Lumbreras López

Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias

Page 3: MANUAL DE PRÁCTICAS LIBRES DE PROGRAMACIÓN · PDF fileProf. L.I. Raymundo Lumbreras López Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias . 8 2.1.3

3

5.2 Precauciones ___________________________________________________27

5.3 Elegancia ______________________________________________________27

5.4 Errores conocidos _______________________________________________27

5.5 Documentación a entregar con las prácticas __________________________27

6. Prácticas propuestas ________________________________________________29

6.1 Árbol genealógico _______________________________________________29

6.2 Expresiones aritméticas __________________________________________30

6.3 Intérprete Prolog _______________________________________________31

6.4 Traductor______________________________________________________31

7. Bibliografía_______________________________________________________33

8. Agradecimientos ___________________________________________________34

9. Índice____________________________________________________________35

Introducción a la Inteligencia Artificial Prof. L.I. Raymundo Lumbreras López

Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias

Page 4: MANUAL DE PRÁCTICAS LIBRES DE PROGRAMACIÓN · PDF fileProf. L.I. Raymundo Lumbreras López Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias . 8 2.1.3

4

1. PrólogoLa realización de estas prácticas libres es un apoyo de gran utilidad para el aprendizaje de la asignaturaProgramació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 lasprácticas propuestas. En el apartado 2 se realiza una introducción al lenguaje Prolog desde los puntos devista formal e informal. Con él se pretende que se conozcan los mecanismos básicos de Prolog a usar en eldesarrollo de las prácticas que se irán complementando con los explicados en las clases de teoría. Por lotanto, no es un manual autocontenido. Complementariamente, en el apartado 7 se lista la bibliografía quese ha usado para la elaboración de este manual y de la asignatura en sí, y que se puede consultar paraobtener toda la información necesaria para estas prácticas y temas avanzados. En el apartado 3 seintroducen los fundamentos de SWI-Prolog, una implementación de distribución libre que se puede usaren 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, queaporta sobre el sistema anterior la inclusión de bibliotecas de restricciones, que se introducirán al final delcurso y que se tratan en profundidad en la asignatura optativa "Programación declarativa avanzada". Elinconveniente de este sistema es que necesita licencia para su uso, restringiéndose su uso a la comunidaduniversitaria.

Introducción a la Inteligencia Artificial Prof. L.I. Raymundo Lumbreras López

Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias

Page 5: MANUAL DE PRÁCTICAS LIBRES DE PROGRAMACIÓN · PDF fileProf. L.I. Raymundo Lumbreras López Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias . 8 2.1.3

5

2. Introducción a Prolog

2.1 Introducción informalEn este apartado se introduce informalmente el lenguaje de programación Prolog, siguiendo un ejemploque se puede encontrar en Giannesini et al. (Véase la bibliografía).

2.1.1 PreliminaresProlog es un lenguaje de programación diseñado para representar y hacer uso del conocimiento sobre undominio particular. Este dominio es un conjunto de objetos. El conocimiento se formaliza por medio de unconjunto de relaciones que describen de forma simultánea las propiedades de los objetos y susinteracciones.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 ohechos y constituye un programa Prolog elemental. La entrada/salida (E/S) a un programa Prolog se realizamediante 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 delas variables que hacen cierta la pregunta, o bien con la respuesta No si la pregunta no se satisface paraningún 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 relacionesmá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 puedeleer 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. Lasvariables 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 siguientepregunta:

Introducción a la Inteligencia Artificial Prof. L.I. Raymundo Lumbreras López

Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias

Page 6: MANUAL DE PRÁCTICAS LIBRES DE PROGRAMACIÓN · PDF fileProf. L.I. Raymundo Lumbreras López Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias . 8 2.1.3

6

? 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) yun 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 platoprincipal 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, porejemplo:

? comida(X,Y,Z),pescado(Y).que corresponde a la solicitud al sistema de todas las comidas diferentes que tienen pescado de segundoplato.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ías1. A lapregunta:

? 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 elpostre 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 enel sistema (is es la regla predefinida para evaluar expresiones aritméticas. En este caso hay que hacernotar 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:

1Nótese que no se escriben acentos en los programas. Esto es una limitación de algunas implementacionesde Prolog que, como es habitual, están pensadas para el inglés y no para el resto de los idiomas. Quizásesto cambie algún día.

Introducción a la Inteligencia Artificial Prof. L.I. Raymundo Lumbreras López

Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias

Page 7: MANUAL DE PRÁCTICAS LIBRES DE PROGRAMACIÓN · PDF fileProf. L.I. Raymundo Lumbreras López Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias . 8 2.1.3

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 Programación recursivaCon el programa del ejemplo anterior se realiza una búsqueda exhaustiva de soluciones probando demanera ordenada cada una de las reglas del programa. Este mecanismo de búsqueda está implementado enel sistema y es transparente al usuario. No obstante, se pueden programar búsquedas más elaboradasusando uno de los recursos más importantes de la programación lógica: la recursividad. Por ejemplo, sepuede 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, Xes antepasado de Z si X es progenitor de Y e Y es antepasado de Z. Con esta última afirmación se liga lacadena 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

Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias

Page 8: MANUAL DE PRÁCTICAS LIBRES DE PROGRAMACIÓN · PDF fileProf. L.I. Raymundo Lumbreras López Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias . 8 2.1.3

8

2.1.3 Estructuras de datos

2.1.3.1 Términos estructuradosLos objetos de datos que se han utilizado hasta el momento en las reglas han sido objetos simples de tipoconstante (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 objetosestructurados (o simplemente estructuras) en las reglas. Las estructuras tienen diferentes componentescombinadas mediante un funtor. Por ejemplo, la fecha se puede representar por medio de la siguienteestructura:

fecha(24,abril,2003).

Los argumentos de las estructuras pueden ser a su vez estructuras. Por ejemplo, se puede definir elsiguiente 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 deenero de 1995.En general, el funtor de una estructura precede a los argumentos de la misma, que se encierran entreparéntesis. Sin embargo, Prolog permite utilizar otros operadores de forma infija y prefija. La razón de estaposibilidad reside en facilitar la lectura de ciertos funtores de acuerdo con su empleo tradicional. Porejemplo, si se utiliza el operador de la suma como funtor de una estructura que representa la suma de dosexpresiones, en la forma estándar de Prolog se tiene:

+(A,B)En cambio, en la forma tradicional infija se tiene:

A+BSi bien conviene insistir en que se trata tan solo de un asunto de cosmética sintáctica que sólo afecta a laforma 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 suaridad, como, por ejemplo, fecha/3.

2.1.3.2 ListasUn tipo especial de funtor de dos argumentos se utiliza en Prolog para representar las listas (secuenciaordinaria de objetos). Así:

.(Cabeza,Cola)representa una lista cuyo primer elemento es Cabeza y los restantes elementos se encuentran en la listaCola. 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 “.” senecesita 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 yseparando 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]

Argumentos

Funtor

Introducción a la Inteligencia Artificial Prof. L.I. Raymundo Lumbreras López

Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias

Page 9: MANUAL DE PRÁCTICAS LIBRES DE PROGRAMACIÓN · PDF fileProf. L.I. Raymundo Lumbreras López Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias . 8 2.1.3

9

2.2 Introducción formalEn este apartado se introduce formal y brevemente el lenguaje de programación Prolog, recalcandoalgunos conceptos vistos en el apartado anterior. No obstante, este apartado es un breve resumen muypodado de lo que se puede encontrar en Lloyd.

2.2.1 Cláusulas de HornDesde un punto de vista lógico, un programa Prolog está constituido por un conjunto de cláusulas deHorn. Una cláusula de Horn tiene la forma general:

p(t1,t2,...,tn) :- p1(t11,...,t1n1),...,pm(tm1,...,tmnm).donde m,n ≥ 0 y p, p1, ..., pm son símbolos de predicados (relaciones lógicas) con sus argumentos entreparé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ónlógica (normalmente se utiliza el símbolo “←”). Así, la cláusula anterior se puede leer de la siguiente forma:

Si p1(t11,...,t1n1) y ... y pm(tm1,...,tmnm) entonces p(t1,t2,...,tn).O bien:

Es cierto p(t1,t2,...,tn) si es cierto p1(t11,...,t1n1) y ... y es cierto pm(tm1,...,tmnm)

2.2.2 HechosCuando m=0, la cláusula no tiene parte derecha (denominada también cuerpo):

p(t1,t2,...,tn).y se denomina una afirmación o hecho.

2.2.3 ConsultasCuando la cláusula no tiene parte izquierda (denominada también cabeza), se tiene una cláusula negativa oconsulta:

? p1(t11,...,t1n1),...,pm(tm1,...,tmnm).que son las cláusulas con las que se realiza la entrada/salida del programa.

2.2.4 TérminosUn término ti 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ácticosLos símbolos o identificadores de átomos, funtores y predicados comienzan por una letra minúscula, lossímbolos de variables comienzan con una letra mayúscula. No obstante, las variables también puedenempezar 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

Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias

Page 10: MANUAL DE PRÁCTICAS LIBRES DE PROGRAMACIÓN · PDF fileProf. L.I. Raymundo Lumbreras López Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias . 8 2.1.3

10

Nota: dependiendo de las implementaciones se pueden admitir símbolos de inicio y fin anidados.

2.2.6 UnificaciónLa unificación es una de las operaciones más importantes de Prolog. Es la generalización del encaje depatrones de la programación funcional con la integración de variables lógicas. El encaje de patronesconsiste 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 encajacon cualquier variable o con un término estructurado que posea el mismo funtor y aridad, y además sedebe 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 ResultadoX a Éxito, con X=aa b FalloX f(a) Éxito, con X=f(a)f(a) f(a) Éxitof(a) s(a) Fallof(a) f(b) Fallo

La unificación es, pues, la generalización de este concepto. Por una parte, permite que una variable sepueda instanciar (o, lo que es igual, asignar una sola vez) a un valor y sólo a uno (esto es lo equivalente ala operación de asignación que se realiza en el encaje de patrones). Por otra parte, y gracias a labidireccionalidad de cómputo (se explica en el próximo apartado), es posible instanciarla a otros valoresen una rama diferente del árbol de búsqueda. Es importante insistir en que, al contrario de la programaciónimperativa, una variable lógica se instancia con éxito a un único valor cuando se obtiene una solución. Porsupuesto, si se buscan otras soluciones, la variable puede tomar otros valores de su dominio. Pero estocorresponde a una solución diferente.El resultado de una unificación en forma de asignaciones de variables a valores se denomina sustitució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ómputoUn cómputo Prolog consiste en un proceso de resolución lineal (debido a Robinson) con unificaciónaplicado a una cláusula negativa o consulta y al conjunto de cláusulas que componen el programa. Así, laconsulta:

? 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 izquierdade alguna cláusula cuya cabeza sea el mismo predicado p. Si la unificación es posible (a causa de losargumentos de la cabeza y del objetivo), se sustituye el objetivo original por la parte derecha de la cláusulautilizada en la unificación (con las sustituciones de variables que la unificación implica). El procesocontinú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). Resolviendo con 1, con la sustitución X = f(T,b)? q(Y,c,a), r(f(T,b),b). Resolviendo con 3, con la sustitución Y = c? r(f(T,b),b) Resolviendo con 5, con la sustitución T = b

Introducción a la Inteligencia Artificial Prof. L.I. Raymundo Lumbreras López

Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias

Page 11: MANUAL DE PRÁCTICAS LIBRES DE PROGRAMACIÓN · PDF fileProf. L.I. Raymundo Lumbreras López Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias . 8 2.1.3

11

? • 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ómputoque realiza Prolog.El orden de utilización de las cláusulas para resolver un objetivo es el determinado por su aparición en elprograma. Cuando el objetivo se compone de varios subobjetivos se intenta resolver de izquierda aderecha. Ésta es una de las posibles alternativas de búsqueda de soluciones en el programa, que sedenomina 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), seobtiene otra solución con sustitución de éxito X = a. Esta sustitución viene determinada por la cláusula 2del programa, habida cuenta de que no hay otras posibilidades de unificación para los predicados r y qen el orden establecido de búsqueda.

Introducción a la Inteligencia Artificial Prof. L.I. Raymundo Lumbreras López

Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias

Page 12: MANUAL DE PRÁCTICAS LIBRES DE PROGRAMACIÓN · PDF fileProf. L.I. Raymundo Lumbreras López Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias . 8 2.1.3

12

3. SWI-Prolog

3.1 IntroducciónSWI-Prolog es una implementación del lenguaje de programación Prolog que se ejecuta bajo Windows. Sediseñó en la Universidad de Amsterdam, en el Departamento SWI (Social Werke Informatik), teniendocomo objetivo disponer de una aplicación portátil y modificable. Es portátil al haberse escrito en C, ypuede compilarse en diferentes sistemas; por ejemplo, en UNIX. Se ideó modificable para experimentar larelación entre la programación lógica y otros paradigmas de la programación. Por ello, su código fuenteestá disponible y se puede alterar para ser ajustado a las necesidades propias.No obstante su portabilidad, que limita su eficiencia en comparación con otras implementacionescomerciales, es suficientemente robusto para crear aplicaciones razonablemente complejas, además de serun producto de distribución libre (y, por tanto, gratuito). Ésta la causa por la que no se dispone de unentorno de desarrollo tan elaborado como otras aplicaciones comerciales, pero suficiente para lospropósitos de estas prácticas.Esta implementación no es un intérprete de Prolog, es un compilador de Prolog a un lenguaje intermedioque se encuentra entre la semántica de alto nivel de los predicados Prolog y las instrucciones máquina dela máquina sobre la que se ejecuta, o máquina soporte, basadas en microprocesadores de tipo CISC oRISC. Este lenguaje intermedio se ejecuta sobre una máquina simulada en la máquina soporte. Se puedeafirmar entonces que el compilador Prolog es un traductor cruzado que produce código para una máquinaque no está implementada en hardware. Esta máquina es una versión de la WAM (Warren AbstractMachine, diseñada por D.H.D. Warren2), que es el estándar de facto de las implementaciones Prolog.Con respecto a la sintaxis y semántica de SWI-Prolog (que, al igual que el resto de lenguajes deprogramación difiere para cada implementación) respeta el estándar Prolog de Edimburgo, como sedescribe en Clocksin y Mellish.

la última versión se puede obtener en:http://www.swi-prolog.org/

3.2 InstalaciónPara instalar SWI-Prolog es necesario disponer de unos 3 Mb de espacio libre en disco fijo3 en un sistemaWindows. También es posible instalarlo en Linux (la conocida versión de libre distribución para PC delsistema operativo UNIX), para lo cual es necesario obtener los ejecutables de la fuente de distribución4.En la página Web de la asignatura se puede encontrar el sistema para Windows.

3.2.1 Pasos a seguir en la instalación1. 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:

2En [Aït-Kaci] se puede encontrar una descripción legible de este diseño.3Al que se le suele llamar duro, una traducción quizás incorrecta porque, si se cae, no es razonable pensarque siga funcionando.4Por el momento no se proporcionará más información acerca de esta versión, al no haber sido probada.

Introducción a la Inteligencia Artificial Prof. L.I. Raymundo Lumbreras López

Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias

Page 13: MANUAL DE PRÁCTICAS LIBRES DE PROGRAMACIÓN · PDF fileProf. L.I. Raymundo Lumbreras López Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias . 8 2.1.3

13

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 elejecutable SWI-Prolog.

3.2.2 EditorSe puede usar cualquier editor para editar los programas Prolog. Sin embargo, es recomendable usar unoque proporcione información acerca de la línea que se esté editando. Una posible elección es Edit.com, eleditor estándar de la interfaz de comandos del sistema operativo, que funciona bajo Windows incluso conrató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 aEdit.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 seleccionarelementos 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 debetomar 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á aleditor 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

Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias

Page 14: MANUAL DE PRÁCTICAS LIBRES DE PROGRAMACIÓN · PDF fileProf. L.I. Raymundo Lumbreras López Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias . 8 2.1.3

14

3.3 Trabajo con SWI-Prolog

3.3.1 PreliminaresLa forma más cómoda de trabajar con un intérprete Prolog es quizás usar el editor para crear y modificar elprograma en lugar de trabajar directamente con la base de datos. Con el primer procedimiento se edita elprograma y a continuación se debe cargar en la base de datos. Con el segundo procedimiento se debenintroducir una a una las relaciones del programa con los predicados predefinidos tipo assert, y paraborrarlas es necesarios usar los predicados del tipo retract. Aunque ambos serán discutidos másadelante, es más cómoda la edición de todo el programa seguido del borrado de la base de datos y lanueva consulta de todo el programa. Borrar la base de datos no es una tarea obvia, por ello se recomiendael 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 trabajoEl directorio predeterminado de trabajo es c:, que corresponde al directorio raíz c:\. Es posible cambiareste directorio con el predicado cd/1. Su argumento es el directorio al que se desea cambiar. Es necesarioponer este directorio entre comillas simples (’) si contiene un nombre que no es sintácticamente correctocomo á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 escribirun átomo.Si se desea cambiar de unidad se puede hacer con el mismo predicado. Por ejemplo:?- cd(’d:’).

3.3.3 Órdenes del sistema operativoSWI-Prolog acoge la sintaxis de las órdenes UNIX. Por ello, los predicados de interacción con el sistemainteractivo 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.1Siguiendo el texto del apartado 2.1.1, se van a introducir de manera incremental en el archivocomidas.pl las diferentes cláusulas de que consta el programa. En primer lugar se introducirán lascláusulas del predicado calorias/2. A continuación se inicia SWI-Prolog, se cambia al directorio detrabajo y se consulta el programa. El sistema responde como sigue:

Introducción a la Inteligencia Artificial Prof. L.I. Raymundo Lumbreras López

Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias

Page 15: MANUAL DE PRÁCTICAS LIBRES DE PROGRAMACIÓN · PDF fileProf. L.I. Raymundo Lumbreras López Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias . 8 2.1.3

15

El sistema ha informado que se ha compilado satisfactoriamente el programa comidas, de 916 bytes detamaño, en 0,00 segundos. Si, por el contrario, el programa hubiese contenido algún error como, porejemplo, la omisión de un punto al final de la cláusula calorias(ternera,200)5, entonces se habríaobtenido la siguiente respuesta:

El sistema informa que ha ocurrido un error en la línea 4 (c:/pl/prgs/comidas.pl:4: Syntaxerror: Operator expected.)6. El informe de errores puede resultar confuso al principio. Con lapráctica y conociendo en profundidad la sintaxis de Prolog se pueden analizar fácilmente7.Para corregir este error se edita el programa para añadir el punto de final (no es necesario cerrar la ventanade edición) y se vuelve a guardar. A continuación se reinicia Prolog después de haber cerrado la sesiónanterior con el predicado halt/0. Se consulta el programa y, cuando se hayan corregido otros posibleserrores, se puede realizar una consulta como:

?- calorias(X,Y).

X = ensaladaY = 30

donde se ha obtenido la sustitución de éxito que corresponde a la aplicación de la primera cláusula delpredicado calorias/2. Si se desea obtener más soluciones se debe pulsar el punto y coma (;).

?- calorias(X,Y).

X = ensaladaY = 30;

X = sopaY = 60;

5Éste es uno de los errores más frecuentes al empezar a programar en Prolog.6Nótese la sintaxis UNIX al separar los subdirectorios con la barra de división (/) en lugar de la barrainclinada (\).7Por poner un caso, los errores de C son mucho más crípticos aún para programadores experimentados.

Introducción a la Inteligencia Artificial Prof. L.I. Raymundo Lumbreras López

Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias

Page 16: MANUAL DE PRÁCTICAS LIBRES DE PROGRAMACIÓN · PDF fileProf. L.I. Raymundo Lumbreras López Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias . 8 2.1.3

16

X = ternera;Y = 200

A partir de aquí se pueden ir introduciendo incrementalmente los diferentes predicados del programa e irprobándolos en el orden del apartado 2.1.1 hasta llegar al programa completo. Es importante al principiohacer este proceso paso a paso para ir aislando los posibles errores que aparezcan. Así, el siguiente pasosería introducir y probar el predicado plato_principal/1. Se repetiría el proceso hasta completar elprograma.

3.3.5 Depuración y traza de programasComo en la mayoría de lenguajes de programación se tiene disponible la posibilidad de realizar ladepuración y traza de los programas. Sin embargo, debido a las características operacionales de Prolog quelo diferencian de los lenguajes de programación imperativa, es necesario introducir el concepto de lospuertos de entrada y salida de los predicados, que forma parte del denominado modelo de bloques deprocedimientos.

3.3.5.1 Modelo de bloques de procedimientosEl 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 puertos de acceso que pueden serobservables para el programador que depure un programa. Dos son de entrada (Call y Redo) y otros dosde salida (Exit y Fail). En la siguiente figura se muestran de manera gráfica estos puertos:

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 otrasolució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 controlde flujo del programa, y las cajas o bloques, los procedimientos que se van a resolver. Los puertos deentrada 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 ordentextual en el que aparecen en el programa (Ej.: 1-plato_principal es la primera cláusula delpredicado plato_principal(X). Las cajas de línea continua agrupan a un objetivo. En cada esquinaentran o salen las líneas de los puertos de entrada y salida respectivamente. Los puertos están numeradospara distinguir el momento en el que se atraviesan. Por ejemplo, Exit 1 corresponde al puerto de salida deplato_principal(X) para su primera solución: X = ternera. Redo 2 corresponde al puerto de entradapara buscar la tercera solución de plato_principal(X). El puerto Fail del predicadoplato_principal(X)se atraviesa cuando se han agotado sus cuatro soluciones.

ObjetivoCall

Fail

Exit

Redo

Introducción a la Inteligencia Artificial Prof. L.I. Raymundo Lumbreras López

Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias

Page 17: MANUAL DE PRÁCTICAS LIBRES DE PROGRAMACIÓN · PDF fileProf. L.I. Raymundo Lumbreras López Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias . 8 2.1.3

17

En la sección 3.3.5.3 se verá la forma en que se puede observar el funcionamiento del proceso dedepuración y traza con un ejemplo usando los predicados que se introducen en el siguiente apartado.

3.3.5.2 Predicados de depuración y traza

trace Activa el depurador.notrace Desactiva el depurador.spy(Predicado/Aridad)spy(Predicado)

Coloca un punto espía en el predicado que se especifica comoPredicado/Aridad o simplemente Predicado. El depuradoren modo traza sólo se detiene en los predicados especificados. Si nose especifica ninguno se detiene en todos.

nospy(Predicado/Aridad)nospy(Predicado)

Elimina el punto espía del predicado que se especifica.

leash(Modo) 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 sepueden observar las instanciaciones producidas por la unificación de la cabeza de la cláusula con elobjetivo. Para observarlo se pueden usar como argumentos de leash: unify (sólo para el puerto unify)o all (para los 5 puertos).

plato_principal(X)

2-plato_principal

1-plato_principalcarne(X)1-carne

carne(ternera).

carne(cordero).

2-carne

Exit 1

Exit 2Exit

Call

Call

Call

Call

Redo 2

Redo 1

Calletc...

Fail

Introducción a la Inteligencia Artificial Prof. L.I. Raymundo Lumbreras López

Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias

Page 18: MANUAL DE PRÁCTICAS LIBRES DE PROGRAMACIÓN · PDF fileProf. L.I. Raymundo Lumbreras López Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias . 8 2.1.3

18

3.3.5.3 Depuración y traza del ejemplo del apartado 2.1.1Una vez iniciado el sistema SWI-Prolog y cargado el programa se va a iniciar la sesión de depuración apartir del objetivo plato_principal(X). Para ello se activa la traza y a continuación se emite elobjetivo. Ahora se pulsa INTRO cada vez que aparezca una interrogación, y se pulsa punto y coma (;) cadavez 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 alpredicado que se está resolviendo. Objetivo es el objetivo que se está resolviendo con lasinstanciaciones actuales de las variables.En este ejemplo se pueden observar claramente los puertos de entrada y salida para cada objetivo salvo elpuerto fail del objetivo inicial, que no lo muestra el depurador, al igual que no muestra su puerto deentrada call.Al pulsar INTRO después de la interrogación se está continuando la ejecución del objetivo. Sin embargo, elprimer objetivo que se resuelve es rl_add_history. Éste es un objetivo del sistema SWI-Prolog quese ejecuta cada vez que se emite una consulta, y tiene como propósito añadir la consulta a la lista deconsultas emitidas (historial), de manera análoga al historial UNIX. La manera de recuperar consultasanteriores 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 claracorrespondencia 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 dedepuración "paso a paso") se pueden elegir otras, como por ejemplo:

s skip. Impide atravesar el puerto call y continúa la traza en el puerto de salida correspondiente. Esequivalente "paso a paso por procedimientos".

n nodebug. Finaliza la depuración y continúa con la ejecución.a abort. Finaliza la depuración y la ejecución.

Introducción a la Inteligencia Artificial Prof. L.I. Raymundo Lumbreras López

Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias

Page 19: MANUAL DE PRÁCTICAS LIBRES DE PROGRAMACIÓN · PDF fileProf. L.I. Raymundo Lumbreras López Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias . 8 2.1.3

19

3.3.6 Ayuda interactivaLa ayuda interactiva proporciona una búsqueda y examen rápidos del manual de SWI-Prolog. El manualinteractivo puede mostrar las definiciones de los predicados así como secciones enteras del manual SWI-Prolog. 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 los

subapartados se separan con guiones. Ej.: ?- help(2-3). Muestra el apartado 2.3 Online Help.

3.3.7 HistorialSWI-Prolog ofrece un mecanismo de sustitución similar a csh de UNIX. Permite la composición de nuevasconsultas en función de las emitidas anteriormente. Por ejemplo8.:

!!. 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 WindowsEs posible copiar la salida de SWI-Prolog al Portapapeles de Windows. Para ello se pueden seguir dosmé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 textopara encontrar el final del área. Nótese que no es necesario pulsar ninguna combinación de teclas acontinuación; el simple hecho de realizar la selección implica la copia en el portapapeles.

3.4 Referencia de algunos predicados predefinidos

3.4.1 Controlhalt Abandona el intérprete eliminando la base de datos (pero no el programa).fail Este predicado siempre falla (se puede usar para realizar búsquedas exhaustivas por fallo).

8Para obtener más información acerca de cómo recuperar entradas pasadas consúltese el apartado 2.4 del manual oemitir la consulta help(2-4).

Introducción a la Inteligencia Artificial Prof. L.I. Raymundo Lumbreras López

Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias

Page 20: MANUAL DE PRÁCTICAS LIBRES DE PROGRAMACIÓN · PDF fileProf. L.I. Raymundo Lumbreras López Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias . 8 2.1.3

20

3.4.2 Manejo de la base de datosasserta(Cláusula) 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 predicadoconcatenar.

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.

3.4.3 Entrada/Salidaget0(Carácter) Lee un carácter de la corriente de entrada activa (generalmente la consola, es decir,

lee del teclado) y lo almacena en Carácter.nl Provoca un salto de línea en pantalla.write(Término) Escribe el término Término en pantalla.

3.4.4 Aritméticais Predicado infijo para evaluación de expresiones aritméticas.

3.5 Operadores aritméticos+ Suma.- Resta.* Multiplicación./ División.// División entera.mod Resto de la división entera.^ Exponenciación.sqrt 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.abs Valor absoluto. Operador unario.sin Seno.cos Coseno.tan Tangente.asin Arcoseno.acos Arcocoseno.atan Arcotangente.exp Exponencial del número e.log Logaritmo neperiano (en base e).

Introducción a la Inteligencia Artificial Prof. L.I. Raymundo Lumbreras López

Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias

Page 21: MANUAL DE PRÁCTICAS LIBRES DE PROGRAMACIÓN · PDF fileProf. L.I. Raymundo Lumbreras López Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias . 8 2.1.3

21

log10 Logaritmo decimal.

3.6 Operadores 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

Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias

Page 22: MANUAL DE PRÁCTICAS LIBRES DE PROGRAMACIÓN · PDF fileProf. L.I. Raymundo Lumbreras López Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias . 8 2.1.3

22

4. Sicstus Prolog

4.1 IntroducciónSicstus Prolog es una implementación del lenguaje de programación Prolog que se ejecuta bajo diferentessistemas 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 lucropara promover el uso de las nuevas ideas y resultados provenientes de la investigación en la industria y lasociedad en general. Aunque originalmente fue distribuido gratuitamente, actualmente es un sistemacomercial 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---GeneralCore) y se ha construido sobre un motor Prolog de alto rendimiento con generación de código nativo paraprocesadores 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 variosarchivos 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ónPara instalar Sicstus Prolog es necesario disponer de unos 8 Mb de espacio libre en disco fijo además detener instalado previamente Windows. También es posible instalarlo en otros sistemas operativos, para locual 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 periodosde tiempo limitados. En la página Web de la asignatura se puede encontrar el sistema para Windows. Ladistribució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ónEjecutar el archivo sp3w32.exe y seguir las instrucciones en pantalla. Se obtendrá un grupo deprogramas que contiene el acceso directo al programa como consola DOS (Sicstus Prolog (console)) ocomo ventana Windows (Sicstus Prolog), siendo esta última la que se usará habitualmente, la ayuda delprograma y las notas de la versión. Al ejecutar Sicstus Prolog se obtiene una ventana con el siguienteaspecto:

Introducción a la Inteligencia Artificial Prof. L.I. Raymundo Lumbreras López

Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias

Page 23: MANUAL DE PRÁCTICAS LIBRES DE PROGRAMACIÓN · PDF fileProf. L.I. Raymundo Lumbreras López Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias . 8 2.1.3

23

4.2.2 EditorCon respecto al editor se hacen los mismos comentarios que para SWI: se recomienda usar un editor coninformación del número de línea para resolver las referencias a los números de línea que aparecen en losinformes de errores. En concreto, el manual explica cómo instalar y usar Emacs.

4.3 Trabajo con Sicstus PrologEn 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 DominiosEl tipo de dominio de las variables lógicas usadas en el contexto de la programación con restriccionesdefine las restricciones que se pueden aplicar sobre ellas, el resolutor usado para la propagación y laposible representación del problema. Aunque muchos problemas se pueden modelar con diferentesdominios, lo más probable es que uno en concreto sea el que más se adapte a él en términos de laexpresión del problema y su resolución (rendimiento). Al plantear un problema hay que decidir uno y sóloun dominio: no se pueden mezclar dominios entre sí en una misma resolución (salvo el caso especial de losreales 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 deproblemas prácticos de interés y se resuelven con gran eficacia. Puede resolver restricciones linealesy retrasar las no lineales hasta que eventualmente se conviertan en lineales. Admite combinarvariables reales con enteras para resolver problemas de optimización lineal entera mixta. Véase elCapítulo 31 del manual.

• Dominio de los racionales. Es similar al anterior con respecto a las restricciones que se puedenplantear pero sólo se admite la representación de racionales. No alcanza el mismo grado de aplicaciónpráctica. Se describe en el mismo capítulo.

• Dominio finito. Las variables pueden tomar valores enteros. El resolutor integra propagación paraacotar los dominios de las variables y etiquetado para asignarles valores. Es un dominio de granimportancia práctica para resolver problemas como planificación, horarios, empaquetado y otros enlos que es característico el carácter discreto de las cantidades. Véase el Capítulo 32.

4.3.2 Ejemplo de trabajoPara plantear un programa con restricciones es necesario cargar inicialmente la biblioteca del dominio finitoelegido mediante:

Introducción a la Inteligencia Artificial Prof. L.I. Raymundo Lumbreras López

Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias

Page 24: MANUAL DE PRÁCTICAS LIBRES DE PROGRAMACIÓN · PDF fileProf. L.I. Raymundo Lumbreras López Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias . 8 2.1.3

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 eneste 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 comoocurre en Prolog; es decir, el doble del valor de A sumado al triple del valor de B debe ser igual a la mitaddel valor de C, independientemente de si se puede comprobar o calcular en el momento en que se planteala restricción. Nótese, por otra parte, que A=B no es una restricción (no es una ecuación que se envíe alresolutor) sino que es simplemente una unificación Prolog que establece que los términos (números eneste caso) ligados a las variables A y B deben ser iguales.

Otro ejemplo típico es el puzzle aritmético SEND+MORE=MONEY, donde las letras representan cifras quese deben leer como cantidades que satisfacen esa ecuación. Este ejemplo se formula bien con dominiosfinitos. En este tipo de dominio las restricciones están caracterizadas por su forma (el nombre delpredicado usado y los operadores que intervienen), en lugar de delimitarse entre llaves como en el casoanterior.

:- 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 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 predicadopredefinido all_different impone que las variables que son su argumento deben ser distintasentre 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

Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias

Page 25: MANUAL DE PRÁCTICAS LIBRES DE PROGRAMACIÓN · PDF fileProf. L.I. Raymundo Lumbreras López Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias . 8 2.1.3

25

enviadas al resolutor.

Introducción a la Inteligencia Artificial Prof. L.I. Raymundo Lumbreras López

Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias

Page 26: MANUAL DE PRÁCTICAS LIBRES DE PROGRAMACIÓN · PDF fileProf. L.I. Raymundo Lumbreras López Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias . 8 2.1.3

26

5. Sugerencias y avisos

5.1 EstiloAunque hay muchas propuestas sobre el estilo de programación, aquí nos centraremos en uno de losestilos 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.

9No importa que sean nombres largos, hay toda una línea para escribir un átomo si se siguen las directricesanteriores.

/************************************************************************//* *//* 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) sesignifica que X tiene relación de Relación con Y (Es decir, X es Relaciónde 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 tienecaracterí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)....

Introducción a la Inteligencia Artificial Prof. L.I. Raymundo Lumbreras López

Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias

Page 27: MANUAL DE PRÁCTICAS LIBRES DE PROGRAMACIÓN · PDF fileProf. L.I. Raymundo Lumbreras López Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias . 8 2.1.3

27

5.2 PrecaucionesConviene 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ántica10 (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 EleganciaComo nota final, hay que insistir en que un programa Prolog complicado probablemente equivalga a unprograma que se ha diseñado sin tener una idea clara del problema que se intenta resolver. Los programaselegantes 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 puedeentender (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 deperder horas inútiles en la depuración de los programas desgarbados.P.D. La elegancia es un signo de distinción.

5.4 Errores conocidosA 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 Documentación a entregar con las prácticas

Al programa debidamente documentado, como se ha indicado en el apartado 5.1, debe acompañarle unamemoria personal11 que indique el proceso de elaboración del programa. Se deben discutir las opcioneselegidas y justificarlas. No se trata ahora sólo de presentar una solución al problema, sino de convencer deque 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 exhaustivaposible, su validación funcional. Es decir, incluir el conjunto de consultas con las respuestas obtenidasque 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 loserrores encontrados y si se han podido resolver), validación funcional (consultas emitidas y respuestascomputadas por el sistema) y listado del programa (debidamente comentado).

10Como ocurre en todos los lenguajes de programación.11 Cada alumno debe entregar una memoria de su cosecha.

Introducción a la Inteligencia Artificial Prof. L.I. Raymundo Lumbreras López

Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias

Page 28: MANUAL DE PRÁCTICAS LIBRES DE PROGRAMACIÓN · PDF fileProf. L.I. Raymundo Lumbreras López Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias . 8 2.1.3

28

Recomendación: es mejor entregar una buena práctica incompleta a una práctica arreglada12 o sincalidad13.

12 La que, sin funcionar, se pretende convencer de que es una práctica que funciona.13Aquélla que contiene programas y/o documentación desgarbados.

Introducción a la Inteligencia Artificial Prof. L.I. Raymundo Lumbreras López

Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias

Page 29: MANUAL DE PRÁCTICAS LIBRES DE PROGRAMACIÓN · PDF fileProf. L.I. Raymundo Lumbreras López Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias . 8 2.1.3

29

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 Significadopadre(X,Y) X es padre de Ymadre(X,Y) X es madre de Yhombre(X) X es hombremujer(X) X es mujermarido(X,Y) X es marido de Y

En función de la base de datos anterior implementar las siguientes relaciones:

Relación Significadoesposa(X,Y) X es la esposa de Y (Y es el marido de X)conyuge(X,Y) X es cónyuge de Y (X es el marido o la esposa de Y)progenitor(X,Y) X es progenitor (padre o madre) de Yhijo(X,Y) X es hijo de Yhija(X,Y) X es hija de Yvastago(X,Y) X es vástago (hijo o hija) de Yhermano(X,Y) X es hermano de Yhermana(X,Y) X es hermana de Yabuelo(X,Y) X es abuelo de Yabuela(X,Y) X es abuela de Ynieto(X,Y) X es nieto de Ynieta(X,Y) X es nieta de Yascendiente(X,Y) X es ascendiente (o antepasado) de Ydescendiente(X,Y) X es descendiente (o sucesor) de Yyerno(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 cuñado de Y (X es hermano del cónyuge de Y)cunyada(X,Y) X es cuñada de Y (X es hermana del cónyuge de Y)concunyado(X,Y) X es concuñado de Y (X es el marido de la cuñada de Y)concunyada(X,Y) X es concuñada de Y (X es la esposa del cuñado de Y)suegro(X,Y) X es suegro de Y (X es el padre del cónyuge de Y)suegra(X,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 deASCII (acentos, eñes, ...).

Introducción a la Inteligencia Artificial Prof. L.I. Raymundo Lumbreras López

Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias

Page 30: MANUAL DE PRÁCTICAS LIBRES DE PROGRAMACIÓN · PDF fileProf. L.I. Raymundo Lumbreras López Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias . 8 2.1.3

30

6.2 Expresiones aritméticas

Objetivo:Diseño de un sistema aritmético de Peano que incluya la descripción del tipo de datos número natural yvarias 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))*(x-a*1).

c) Implementar las siguientes relaciones:

Relación Significadosum(X,Y,Z) Z es la suma de X e Yprod(X,Y,Z) Z es el producto de X e Ymod(X,Y,Z) Z es el cociente de la división entera entre X e Yrem(X,Y,Z) Z es el resto de la división entera entre X e Yfact(X,Y) Y es el factorial de Xpot(X,N,Y) Y es la potencia N-ésima de Xack(X,Y,Z) 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+1ackermann(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 polinomiossustituyendo 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 ti=vi, donde t i es una variableo 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 variablesin especificar en la lista y cómo se podría solucionar? (Véase también en relación a esta pregunta elsiguiente 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

Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias

Page 31: MANUAL DE PRÁCTICAS LIBRES DE PROGRAMACIÓN · PDF fileProf. L.I. Raymundo Lumbreras López Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias . 8 2.1.3

31

6.3 Analizador sintáctico y traductor

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 verbal

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 sintagmanominal 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 ysintagma verbal. Usarla para analizar (comprobar si una lista de identificadores es una oración) ygenerar 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, deforma 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 lasoraciones que se proporcionen como sus argumentos.

Introducción a la Inteligencia Artificial Prof. L.I. Raymundo Lumbreras López

Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias

Page 32: MANUAL DE PRÁCTICAS LIBRES DE PROGRAMACIÓN · PDF fileProf. L.I. Raymundo Lumbreras López Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias . 8 2.1.3

32

6.4 Intérprete de Prolog

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 dela reducción de Objetivo según indique ModoDepuración. Al menos debe haber un modo paraindicar los puertos call (Véase el apartado 3.3.5).

Introducción a la Inteligencia Artificial Prof. L.I. Raymundo Lumbreras López

Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias

Page 33: MANUAL DE PRÁCTICAS LIBRES DE PROGRAMACIÓN · PDF fileProf. L.I. Raymundo Lumbreras López Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias . 8 2.1.3

33

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

Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias

Page 34: MANUAL DE PRÁCTICAS LIBRES DE PROGRAMACIÓN · PDF fileProf. L.I. Raymundo Lumbreras López Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias . 8 2.1.3

34

8. AgradecimientosEn general, se debe agradecer la labor de los investigadores en el área de programación lógica que hansabido 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 disponiblelí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, queproporcionó las notas del curso Sistemas de cálculo que impartió en la Facultad de Ciencias Físicas de laUCM.

Introducción a la Inteligencia Artificial Prof. L.I. Raymundo Lumbreras López

Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias

Page 35: MANUAL DE PRÁCTICAS LIBRES DE PROGRAMACIÓN · PDF fileProf. L.I. Raymundo Lumbreras López Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias . 8 2.1.3

35

9. Índice-, 19

— —- (complemento), 19- (sustracción), 19

—"—", 19

—*—*, 19

—/—/, 19/", 19//, 19

—;—;, 14

—^—^, 19

—+—+, 19

—<—<, 20<<, 19

—=—=:=, 20=<, 20=\=, 20

—>—>, 20>=, 20>>, 19

—A—abort, 17abs, 19acos, 19afirmación, 9Agradecimientos, 31aridad, 9

Aritmética, 19asin, 19asserta, 18assertz, 19atan, 19átomos, 7Ayuda interactiva, 18

—B—Bibliografía, 30

—C—Call, 15cd/1, 13cláusula negativa, 9consult, 13, 19consulta, 9Control, 18Convenciones sintácticas, 9copiar, 18cos, 19creep, 17

—D—depth-first left-to-right, 10Depuración y traza de programas, 15Directorio de trabajo, 13dominio, 5, 6, 10, 22, 23Dominio Booleano, 22Dominio de los racionales, 22Dominio de los reales, 22Dominio finito, 22Dominios, 22

—E—Edit.com, 12Editor, 12, 22Elegancia, 25encaje de patrones, 9Entrada/Salida, 19Estilo, 24Estructuras de datos, 7Exit, 15exp, 19

—F—Fail, 15full, 16funtor, 7, 9

Introducción a la Inteligencia Artificial Prof. L.I. Raymundo Lumbreras López

Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias

Page 36: MANUAL DE PRÁCTICAS LIBRES DE PROGRAMACIÓN · PDF fileProf. L.I. Raymundo Lumbreras López Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias . 8 2.1.3

36

—G—get0, 19

—H—half, 16halt, 13, 14, 18hecho, 9help, 18historial, 17Historial, 18Horn, 8

—I—Instalación, 11, 21instanciar, 10Introducción a Prolog, 5Introducción informal, 5is, 19

—L—leash, 16listas, 8listing, 19log, 19log10, 19ls, 13

—M—Manejo de la base de datos, 18máquina soporte, 11mod, 19Modelo de bloques de procedimientos, 15Modelo de cómputo, 10

—N—nl, 19nodebug, 17nospy, 16notrace, 16

—O—Operadores aritméticos, 19Operadores lógicos, 20Órdenes del sistema operativo, 13

—P—Prácticas recomendadas, 24, 26

Precauciones, 25Programación recursiva, 7programas desgarbados, 25programas elegantes, 25Prolog, 11Prólogo, 4puertos de acceso, 15punto espía, 16pwd, 13

—R—Redo, 15Referencia de algunos predicados predefinidos, 18resolución lineal, 10retract, 13, 19rl_add_history, 17Robinson, 10

—S—SICS, 21Sicstus Prolog, 4, 21, 22sin, 19skip, 17spy, 16sqrt, 19Step by Step, 17Sugerencias y avisos, 24SWI, 4, 11, 12, 13, 16, 17, 18, 19, 21, 22, 25, 30, 31

—T—tan, 19término, 9Términos estructurados, 7Trabajo con SWI-Prolog, 13, 22trace, 16

—U—Unificación, 9unify, 16

—W—WAM, 11, 21, 30Warren Abstract Machine, 11Web, 11, 21Windows, 11, 12, 18, 21write, 19

Introducción a la Inteligencia Artificial Prof. L.I. Raymundo Lumbreras López

Universidad del Valle de México Campus Tlalpan, Departamento de Tecnociencias