Sei sulla pagina 1di 25

Aadir.pro domains s=String* predicates nondeterm aadir(s,s,s). clauses aadir([],B,B). aadir([X|Y],B,[X|Z]):-aadir(Y,B,Z). goal aadir([de,hoy,no],[pasa],X). Conectar.

pro domains s=String* predicates nondeterm concatenar(s,s,s). clauses concatenar([],L,L). concatenar([X|L1],L2,[X|L3]):-concatenar(L1,L2,L3). goal concatenar([uno,dos,tres],[cuatro],[uno,dos,tres,cuatro]). Concatenar_1.pro domains s=String* predicates nondeterm concatenar(s,s,s). clauses concatenar([],L,L). concatenar([X|L1],L2,[X|L3]):-concatenar(L1,L2,L3). goal concatenar([uno,dos,tres],[cuatro],Z). Concatenar_2.pro domains s=String* predicates nondeterm concatenar(s,s,s). clauses concatenar([],L,L). concatenar([X|L1],L2,[X|L3]):-concatenar(L1,L2,L3). goal concatenar([uno,dos,tres],[Y],[uno,dos,tres,cuatro]). Concatenar_3.pro

domains s=String* predicates nondeterm concatenar(s,s,s). clauses concatenar([],L,L). concatenar([],L,L). concatenar([X|L1],L2,[X|L3]):-concatenar(L1,L2,L3). goal concatenar([de,hoy,no],[pasa],L3). Escribe_lista.pro domains s=String* predicates nondeterm escribe_lista(s). clauses escribe_lista([]):-nl. escribe_lista([X|Y]):-write(X), escribe_lista(Y). goal escribe_lista([a,b,c,d,e,f,g]). Invertir.pro domains s=string* predicates nondeterm invertir(s,s) nondeterm concatenar(s,s,s) clauses invertir([],[]). invertir([X|Y],L):-invertir(Y,Z), concatenar(Z,[X],L). concatenar([],L,L). concatenar([X|L1],L2,[X|L3]):-concatenar(L1,L2,L3). goal invertir([cinco_perros, mataron, cinco_lobos],X). Longitud.pro domains s=string* d=s* a=integer predicates nondeterm longitud(d,a).

clauses longitud([],0):-!. Longitud([_|Y],N):-longitud(Y, N1), N=N1+1. Goal Longitud([[uno,dos,tres],[cuatro],[uno,dos,tres,cuatro]], X). Pertenece.pro Domains S=string* A=string Predicates Nondeterm pertenece_a(a,s). Clauses Pertenece_a(X,[X|_]):-!. Pertenece_a(X,[_|Y])if pertenece_a(X,Y). Goal Pertenece_a(mayo,[enero, febrero, marzo, abril]). Pertenece_1.pro domains s=string* a=string predicates nondeterm pertenece_a(a,s). clauses pertenece_a(X,[X|_]):-!. pertenece_a(X,[_|Y])if pertenece_a(X,Y). goal pertenece_a(marzo,[enero, febrero, marzo, abril]). Ultimo.pro Domains s=string* a=string Predicates Nondeterm ultimo(s,a). Clauses ultimo([X],X)if !. ultimo([_|Y],X) if ultimo(Y,X). goal ultimo([alla,en,el,rancho,grande],X). Ultimo_1.pro Domains s=string*

a=string Predicates Nondeterm ultimo(s,a). Clauses ultimo([X],X)if !. ultimo([_|Y],X) if ultimo(Y,X). goal ultimo([alla,en,el_rancho],X).

CAPITULO I: INTRODUCCION 1.1 Qu es PROLOG? Prolog es un lenguaje de programacin de computadoras de quinta generacin, que permite declarar predicados que representan conocimientos en el dominio del quehacer humano, para luego implementarlos en clusulas que equivalen a reglas de razonamiento. PROLOG significa PROgramacin Lgica e inicialmente estaba orientado a la solucin de problemas de inteligencia artificial en el campo de la lgica pura y no tena mucha aceptacin en el ambiente informtico, sin embargo ahora se comercializan importantes ambientes de desarrollo que incluyen objetos informticos y enlaces a otros ambientes para el tratamiento informtico que van desde facilidades para el tratamiento de ventanas, dilogos y objetos visuales, pasando por el acceso a importantes manejadores de bases de datos como ACCESS, SQL SERVER y conexiones con INTERNET, para la implementacin de aplicaciones en el WEB. 1.2 Cual es la estructura de PROLOG? Un programa PROLOG est estructurado en bloques: Domains: se declaran nuevos tipos de datos creados por el usuario Database: declaracin de predicados dinmicos que constituyen estructuras de datos Predicates: declaracin de predicados estticos Clauses: implementacin del cdigo para los predicados. Goal: indica el punto de inicio de la ejecucin del programa. 1.3 Algunas peculiaridades de PROLOG: El tratamiento de variables: En PROLOG no existe la operacin de asignacin. Ejm: X = 5 (asignar a X el valor 5). La notacin X=5 se usa en PROLOG con otro significado y se lee: es X igual a 5 ? En PROLOG la operacin asignar un valor a una variable es reemplazada por la operacin ligar una variable con determinado valor. En este sentido el valor ligado a la variable X depende de su valor anterior. Si X an no ha recibido valor alguno se dice que es una variable libre (no ligada), por lo tanto puede recibir cualquier valor del tipo de dato definido para la variable y se dice que la operacin tiene xito. Si X est ligada, entonces ya no puede recibir ningn valor. Si X es igual al valor determinado entonces se dice que la pregunta tiene una respuesta verdadera y el programa contina normalmente. Las variables annimas: Cuando no se requiere el valor de una variable en determinada situacin se utiliza el caracter _ (underscore) y se lee variable annima. Por ejemplo si tenemos definido un predicado alumno(Cdigo, Nombre, Sexo, Carrera) y en determinada clusula solo necesitamos el nombre y el sexo, entonces se puede utilizar alumno( _, Nombre, Sexo, _), con lo que estamos dejando como variables annimas las que corresponden a Cdigo y Carrera. El mecanismo de unificacin: Cuando se invoca una clusula se realiza el mecanismo de unificacin el cual consiste en comparar en forma biunvoca la clusula invocada con la clusula que hace la invocacin. Si al finalizar la comparacin resultan iguales, entonces se dice

que la unificacin tiene xito (no falla), en caso contrario se dice que la unificacin no tiene xito (falla). El mecanismo de unificacin se relaciona con el mecanismo de backtracking. El mecanismo de backtracking: Cuando se invoca una clusula y el proceso de unificacin falla, entonces PROLOG busca la siguiente clusula del mismo nombre y realiza nuevamente el proceso de unificacin as sucesivamente. Si se logra unificar completamente una clusula el proceso tiene xito en caso contrario falla. por esta razn se dice que un programa PROLOG se ejecuta solamente cuando sus clusulas son verdaderas (no fallan), al encontrar una clusula que falla completamente entonces, el programa termina en forma anormal. Existen formas de hacer que una clusula que falla recupere su estado de verdad y permita la ejecucin total del programa. 1.4 Cmo se ejecuta un programa PROLOG? PROLOG tiene implementado un motor de inferencia para el tratamiento de clusulas utilizando un mecanismo denominado BACKTRACKING para seleccionar y ejecutar una clusula. Dentro de la clusula, sus componentes sejecutan secuencialmente. Las clusulas son ejecutadas cuando son invocadas desde cualquier parte del programa (desde el GOAL, desde otra clusula desde ella misma). PROLOG no tiene implementadas las estructuras de control de flujo IF, FOR, WHILE, REPEAT, CASE, etc. En su lugar se utiliza intensivamente el concepto de recursividad. Se dice que una clusula es recursiva cuando se invoca a ella misma. La ejecucin de un programa PROLOG se basa en la verdad (no fallo) de sus clusulas. Se dice que un programa se ejecuta normalmente cuando el resultado de ejecucin de sus clusulas es verdadero (no falla). Cuando una clusula falla PROLOG aplica el mecanismo de backtracking. Desarrollemos un ejemplo para mostrar como se ejecuta un programa PROLOG: |predicates | operacin('+',A,B,C):- C = A + B. |lee(integer) |operacin('-',A,B,C):- C = A - B. |loper(char) |operacin('*',A,B,C):- C = A * B. |muestra(char,integer,integer,real) |operacin('/',A,B,C):- C = A / B. |operacin(char,integer,integer,real) |goal |clauses |lee(N1), | |lee(N):- write("entre un numero:"), readint(N). |loper(O), | |loper(Oper):- write("entre un signo (+, -, *, /): "), |lee(N2), | |readchar(Oper), write(Oper), nl. |operacin(O,N1,N2,Res), | |muestra(O,A,B,C):- write(A," ",O," ",B," = ",C), |muestra(O,N1,N2,Res). | |nl. | | Explicacin del programa: 1. Se declaran los predicados lee, loper, muestra, operacin lee: lee un nmero desde el teclado. loper: lee signo de operacin desde el teclado. muestra: muestra en pantalla el resultado de una operacin aritmtica operacin: calcula el resultado de una operacin aritmtica | | | | |

2. Se implementan los predicados en las siguientes clusulas: (hemos explicado solamente la primera vez que aparece una clusula) lee(N):nombre de la clusula. Se puede usar cualquier identificador para designar la variable N. write("entre un numero: "), muestra un mensaje en pantalla. readint(N). lee un dato tipo integer y lo liga con la variable N. loper(Oper):write("entre un signo (+, -, *, /): "), readchar(Oper), lee un dato tipo char y lo liga con la variable Oper. write(Oper), nl. genera un salto de lnea. muestra(O,A,B,C):write(A," ",O," ",B," = ",C), nl. operacin('+',A,B,C):C = A + B. recibe los valores de A y B, ejecuta la suma y devuelve el valor C operacin('-',A,B,C):- C = A - B. operacin('*',A,B,C):- C = A * B. operacin('/',A,B,C):- C = A / B. 3. El programa principal: Al igual que todo lenguaje de computadoras la ejecucin del programa se inicia en un punto y se desarrolla en forma secuencial, en PROLOG el punto inicial es el GOAL. La variante en PROLOG ocurre cuando se aplica el mecanismo de backtracking. goal punto inicial de ejecucin del programa. lee(N1), invoca la clusula lee. loper(O), lee(N2), operacin(O,N1,N2,Res), muestra(O,N1,N2,Res). 3. Existen algunas predicados predefinidos por el fabricante cuya funcin es ejecutar tareas computacionales llamados predicados extralgicos, ejem: clearwindow............borra pantalla nl.............................salto de linea readln......................lee una cadena readchar..................lee un carcter write.......................muestra una cadena en pantalla 5. Algunas clusulas definidas por el usuario son muy semejantes a los tradicionales procedimientos de otros lenguajes de programacin. En este caso lee, loper y muestra pueden ser consideradas como procedimientos y en ellas no se aplica backtracking. 6. El mecanismo de backtracking se aplica sobre la clusula operacin, en la que observamos los siguientes aspectos: Se han implementado varias clusulas para el predicado operacin.

Cada clusula se diferencia de otra por la operacin que realiza. Supongamos que se invoca la clusula: operacin( *, 5, 4, R) PROLOG busca la primera clusula de operacin encontrando operacin(+,A,B,C), detecta que * es diferente que +, entonces falla y busca la siguiente clusula. PROLOG busca la segunda clusula de operacin encontrando operacin(-,A,B,C), detecta que * es diferente que -, entonces falla y busca la siguiente clusula. PROLOG busca la tercera clusula de operacin encontrando operacin(*,A,B,C), detecta que * es igual que *, entonces dado que A, B son variables de entrada, las liga con sus correspondientes valores 5 y 4. Entra al cuerpo de la clusula encontrando C = A * B, dado que C es variable libre, la liga con 20 que es el resultado de 4 * 5, retornando ese valor al punto donde fue invocada la clusula. Del ltimo tem podemos deducir que el mecanismo backtracking consiste en la ejecucin secuencial de clusulas con el mismo nombre hasta encontrar alguna que su ejecucin sea completamente verdadera (no falla). El mecanismo backtracking tiene propiedades de anidamiento, esto es si falla una clusula dentro de otra se realiza el backtracking en la clusula de nivel ms alto y as sucesivamente. 1.5 Se puede utilizar PROLOG para resolver problemas que no son necesariamente de Inteligencia Artificial ? Si, y es un buen punto de partida para aprender PROLOG, pues de esta manera hacemos una transferencia de nuestros conocimientos de otros lenguajes hacia el ambiente PROLOG y se van marcando las diferencias, que como hemos visto las ms notorias son: el tratamiento de variables (libres, ligadas, annimas) y los mecanismos de unificacin y backtracking. Las primeras versiones eran muy sesgadas hacia la Inteligencia Artificial, si embargo las versiones actuales han hecho un balance adecuado entre la Inteligencia Artificial y el ambiente computacional. Esta situacin permite resolver problemas ms coherentes con la realidad informtica. 1.6 Escribiendo un programa sin componentes visuales Procedimiento general: 1. Ejecutar VISUAL PROLOG. Invocar VIP 2. En la lnea de menu seleccionar File / New 3. Editar el programa 4. Ejecutar el programa. En la barra de herramientas seleccione Goal (G) 5. Cerrar la ventana 1. Programa que lee el nombre de una persona y muestra un saludo simple: | predicates |lee_c(string,string) |clauses |lee_c(M,C):- write(M), beep, readln(C). |goal |lee_c("Entre un nombre: ",C), |write("Nombre ledo: ",C), nl, |lee_c("Presione para continuar",_). | | | | | | | |

2. Programa que lee dos nmeros y un signo de operacin aritmtica, ejecuta la operacin y muestra el resultado: |predicates |muestra(O,A,B,C):|lee(integer) |write(A," ",O," ",B," = ",C), nl. |loper(char) |operacion('+',A,B,C):C = A + B. | |muestra(char,integer,integer,real) |operacion('-',A,B,C):- C = A B. | |operacion(char,integer,integer,real) |operacion('*',A,B,C):- C = A * B. | |clauses |operacion('/',A,B,C):- C = A / B. |lee(N):- write("entre un numero: "), readint(N). |goal | |loper(Oper):|lee(N1), loper(O), lee(N2), |write("entre un signo (+, -, *, /): "), |operacion(O,N1,N2,Res), | |readchar(Oper), write(Oper), nl. |muestra(O,N1,N2,Res). | CAPITULO 2: APRENDER HACIENDO En este captulo hacemos una descripcin detallada de los prcedimientos para crear y ejecutar un proyecto. Lo interesante es que iremos construyendo el proyecto a medida que avanzamos presentando sus componentes. Es probable que al terminar el captulo Ud. no necesite mas gua y pueda leer manuales especializados. Sin embargo si Ud. necesita mas ayuda sobre el ambiente visual, podr continuar con el captulo tres del libro donde describimos de una manera mas formal los componentes visuales, su funcin y procedimientos de uso. 2.1 EL AMBIENTE VISUAL PROLOG Visual Prolog es un ambiente de desarrollo grfico para PDC PROLOG. Como herramienta de desarrollo proporciona componentes (controles, objetos) para generar aplicaciones en Inteligencia Artificial e informticas con interface visual. En Visual Prolog las aplicaciones se denominan Proyectos. Visual Prolog provee de herramientas que generan cdigo automaticamente, a las cuales podemos acceder desde los editores determinados y luego hacer actualizaciones al cdigo de acuerdo a nuestro criterio en funcin del problema a resolver. El cdigo generado est totalmente documentado. Todo proyecto contiene como mnimo: una ventana, un men, un mdulo de programa. La ventana contiene controles objetos (Box) que permiten entrar o mostrar datos (interaccin usuario-computador). Las ventanas pueden ser: ventanas regulares, ventanas de dilogo y ventansas especiales denominadas controles(push button, edit button, list box, scroll bars, etc.). El men presenta una serie de opciones del programa y representa un esquema de navegacin sobre el mismo. El mdulo contiene el cdigo PROLOG (tanto el cdigo fuente generado por el ambiente y el cdigo fuente ingresado en forma manual por el programador). Proyectos mas complejos contienen varios menus, ventanas, mdulos y otros componentes tales como conos, barras de herramientas, cursores , mapas de bits, etc. Visual Prolog se comunica con el usuario presentando ventanas en editores visuales, estas | |

ventanas contienen objetos (Opciones de menu, barras de herramientas, botones, boxes, etc). El usuario se comunica con Visual Prolog seleccionando los objetos (eventos) de las ventanas utilizando ya sea el teclado o el mouse. Este mecanismo de interaccin es posible gracias al tratamiento de eventos. Los eventos son ocurrencias que se generan cuando el usuario presiona una tecla o realiza una accin en el mouse (mueve el mouse, presiona un botn, deja de presionar el botn, etc.). Esto significa que el flujo de ejecucin del programa est dirigido por las ocurrencias sobre los objetos de las ventanas. Visual Prolog define para cada proyecto una ventana raiz llamanda Task Window a partir de la cual se generan en forma jerrquica una o mas ventanas que constituyen los objetos del primer nivel de la aplicacin, sobre estas ventanas se colocan nuevos objetos y as sucesivamente. Visual Prolog define para cada proyecto un menu raiz llamando Task Menu a partir del cual se desarrolla el rbol de menus de la aplicacin. El rbol de menus presenta en forma adecuada las opciones disponibles en la aplicacin. Un menu puede tener submenus. Estas opciones se enlazan con las ventanas y dilogos, dando origen a la interface usuario-sistema. Una estratgia inicial para comprender el uso de VISUAL PROLOG es tomar un curso previo de lenguaje prolog y luego generar aplicaciones sencillas observando tanto los objetos como el cdigo generado y luego agregar cdigo prolog para personalizar la aplicacin. A medida que se desarrollan las aplicaciones el estudiante ir tomando experiencia en el manejo del ambiente y acostumbrandose al paradigma del tratamiento de eventos. Cada evento generado tiene un predicado llamado el manejador del evento (event handler), el cual se implementa en una o mas clusulas. Cuando ocurre un evento, se genera o dispara (trigger) una orden de ejecucin del manejador de eventos correspondiente, al terminar la ejecucin, el sistema espera hasta que ocurra otro evento, y as sucesivamente. Es en estas clusulas manejadoras de eventos, en las que agregamos cdigo prolog para realizar las tareas que permiten lograr los objetivos de la aplicacin. 2.2 EL PRIMER PROYECTO Antes de iniciar el estudio de este tem Ud, deber tener un buen conocimiento del sistema operativo Windows, el manejo de ventanas, controles, etc. Esta es una etapa complicada pues si el estudiante es experto en windows, como le parace un tanto aburrida, sin embargo si es novato en ambientes visuales pues le parece un tanto complicado, en cualquier caso le sugiero llenarse de paciencia y buen humor y para adelante. Desarrollaremos un proyecto que presente un menu con tres opciones de submenu. Un primer submenu al que denominaremos saludo1 debe mostrar una ventana de dilogo enviando el saludo buenos dias. Un segundo submenu al que denominaremos saludo2 debe mostrar una ventana de dilogo enviando el saludo buenas tardes y finalmente el tercer submenu debe mostrar una ventana de dilogo pidiendo su nombre y luego muestre en otra ventana de dilogo un saludo compuesto buenas noches . Utilizaremos diferentes procedimientos para realizar el proyecto mencionado, por el momento realize con mucho cuidado los pasos propuestos, tratando de retener mentalmente todo lo que ve sin aplicar mucho esfuerzo. A medida que avance se le harn familiares las ventanas, iconos, controles, procedimientos, etc. los mismos que deber conocerlos y aprenderlos en forma natural. Posteriormente en el siguiente captulo regresaremos a presentar los componentes del Ambiente Visual en forma metdica y estructurada.

2.2.1 Creando el Proyecto 1. Entrar a Visual Prolog 2. Presionar el botn OK 3. Aparece la VENTANA PRINCIPAL DEL AMBIENTE. Observe Las opciones de la columna izquierda (Module, Dialog, Window, Menu, Tollbar, String, Icon, Cursor, Bitmap, Help Topics) y las opciones de la columna derecha (New, Edit, Delete, Attribute, Code Expert, Help) 4. En la linea de menu seleccionar Project / New Project. Aparece el dilogo Aplication Expert 5. En la pestaa General: label Project Name ingresar Saludo 6. Presionar la tecla tab. Observe que automticamente aparece el nombre de archivo saludo.vpr 7. En label Base Directory ingresar C:\saludo 8. Seleccionar pestaa User Info e ingresar la siguiente informacin: Company Name: Mi compaia Author : Copyright : freeware Descripcin : Programa de saludos 9. Pulsar Create 10. El Proyecto ha sido creado. Observe el rbol jerrquico de los archivos generados 2.2.2 Creando el menu del proyecto 1. Seleccionar la opcin Menu (lado izquerdo) 2. Seleccionar la opcion Edit (lado derecho) 4. Resaltar &Edit 5. Seleccionar New 5. En label Text ingresar &Saludos Pulsar Tab (en label Constant se ha generado id_saludos) 6. Pulsar OK 8. Seleccionar Submenu 9. Estando resaltado &Saludos, seleccionar New 10. En label Text ingresar Saludos&1 11. Pulsar Tab (en label Constant se ha generado id_saludos_saludo1) 12. Pulsar OK 13. Seleccionar New 14. En label Text ingresar Saludos&2 15. Pulsar Tab (en label Constant se ha generado id_saludos_saludo2) 16. Pulsar OK 17. Seleccionar New 18. En label Text ingresar Saludos&3 19. Pulsar Tab (en label Constant se ha generado id_saludos_saludo3) 20. Pulsar OK 21. Pulsar Close y luego seleccione Yes para grabar los cambios 2.2.3 Ejecutando la aplicacin

1. Seleccionar R en la barra de herramientas 2. Interpretar las ventanas que van apareciendo y continuar respondiendo los mensajes solicitados hasta terminar la ejecucin de la aplicacin 2.2.4 Agregando cdigo a las opciones del menu (submenus) Para el submenu saludo1 1. Hacer Ctrl+W (Invocar el Code Expert) 2. Seleccionar radio button Window Seleccionar list button Task Window 3. En box Event Type, seleccionar Menu En box Event or Item seleccionar la constante id_saludos_saludo1 4. Pulsar Add Clause y luego se convierte en Edit Clause Pulsar Edit Clause 6. Aparece cdigo Prolog, leer el cdigo 6. Antes del segundo cut digitar: dlg_Note(Saludo1: Buenos das), 7. Ejecutar la aplicacin Para el submenu saludo2 1. Hacer Ctrl+W (Invocar el Code Expert) 2. Seleccionar radio button Window Seleccionar list button Task Window 3. En box Event Type, seleccionar Menu En box Event or Item seleccionar la constante id_saludos_saludo2 4. Pulsar Add Clause y luego se convierte en Edit Clause Pulsar Edit Clause 5. Aparece cdigo Prolog, leer el cdigo 6. Ubicar el cursor antes del segundo cut del predicado 7. Hacer click derecho Seleccionar Insert / Predicate Call / Window, Dialog and Toll bar... Aparece la ventana Insert Call Of ... Seleccionar el Radio Button Common Dialog Seleccionar en el list Button dlg_Note En el box Note Message digitar: Buenas tardes Pulasr el botn OK 8. Observar el cdigo generado, Ejecute los siguientes cambios Title = Title por Title = Saludo2 9. Ejecutar la aplicacin Para el submenu saludo3 1. Siguiendo las intrucciones anteriores: (Todos los mensajes deben estar en castellano) Seleccione un dilogo dlg_GetStr que pida su nombre Seleccione un dilogo dlg_Note que genere un saludo: Buenas noches, 2. Ejecute la aplicacin.

2.2.5 Grabando la aplicacin VPI graba automaticamente la aplicacin, sin embargo realize las siguientes acciones: En el menu seleccione Project / Save Cerrar el ambiente VPI 2.3 Una ampliacin al primer programa Buscamos crear una ventana adicional en la que se presenten las tres formas de saludo del primer progama, a las que se pueda acceder a traves de botones pulsadores. 3. .1 Invocando el proyecto existente 1. Entrar a Visual Prolog, Seleccionar Project / Open Project 2. Ubicar la carpeta y el nombre de la aplicacin Saludo 3. Pulsar el botn Abrir 2.3.2 Creando una opcin en un submenu 1. Ubicarse en la ventana principal 2. Seleccionar la opcin Menu (lado izquerdo) 3. Seleccionar la opcion Edit (lado derecho) 4. Resaltar &Saludos, Seleccionar Submenu 5. Resaltar Saludo&3, seleccionar New 6. En label Text ingresar Saludos&4 7. Pulsar Tab (en label Constant se ha generado id_saludos_saludo4) 8. Pulsar OK, 9. Pulsar Close y luego seleccione Yes para grabar los cambios 10. Ejecutar la aplicacin 2.3.3. Creando una ventana para la nueva opcin 1. Ubicarse en la ventana principal 2. Selecionar Window (lado izquierdo) 3. Seleccionar New (lado derecho) 4. En label Name digitar Ventana del saludo 4, Pulsar OK 5. Aparece la ventana en la que se pueden agregar controles, esta vez simplemente cierrela 6. En la ventana principal seleccionar Code Expert (lado derecho), verificando que en la ventana intermedia este resaltada la entrada Ventana del saludo 4 7. Aparece la ventana Dialog and Window Expert 8. Seleccionar Radio Button Window 9. Seleccionar list edit Ventana del saludo 4 10. En label Module, seleccionar list button Saludo.pro 11. Pulsar Default Code 12. Si Ud. desea puede observar el cdigo generado pulsando Edit Code 13. Para finalizar Pulsar OK en la ventana Dialog and Window Expert 2.3.4 Enlazando el submenu con su ventana 1. En la ventana principal 2. Seleccionar Code Expert (lado derecho) 3. Seleccionar Radio Button Window

4. Seleccionar en list edit Task Window 5. En el box Event Type seleccionar Menu 6. En el box Event or Item seleccionar id_saludos_saludo4 7. Pulsar Add Clause y luego Edit Clause 8. Aparece el cdigo Prolog, ubicar el cursor antes del segundo cut 9. Hacer click derecho / Insert / Predicate Call / Window, Dialogue or Tool bar..... 10. Aparece la ventana Insert Call of... 11. Seleccionar Radio Button User Defined Window 12. Seleccionar list edit Ventana del saludo 4 13. Pulsar OK 14. Ejecutar aplicacin 2.3.5. Creando controles para la ventana 1. En la ventana principal 2. Seleccionar Window (lado izquierdo) 3. En la ventana intermedia resaltar la entrada Ventana del saludo 4 4. Seleccionar Edit (lado derecho) 5. Aparece la ventana sobre la cual distribuiremos los controles, Observe que ademas aparecen dos ventanas Controls y Layouts. Pase el control del mouse sobre cada uno de los controles de estas ventans y observe sus comentarios. 6. Seleccionar un boton pulsador (Push button) y ubicarlo sobre la ventana 7. Aparece la ventana Push Button Attributes 8. En label text digitar Saludo1, luego presionar tab, oberve que automticamente aparece el contenido para el label constant idc_push_button. Pulsar OK 9. Repetimos los pasos anteriores para el boton pulsador Saludo2. 10. Seleccionar un boton pulsador (Push button) y ubicarlo sobre la ventana 11. Aparece la ventana Push Button Attributes 12. En label text digitar Saludo2, luego presionar tab, oberve que automticamente aparece el contenido para el label constant idc_push_button. Pulsar OK 13. Repetimos los pasos anteriores para el boton pulsador Saludo3. 14. Seleccionar un boton pulsador (Push button) y ubicarlo sobre la ventana 15. Aparece la ventana Push Button Attributes 16. En label text digitar Saludo3, luego presionar tab, oberve que automticamente aparece el contenido para el label constant idc_push_button. Pulsar OK 17. Agrupar con el mouse los tres controles 18. En la ventana layout seleccionar la opcion same size y luego posicionar hacer click sobre el control Saludo1 19. En la ventana layout seleccionar la opcion center 20. Ejecutar la aplicacin 2.3.6 Agregando cdigo a los controles Para el control saludo1 1. Hacer Ctrl+W (Invocar el Code Expert) 2. Seleccionar radio button Window Seleccionar list button Ventana del saludo 4 3. En box Event Type, seleccionar Control En box Even or Item seleccionar pb:idc_saludo1 4. Pulsar Add Clause y luego Edit Clause 5. Aparece cdigo Prolog, leer el cdigo

6. Antes del segundo cut digitar: dlg_Note(Saludo1: Buenos das), 7. Ejecutar la aplicacin Para el control saludo2 1. Hacer Ctrl+W (Invocar el Code Expert) 2. Seleccionar radio button Window Seleccionar list button Ventana del saludo 4 3. En box Event Type, seleccionar Control En box Even or Item seleccionar pb:idc_saludo2 4. Pulsar Add Clause y luego Edit Clause 5. Aparece cdigo Prolog, leer el cdigo 7. Ubicar el cursor antes del segundo cut 8. Hacer click derecho Seleccionar Insert / Predicate Call / Window, Dialog and Toll bar... Seleccionar el Radio Button Common Dialog Seleccionar en el list Button dlg_Note En el box Note Message digitar: Buenas tardes Pulsar OK 9. Observar el cdigo generado, cambiando Title = Title por Title = Saludo2 10. Ejecutar la aplicacin Para el control saludo3 1. Siguiendo las intrucciones anteriores: (Todos los mensajes deben estar en castellano) Seleccione un dilogo dlg_GetStr que pida su nombre Seleccione un diogo dlg_Note que genere un saludo: Buenas noches, 2. Ejecute la aplicacin. Grabe su aplicacin VPI graba automaticamente la aplicacin, sin embargo realize las siguientes acciones: Seleccione en el menu Project / Save 2 CREANDO UN PROYECTO CON CODIGO PROPIO 1.Crear el proyecto PFACTORIAL, dentro de la carpeta C:\PFACTORIAL 2. Crear la opcin de menu FACTORIAL 3.Crear la ventana W_FACTORIAL 3. En la ventana principal selecionar Window (lado izquierdo) Seleccionar New (lado derecho) En label Name digitar w_factorial Pulsar OK Aparece la ventana en la que se pueden agregar controles, esta vez simplemente cierrela 4. Crear cdigo default para la ventana w_factorial 1. Seleccionar Code Expert (Ctl-W) 2. Seleccionar Radio Button WINDOW 4. Seleccionar list button W_FACTORIAL 5. En label Module, seleccionar list edit PFACTORIAL.pro 6. Pulsar Default Code

7. Pulsar OK 5. Enlazar la opcin de menu FACTORIAL con la ventana w_factorial 1. Seleccionar Code Expert (Ctl-W) 2. Seleccionar Radio Button Window 3. Seleccionar en list edit Task Window 4. En el box Event Type seleccionar Menu 5. En el box Event Item seleccionar id_factorial 6. Pulsar Add Clause y luego Edit Clause 7. Aparece el cdigo Prolog, ubicar el cursor antes del segundo cut 8. Hacer click derecho / Insert / Predicate Call / Window, Dialogue, control..... 9. Seleccionar Radio Button User Defined Window 11. Seleccionar list edit w_factorial 12. Pulsar OK 13. Ejecutar aplicacin 7. Agregar los controles a la ventana w_factorial 1. Agregar un control static text al que denominamos Nmero 2. Agregar un control edit control al que asignamos la constante idc_nmero 3. Agregar un control push button al que denominamos CALCULAR 4. Agregar un control static text al que asignamos la constante idct_resultado 8. Agregar el cdigo a los controles Para el control push button 1. Seleccionar Code Expert (Ctl-W) 2. Seleccionar Radio Button Window 4. 3. Seleccionar en list edit w_factorial 5. 4. En el box Event Type seleccionar Control 5. En el box Event Item seleccionar pb:idc_calcular 6. Pulsar Add Clause y luego Edit Clause 7. Aparece el cdigo Prolog, ubicar el cursor antes del segundo cut 8. digitar calcular(_Win) Para el control edit control 1. Seleccionar Code Expert (Ctl-W) 2. Seleccionar Radio Button Window 6. 3. Seleccionar en list edit w_factorial 7. 4. En el box Event Type seleccionar Control 9. En el box Event Item seleccionar ec-> getfocus 10. Pulsar Add Clause y luego Edit Clause 11. Aparece el cdigo Prolog, ubicar el cursor antes del segundo cut 12. digitar limpiar_box(_Win) 9. Creando nuestro propio cdigo despues del cdigo gerenado: /************************************************************************** *** Copyright (c) My Company Project: PFACTORIAL

FileName: PFACTORIAL.PRO Purpose: No description Written by: Visual Prolog Comments: ************************************************************************** ****/ include "pfactorial.inc" include "pfactorial.con" include "hlptopic.con" digitar: % inicio de mi programa predicates calcular(window) factorial(integer, integer) limpiar_box(window) clauses calcular(_Win):VN = win_getCtlHandle(_Win,idc_nmero), SN = win_GetText(VN), str_int(SN,N), factorial(N,FN), format(CS,"Factorial de % es %",N,FN), VR = win_getCtlHandle(_Win,idct_resultado), win_SetText(VR,CS), !. factorial(0, 1):- !. factorial(N, F):- N > 0, N1= N - 1, !, factorial(N1, FACTN1), F = N * FACTN1. limpiar_box(_Win):VN = win_getCtlHandle(_Win,idc_nmero), win_SetText(VN,""), VR = win_getCtlHandle(_Win,idct_resultado), win_SetText(VR,""), win_setFocus(VN), !. %fin de mi programa 10.Ejcutar el programa ***************************************************************************** * CAPITULO 3. LOS COMPONENTES DE VISUAL PROLOG 3.1

AMBIENTE VISUAL PROLOG GPVP03 CREACION DE DIALOGOS Y CONTROLES OBJETIVO: Presentar al estudiante el ambiente de desarrollo Visual Prolog, para crear una aplicacin que contiene menus, dilogos y controles. OBJETIVOS ESPECIFICOS 1. Crear la aplicacin. 1. Crear una ventana de dilogo. 1. Enlazar la opcion del menu con el dilogo. 1. Incluir controles a la ventana. DESCRIPCION 1. Crear el proyecto PFamilia, dentro de la carpeta C:\familia 2. Crear la opcin de menu MFamilia 3. Crear el dilogo Dfamilia 1. Selecionar Dialog (lado izquierdo) 2. Seleccionar New (lado derecho) 3. En label Name digitar MFamilia, Pulsar OK 4. Aparece la ventana en la que se pueden agregar controles, esta vez simplemente cierrela 4. Crear cdigo default para el dilogo Dfamilia 1. Seleccionar Code Expert (lado derecho) 2. Seleccionar Radio Button Dialog 3. Seleccionar list button DFamilia 4. En label Module, seleccionar list button Pfamilia.pro 5. Pulsar Default Code 5. Enlazar la opcin de menu MFamilia con el dilogo Dfamilia 1. Seleccionar Code Expert (lado derecho) 2. Seleccionar Radio Button Window 3. Seleccionar en list button Task Window 4. En el box Event Type seleccionar Menu 5. En el box Event Item seleccionar id_mfamilia 6. Pulsar Add Clause y luego Edit Clause 7. Aparece el cdigo Prolog, ubicar el cursor antes del segundo cut 8. Hacer click derecho / Insert / Predicate Call / Window, Dialogue, control..... 9. Seleccionar Radio Button User Defined Dialog 10. Seleccionar list button DFamilia 11. Pulsar OK, Ejecutar aplicacin 6. Agregar los controles al dilogo MFamilia 7. Agregar el cdigo PROLOG a cada un de los manejadores de eventos. AMBIENTE VISUAL PROLOG GPVP04-01 DESARROLLO DE APLICACIONES PROBLEMA: Escribir un programa que calcule el factorial de un nmero Anlisis del problema Descripcin general del problema bsico

2. El problema consiste en aplicar tcnicas de recursividad al concepto de factorial de un nmero. 3. Se tiene que disear la interface usuario-computador Comprensin del dominio 5. Fundamento terico Matematicamente el factorial de un nmero entero positivo est definido por: factorial de N = 1................................................Si N = 0. factorial de N = N * factorial de (N-1) ............Si N > 0. Se aplicar la tcnica de transformacin de un concepto recursivo a reglas PROLOG: 1. Expresamos el concepto recursivo en lenguaje natural: regla lmite:......... "factorial de 0 es 1." regla recursiva:... "factorial de N es (N * factorial de (N-1) ) Si N > 0 2. Desde que PROLOG implementa un lgica de predicados de primer orden, la expresin factorial de (N-1) en la regla recursiva es inconsistente por lo que debe ser reformulada como un nuevo predicado, incluyendo un nueva variable FACTN1 que contendr el factorial de (N-1): factorial de (N-1) es FACTN1 regla limite:.................."factorial de 0 es 1." regla recursiva:............."factorial de N es (N * FACTN1) Si N>0 y factorial de (N-1) es FACTN1. 3. Recuerde que en lgica de predicados de primer orden solo existen variables individuales por lo que en la expresin factorial de N es (N * FACTN1), el producto (N * FACTN1) no es vlida. La solucin es reemplazar este producto por una variable creando un nuevo predicado, en ste caso hacemos: F = N * FACTN1 regla lmite:...................."factorial de 0 es 1." regla recursiva:..............."factorial de N es F Si N>0y factorial de (N-1) es FACTN1 y F es (N * FACTN1)." 4. Asmismo la diferencia (N-1) debe ser reemplazada por una nueva variable N1, generando un nuevo predicado: N1 es N - 1 regla lmite:...................."factorial de 0 es 1." regla recursiva:..............."factorial de N es F Si N>0y N1 es N - 1 y factorial de N1 es FACTN1 y F es N * FACTN1." 5. Habiendo normalizado la regla de acuerdo a la lgica de primer orden, completamos el planteamiento de los predicados, reemplazando la palabra Si por el smbolo :- y los conectores y por comas , consiguiendo en forma inmediata la codificacin PROLOG. El predicado "factorial de N es F" sugiere la forma factorial(N,F) predicates factorial(integer, integer) clauses factorial(0, 1). factorial(N, F):- N > 0, N1= N - 1, factorial(N1, FACTN1), F = N * FACTN1. 6. Aspectos computacionales Tcnica de procesamiento: Recursividad

Para el diseo de la interface usuario-computador se utilizarn los recursos de VPI. En este caso la interface es muy simple, de un opcin de menu y su correspondiente ventana de dilogo en la que se incluyen controles para pedir datos y mostrar resultados. Formalizacin Definicin detallada del modelo computacional 8. Descripcin del problema El problema consiste en leer un nmero, implementar las reglas recursivas para el clculo del factorial y mostrar el resultado en una interface visual. 9. Descripcin de los objetivos del modelo de solucin 10. Disear la interface visual. 11. Leer un nmero 12. Implementar la frmula recursiva 13. Mostrar el resultado 14. Seleccin de la representacin de conocimientos El conocimiento se ha formalizado en reglas recursivas definidas en el fundamento terico. 15. Seleccin del paradigma de inferencia Reglas de produccin implementadas directamente en el motor de inferencias de PROLOG Diseo: 1. Caractersticas esenciales del conocimiento 1. Definicin de la interface 16. Diagrama de objetos individuales Dialog..............DIALOGO..........Contenedor de los controles label_Box........LABEL_BOX.....Entre un nmero edit_Box..........EDIT_BOX........Lee el nmero N Inmediatamente despues se debe cacular el factorial de N box....................BOX..................Muestra el valor de factorial de N 17. Diagrama del rbol de objetos (Ventanas, Menus , Controles y Predicados) Dialog..............label_Box edit_Box.......... box 1. Definicin de la estructura de datos (No aplicable en este caso) 1. Definicin de los mdulos de procesamiento predicates factorial(integer,integer) clauses factorial(0,1). factorial(N,F):N > 0, N1 = N - 1, !, factorial(N1,FACTN1), F = N * FACTN1. Construccin: (Ambiente VISUAL PROLOG) 1. Creacin del proyecto 1. Creacin de los menus 1. Creacin de la ventanas de dilogo 1. Creacin del mdulo de programa (Default Code en el Code Expert) para el edilogo 1. Conexin de las opcion del menu con el dilogo. 1. Distribucin de los controles sobre el dilogo. 1. Adicionar el cdigo personalizado AMBIENTE VISUAL PROLOG GPVP04-02

DESARROLLO DE APLICACIONES PROBLEMA: Escribir un programa que resuelva expresiones aritmticas Anlisis del problema Descripcin general del problema bsico 19. El problema consiste en resolver automticamente una expresin aritmtica en el computador Comprensin del dominio 21. Revisin de libros, revistas, videocintas, Internet, etc Libro: Compilers, Principles, Techniques and Tools.......Alfred Aho 22. Fundamento terico Conceptos matemticos: Una expresin aritmtica es un conjunto de operaciones binarias (dos operandos y un operador) Para resolver expresiones aritmticas existen reglas de prioridad: El proceso de solucin se realiza de izquierda a derecha. Se resuelven primero las multiplicaciones y divisiones, luego las sumas y restas. Cuando se usan parntesis, estos se convierten en subexpresiones y tienen prioridad Las expresiones aritmticas estn formadas por trminos y factores La formalizacin de una expresin aritmtica se expresa de la siguiente manera: expr -----------> term terminos term -----------> factor factores terminos ------> mas_menos {imprime signo} term {operacin} terminos ------> nulo factor ---------> nmero {imprime nmero} ---------> ( {imprime"("} expr ) {imprime ")"} factores ------> por_entre {imprime signo} factor {operacin} factores ------> nulo mas_menos --> + | por_entre ----> * | / 23. Aspectos computacionales Tcnica de procesamiento: Recursividad, conversin de datos string a integer 24. Descripcin de casos especficos Resolver: 3+2*(4-5*(8+1)) 8+ 1 = 9, 5*9 = 45, 4-45 = 41, 2*41 = 82, 3+82 = 85 25. Glosario de trminos del dominio Expresin aritmtica, signo de operacin, trmino, factor Formalizacin Definicin detallada del modelo informtico 27. Descripcin del problema El problema consiste en leer una expresin aritmtica en forma de cadena, se implementa el lenguaje formalizado en la etapa de comprensin del dominio, Se calculan los resultados parciales cambiando los tipos de datos cadena a integer, y finalmente se muestra el resultado. 28. Descripcin de los objetivos del modelo de solucin 29. Leer una expresin en un edit box 30. Implementar un analizador sintctico y semntico para el lenguaje formal descrito anteriomente 31. Convertir datos tipo cadena en tipo numrico 32. Mostrar resultados parciales almacenandolos en un list box 33. Mostrar el resultado fnal en un box 34. Seleccin de la representacin de conocimientos

El conocimiento se ha formalizado utilizado tcnicas de lenguajes en un lenguaje propiado 35. Seleccin del paradigma de inferencia La notacin del lenguaje definido para resolver expresiones, puede tratarse con un analizador lexical y luego un analizador sintctico. Las reglas de produccin se implementan directamente en el motor de inferencias de PROLOG Diseo: 1. Caractersticas esenciales del conocimiento 1. Definicin de la interface 36. Diagrama de objetos individuales Dialog..............DIALOGO..........Contenedor de los controles label_Box........LABEL_BOX.....Entre una expresin aritmtica: edit_Box..........EDIT_BOX........Lee la expresin aritmtica EXPR limpia_database agrega la expresin a la database: assert(expresion(EXPR)) calcula el valor de la expresin: expr(EXPR, VALOR) list_box............LISTA_BOX.....Recibe y muestra los resultados parciales draw_Text...................................Muestra el resultado final 37. Diagrama del rbol de objetos (Ventanas, Menus , Controles y Predicados) Dialog..............label_Box edit_Box.......... list_box box 1. Definicin de la estructura de datos database basex expresin(string) resultado(string) 1. Definicin de los mdulos de procesamiento predicates agrega_res(real,string,real,real) e_oper(real,string,real,real) expr(string,real,string) factor(string,string,real) factores(real,string,real,string) limpia_database mas_menos(string) por_entre(string) term(string,string,real) terminos(real,string,real,string) clauses agrega_res(A,S,B,RP):- str_int(SA,A), str_int(SB,B), str_int(SRP,RP), format(X,% % % %,SA,S,SB,SRP), assertz(resultado(X)), !. e_oper(A,"+",B,R):- R = A + B, agrega_res(A,"+",B,R), !. e_oper(A,"-",B,R):- R = A - B, agrega_res(A,"-",B,R), !. e_oper(A,"*",B,R):- R = A * B, agrega_res(A,"*",B,R), !. e_oper(A,"/",B,R):- R = A / B, agrega_res(A,"/",B,R), !.

%expr -------> term terminos expr(C,VE,RE):- term(C,Rx,VT), terminos(VT,RX,VE,RE), !. %factor -----> nmero {imprime nmero} % ---> ( {imprime"("} expr ) {imprime ")"} factor(C,R,N):- fronttoken(C,CN,R), str_int(CN,N), write(N," "), !. factor(C,Ry,N):- fronttoken(C,"(",R), write("( "), expr(R,N,Rx), fronttoken(Rx,")",Ry), write(")"), !. %factores ---> por_entre {imprime signo} factor {operacin} factores % ---> nulo factores(VF1,C,Vx,Cx):- fronttoken(C,S,R), por_entre(S), write(S," "), factor(R,RX,VF2), e_oper(VF1,S,VF2,VF), !, factores(VF,Rx,Vx,Cx). factores(V,C,V,C):- !. limpia_database:- retract(_, basex), fail. limpia_database:- !. %mas_menos --> +|mas_menos("+"):- !. mas_menos("-"):- !. muestra(A,S,B,R):- attribute(X), attribute(3), write(" "), attribute(X), !. %por_entre --> *|/ por_entre("*"):- !. por_entre("/"):- !. %term ----------> factor factores term(C,Rs,Ns):- factor(C,R,N), factores(N,R,Ns,Rs), !. %terminos ---> mas_menos {imprime signo} term {operacin} terminos % ---> nulo terminos(VT1,C,Vy,Ry):- fronttoken(C,S,R), mas_menos(S), write(S," "), term(R,RX,VT2), e_oper(VT1,S,VT2,VF), !,

terminos(VF,Rx,Vy,Ry). terminos(V,C,V,C):- !. Construccin: (Ambiente VISUAL PROLOG) 1. Creacin del proyecto 1. Creacin de los menus 1. Creacin de las ventanas regulares ventanas de dilogo 1. Creacin del mdulo de programa 1. Conexin de las opciones del menu con las ventanas y el mdulo de programa respectivos 1. Distribucin de los controles sobre las ventanas dilogos 1. Adicionar cdigo personalizado Prueba: 1. Disear el mtodo y plan de prueba La ejecucin debe ser correcta al 100% El mtodo consitir en aplicar una serie de expresiones que presenten casos lmites. Los errores se corregirn inmediatamente. 1. Identificacin de casos de prueba Lista de expresiones aritmtcas 1. Ejecutar la aplicacin con los datos de prueba 2.N METODOLOGIA DE DESARROLLO DE APLICACIONES Para desarrollar un proyecto en VISUAL PROLOG proponemos la siguiente secuencia de pasos, los cuales deben ser aplicados de acuerdo al caso a resolver, (no es obligatorio seguir todos los pasos, es posible eliminar o agregar algunos otros): 2.2.1 Anlisis del problema 1. Descripcin general del problema bsico 1. Comprensin del dominio Revisin de libros, revistas, videocintas, Internet, etc Fundamento terico Aspectos computacionales Descripcin de casos especficos Compendio de documentacin Glosario de trminos del dominio 1. Descripcin de los problemas especficos 1. Desarrollo de prototipos para resolver los problemas especficos Formalizacin 1. Definicin detallada del modelo informtico Descripcin del problema Descripcin de los objetivos del modelo de solucin Seleccin de la representacin de conocimientos Seleccin del paradigma de inferencia Restricciones Descripcin funcional 1. Planeacin del proyecto Estimacin de recursos Programacin del proyecto Asignacin de tareas Presupuesto Equipo del proyecto

Diseo: 1. Caractersticas esenciales del conocimiento 1. Definicin de la interface Diagrama de objetos individuales Diagrama del rbol de objetos (Ventanas, Menus , Controles y Predicados) 1. Definicin de la estructura de datos 1. Definicin de los mdulos de procesamiento Construccin: (Ambiente VISUAL PROLOG) 1. Creacin del proyecto 1. Creacin de los menus 1. Creacin de las ventanas regulares ventanas de dilogo 1. Creacin de los mdulos de programa adicionales (si fuera necesario) 1. Conexin de las opciones del menu con las ventanas y el mdulo de programa respectivos 1. Distribucin de los controles sobre las ventanas dilogos 1. Adicionar cdigo personalizado Prueba: 1. Disear el mtodo y plan de prueba 1. Identificacin de casos de prueba 1. Aplicacin del mtodo de prueba 1. Elaboracin del documento de resultados

Potrebbero piacerti anche