Manual Visual Prolog 7.5
April 18, 2017 | Author: Julio Luis Tenorio Cabrera | Category: N/A
Short Description
Download Manual Visual Prolog 7.5...
Description
Manual Visual Prolog 7.5 Julio Luis Tenorio Cabrera.
Manual Visual Prolog 7.5
INDICE
INDICE ........................................................................................................................................................................ 1 MODO CONSOLA ...................................................................................................................................................... 2 MODO GUI ................................................................................................................................................................ 35
Tenorio Cabrera Julio Luis
Página 1
Manual Visual Prolog 7.5
MODO CONSOLA Visual Prolog, es un entorno de desarrollo para Sistemas Expertos, basado en la programación lógica utilizando asimismo el mecanismo de razonamiento con encadenamiento hacia atrás para realizar el proceso de razonamiento. En Visual Prolog, no es necesario programar el proceso de razonamiento ya que, cómo se mencionó anteriormente, ya se encuentra implementado, por lo que sólo se le debe de alimentar de la experiencia, es decir del conocimiento del experto o especialista humano, para la construcción de la Base de Conocimiento del Sistema Experto que se vaya a desarrollar. Visual Prolog, permite el desarrollo de aplicaciones tanto a nivel consola como aplicaciones de tipo GUI. Para el presente manual, empezaremos explicando el desarrollo de aplicaciones a nivel consola y luego con las aplicaciones tipo GUI. Para el ingreso a Visual Prolog, hacemos doble click sobre el ícono respectivo, el que se muestra a continuación:
Figura 01: Ícono de Visual Prolog Luego observaremos la siguiente interfaz, en la que podemos crear un nuevo proyecto, abrir un proyecto de la lista de proyectos que se muestren en dicha interfaz o buscar ayuda en la wiki de Visual Prolog (http://wiki.visual-prolog.com/index.php?title=Getting%20Started). La interfaz que se muestra es:
Tenorio Cabrera Julio Luis
Página 2
Manual Visual Prolog 7.5
Figura 02: Pantalla inicial de Visual Prolog Para la creación de un nuevo proyecto (Ejercicio 01) llamado “Hola Mundo” (por el momento de tipo consola), se hace click en el botón “New Project” y en la interfaz que aparece se escriben los datos necesario para el proyecto, tal como se muestra a continuación: (no olvidar que el tipo de proyecto “Project Kind” es “Console Application”)
Tenorio Cabrera Julio Luis
Página 3
Manual Visual Prolog 7.5
Figura 03: Pantalla de datos del proyecto del ejercicio 01 Luego de haber registrado los datos respectivos, se hace click en el botón Finish con lo que aparecerá la siguiente interfaz y a la vez Visual Prolog compilará por defecto la aplicación que se está desarrollando, mostrándose en la ventana “Messages” el proceso de compilación y finalmente mostrándose el mensaje “Project has been built” es decir que el “Proyecto ha sido construido”:
Tenorio Cabrera Julio Luis
Página 4
Manual Visual Prolog 7.5
Figura 04: Pantalla de estructura del proyecto del ejercicio 01 En este punto es importante explicar el contenido de la ventana del proyecto en donde se observan dos carpetas, una que lleva el nombre del proyecto, en este caso “Hola Mundo” y la otra $(ProDir). La carpeta “Hola Mundo” contiene los archivos del proyecto que se deben de trabajar por parte del desarrollador del proyecto, como por ejemplo los archivos: “Hola Mundo.vipprj”, “main.cl”, “main.manifest”, “main.pack”, “main.ph”, “main.pro”, etc., y la carpeta $(ProDir) contiene dos carpetas: “lib” y “pfc” que contienen las librerías a ser utilizadas en el proyecto. Por ejemplo el archivo main.pack, se relaciona con la carpeta “pfc” (que está dentro de la carpeta “$(ProDir”), ya que incluye a algunos paquetes y archivos que la carpeta “pfc” contiene. Asimismo el archivo “main.pack” también contiene al archivo “main.ph” y “main.pro”. Esto se muestra a continuación:
Tenorio Cabrera Julio Luis
Página 5
Manual Visual Prolog 7.5
#include @"main.ph" % privately used packages #include @"pfc\console\console.ph" #include @"pfc\core.ph" % private interfaces % private classes % implementations #include @"main.pro"
Asimismo por ejemplo, el archivo main.ph, requiere al archivo main.pack e incluye también al archivo “core.pro” de la carpeta “pfc” y al archivo main.cl. Se debe hacer mención que el archivo “core.pro”, es fundamental ya que contiene todos los predicados para el funcionamiento de un programa por ejemplo, la definición de los tipos de datos. Esto se muestra a continuación: #requires @"main.pack" % publicly used packages #include @"pfc\core.ph" % exported interfaces % exported classes #include @"main.cl"
El archivo main.cl, contiene la declaración del predicado run, el que se va a definir en main.pro. Esto se muestra a continuación: class main open core predicates run : core::runnable. end class main
El archivo main.manifest contiene el código XML del proyecto tal como se muestra a continuación:
Tenorio Cabrera Julio Luis
Página 6
Manual Visual Prolog 7.5
El archivo “console.pro”, que está ubicado en la carpeta “console” de la carpeta “pfc”, contiene por ejemplo al predicado “write”. Esto se puede verificar visualizando el archivo “consola.pro”, desde el Visual Prolog. Ahora, continuando con el desarrollo del programa “Hola Mundo”, se procede a escribir el código respectivo en el archivo “main.pro”, ya que es el archivo que contiene el código fuente principal de la aplicación cuando se trabaja en modo consola. Entonces se hace doble click sobre el archivo “main.pro” con lo que se muestra el siguiente código:
Tenorio Cabrera Julio Luis
Página 7
Manual Visual Prolog 7.5
implement main open core clauses run() :succeed. % place your own code here end implement main goal console::runUtf8(main::run).
Ahora se procede a completar el código por defecto tal como se muestra a continuación: implement main open core clauses run() :console::write("Hola Mundo..."), _=console::readChar(). end implement main goal console::runUtf8(main::run).
Otra versión del programa “Hola Mundo”, que es la que usaremos de ahora en adelante en el presente manual, es la que se muestra a continuación: implement main open core,console clauses run() :write("Hola Mundo..."), _=readChar(). end implement main goal console::runUtf8(main::run).
Lo que sucede es que se ha incluido la carpeta “console” de la carpeta “pfc” ya explicada anteriormente, con lo que ya no es necesario estar escribiendo la palabra “console” cuando se use el predicado “write” o el predicado “readChar”. Ahora, para ejecutar la aplicación y observar los resultados, se hace click en la opción “Build”, luego en la subopción “Build”, con lo que si no Tenorio Cabrera Julio Luis
Página 8
Manual Visual Prolog 7.5
existen inconvenientes, Visual Prolog enviará el mensaje: “Project has been built” y luego se selecciona la subopción “Execute” ubicada en la opción del menú principal: “Build”, con lo que se mostrará el resultado de la ejecución de la aplicación “Hola Mundo”, tal como se muestra a continuación:
Figura 05: Pantalla visualización de resultado de la ejecución del proyecto del ejercicio 01 Luego para terminar la ejecución de la aplicación se presiona la tecla “Enter”. Ejercicio 02: Desarrollar una aplicación que solicite un nombre y le envíe un saludo incluido el nombre ingresado.
Solución: Se muestra el código de “main.pro”:
Tenorio Cabrera Julio Luis
Página 9
Manual Visual Prolog 7.5
implement main open core, console clauses run() :write("Ingrese su nombre por favor:"), User=readLine(), write("Bienvenido ",User," presiona por favor una tecla para continuar..."), _=readChar(). end implement main goal console::runUtf8(main::run).
Ejercicio 03: Desarrollar una aplicación que muestre la capital de un Departamento.
Solución:
En la solución del presente programa se utilizará la variable anónima o blanca o no ligada, que se representa con el guion bajo o underscore (_) el cuál se utiliza para ignorar el valor que se capture con el predicado readChar(), ya que para el caso presente no es de interés. Asimismo se utiliza el predicado corte (!) el que evitará que el motor de inferencia de Visual Prolog ejecute la otra implementación del predicado “run” ya que éste se debería ejecutar cuando la primera implementación de “run” falle. Se muestra el código de “main.pro”:
Tenorio Cabrera Julio Luis
Página 10
Manual Visual Prolog 7.5
implement main open core, console class facts capital : (string,string). clauses capital("La Libertad","Trujillo"). run() :write("A continuación mostraré la capital de un Departamento, por favor presione una tecla para continuar..."), _=readChar(), capital(X,Y), write("La capital de ",X," es: ",Y), _=readChar(), !. run(). end implement main goal console::runUtf8(main::run).
Ejercicio 04: Desarrollar una aplicación que muestre la capital de un Departamento el que será ingresada por teclado, y en el caso que no se conozca la capital, se debe enviar un mensaje al usuario.
Solución: Se muestra el código de “main.pro”:
Tenorio Cabrera Julio Luis
Página 11
Manual Visual Prolog 7.5
implement main open core,console class facts capital : (string,string). clauses capital("La Libertad","Trujillo"). capital("Lambayeque","Chiclayo"). capital("Lima","Lima"). capital("Piura","Piura"). run() :write("A continuación mostraré cuál es la capital de un Departamento, ingrese el nombre del Departamento:"), Dpto=readLine(), capital(Dpto,Capi), write("La capital de ",Dpto," es: ",Capi), _=readChar(), !. run():write("Lo siento no conozco la capital para el Departamento ingresado..."), _=readChar(). end implement main goal console::runUtf8(main::run).
Ejercicio 05: Desarrollar una aplicación que muestre la capital de un Departamento el que será ingresada por teclado, y en el caso que no se conozca la capital, se debe enviar un mensaje al usuario conteniendo el nombre del Departamento.
Solución: Se muestra el código de “main.pro”:
Tenorio Cabrera Julio Luis
Página 12
Manual Visual Prolog 7.5
implement main open core,console class predicates busca_capital : (string). class facts capital : (string,string). clauses capital("La Libertad","Trujillo"). capital("Lambayeque","Chiclayo"). capital("Lima","Lima"). capital("Piura","Piura"). run() :write("A continuación mostraré cuál es la capital de un Departamento, ingrese el nombre del Departamento:"), Dpto=readLine(), busca_capital(Dpto). busca_capital(Dpto):capital(Dpto,Capi), write("La capital de ",Dpto," es: ",Capi), _=readChar(), !. busca_capital(Dpto):write("Lo siento no conozco la capital para el Departamento ",Dpto), _=readChar(). end implement main goal console::runUtf8(main::run).
Tenorio Cabrera Julio Luis
Página 13
Manual Visual Prolog 7.5
El predicado “fail” conocido como el predicado opuesto al predicado corte “!”, fuerza a que Visual Prolog ejecute el backtracking, es decir, hace que Visual Prolog ejecute todas las implementaciones de una regla de conocimiento. A continuación se muestra un ejemplo en el ejercicio 06.
Ejercicio 06: Desarrollar una aplicación que muestre las capitales de un número determinado de países, mostrando un mensaje de culminación cuando ya no encuentre más países en la Base de Conocimiento.
Solución: Se muestra el código en “main.pro”: implement main open core,console class facts capital : (string,string). clauses capital("Perú","Lima"). capital("Chile","Santiago de Chile"). capital("Bolivia","La Paz"). capital("Ecuador","Quito"). run() :write("A continuación mostraré las capitales de los países registrados en la Base de Conocimiento"), nl, capital(P,C), write("La capital de ",P," es ",C), nl, fail. run():write("Es todo lo que tengo registrado en la Base de Conocimiento"), _=readChar(). end implement main goal console::runUtf8(main::run).
El predicado “nondeterm” modifica la naturaleza determinística que por defecto posee una regla de conocimiento, es decir, cuando se declara una regla de conocimiento, siempre Visual Prolog, Tenorio Cabrera Julio Luis
Página 14
Manual Visual Prolog 7.5
espera que se construya por lo menos dos implementaciones de la regla de conocimiento ya que si una de ellas falla se ejecuta la siguiente implementación de la regla. Entonces cuando no se desea construir otra implementación de una regla de conocimiento, se utiliza el predicado “nondeterm” cuando se declara la regla. Esto se muestra en el siguiente ejemplo.
Ejercicio 07: Desarrollar una aplicación que muestre las capitales de un número determinado de ciudades, mostrando un mensaje de culminación cuando ya no encuentre más ciudades en la Base de Conocimiento.
Solución: Se muestra el código en “main.pro”:
Tenorio Cabrera Julio Luis
Página 15
Manual Visual Prolog 7.5
implement main open core,console class predicates busca_capital : () nondeterm. class facts capital : (string,string). clauses capital("La Libertad","Trujillo"). capital("Lambayeque","Chiclayo"). capital("Lima","Lima"). capital("Piura","Piura"). busca_capital():capital(Dpto,Capi), write("La capital de ",Dpto," es: ",Capi), nl. run() :busca_capital(), fail. run():write("Eso es todo lo que tengo en la Base de Conocimiento"), _=readChar(). end implement main goal console::runUtf8(main::run).
El predicado “anyflow”, se utiliza cuando se va en una regla de conocimiento no vas a existir restricciones en los tipos de argumentos de la misma, es decir, los argumentos pueden estar o no ligados a un valor por defecto o por algún asignación particular. Esto se muestra en el siguiente ejemplo.
Ejercicio 08: Desarrollar una aplicación que muestre los lugares que le agrada visitar a un esposo siempre y cuando estos lugares sean del agrado de su esposa.
Solución: Se muestra el código en “main.pro”:
Tenorio Cabrera Julio Luis
Página 16
Manual Visual Prolog 7.5
implement main open core,console class predicates le_gusta_al_esposo : (string,string) nondeterm anyflow. class facts le_gusta_a_la_esposa : (string,string). clauses le_gusta_a_la_esposa("Lucy","Cine"). le_gusta_a_la_esposa("Lucy","Discoteca"). le_gusta_a_la_esposa("Isabel","Playas"). le_gusta_al_esposo(Esposo,Lugar):le_gusta_a_la_esposa(Esposa,Lugar), nl. run() :le_gusta_al_esposo("Luis",Lugar), write("A Luis le gusta ",Lugar), fail. run():nl, write("Eso es todo lo que le gusta al esposo"), _=readChar(). end implement main goal console::runUtf8(main::run).
Con respecto al ejercicio 08, debe aclararse que el predicado “anyflow” debe utilizarse con mucho cuidado, claro esto depende de las condiciones del problema, ya que podría mostrar en los resultados alguna “incoherencia” como la mostrada en el ejercicio en mención. Uno de los tipos de datos que ofrece Visual Prolog, es “string_list”, el cual se caracteriza por permitir el manejo de los clásicos arreglos, en este caso de caracteres. A continuación el siguiente Ejercicio 09 muestra la aplicación de este tipo de dato.
Ejercicio 09:
Tenorio Cabrera Julio Luis
Página 17
Manual Visual Prolog 7.5
implement main open core,console class facts soyunstringlist : (string_list). clauses soyunstringlist(["algo01","algo02"]). soyunstringlist(["algo03"]). run() :soyunstringlist(TipoString), write(TipoString), nl, fail. run():_=readChar(). end implement main goal console::runUtf8(main::run).
Así también Visual Prolog, ofrece otro tipo de datos que es “unsigned”, el cual se caracteriza por solamente permitir datos de tipo entero positivo (incluyendo el cero). A continuación el Ejercicio 10 muestra la aplicación de este tipo de dato.
Ejercicio 10: implement main open core,console class facts soyununsigned : (unsigned). clauses soyununsigned(1). soyununsigned(0). run() :soyununsigned(TipoUnsigned), write(TipoUnsigned), nl, fail. run():_=readChar(). end implement main goal console::runUtf8(main::run).
Tenorio Cabrera Julio Luis
Página 18
Manual Visual Prolog 7.5
Así también se puede utilizar otro tipo de dato que ofrece Visual Prolog, como es “unsigned_list”, el cual se usa igual que “string_list”, pero con números enteros positivos incluyendo el cero. Por otro lado Visual Prolog ofrece los otros tipos de datos clásicos que otros lenguajes ofrecen como integer, real, char, etc., para cada uno de los cuales permite implementar también listas, es decir por ejemplo: integer_list, real_list, char_list, etc. Visual Prolog ofrece la conversión de tipos de datos entre sí, por ejemplo para convertir el proceso de convertir el string “20” a número se observa el Ejercicio 11 y para convertir de número a string se observa el Ejercicio 12. Ejercicio 11: implement main open core,console clauses run() :ValorString="20", ValorNumero= toTerm(ValorString) + 0, write("En número es:", ValorNumero), fail. run():_=readChar(). end implement main goal console::runUtf8(main::run).
Tenorio Cabrera Julio Luis
Página 19
Manual Visual Prolog 7.5
Ejercicio 12: implement main open core,console clauses run() :ValorNumero=20, ValorString= toString(ValorNumero), write("En String es:", ValorString), fail. run():_=readChar(). end implement main goal console::runUtf8(main::run).
Visual Prolog, ofrece también predicados para el manejo de cadenas, tal como lo muestra el Ejercicio 13.
Ejercicio 13: implement main open core,console clauses run() :Cadena="Luis Tenorio", PartedeCadena= string::subChar(Cadena,5), write("El caracter estraído es:", PartedeCadena), fail. run():_=readChar(). end implement main goal console::runUtf8(main::run).
Visual Prolog, dentro de la estructura de un programa permite el uso de la sección: domains, esta sección permite declarar los tipos de argumentos que se utilizarán en un hecho o regla de conocimiento. El Ejercicio 14 muestra el uso de domains.
Tenorio Cabrera Julio Luis
Página 20
Manual Visual Prolog 7.5
Ejercicio 14: implement main open core,console domains nombre = string. class facts persona : (nombre). clauses persona("Luis"). persona("Isabel"). run() :persona(Nombre), write("Personas registrada:", Nombre), nl, fail. run():_=readChar(). end implement main goal console::runUtf8(main::run).
Un objeto dominio, puede ser declarado para que asuma más de un valor en momentos distintos. El Ejercicio 15 muestra lo mencionado:
Tenorio Cabrera Julio Luis
Página 21
Manual Visual Prolog 7.5
Ejercicio 15: implement main open core,console domains cargo = operativo;administrativo;gerencial. class facts labora : (string,cargo). clauses labora("Jorge",operativo). labora("Manuel",administrativo). labora("Carla",gerencial). run() :labora(Colaborador,Cargo), write(Colaborador," ocupa un cargo ",Cargo), nl, fail. run():_=readChar(). end implement main goal console::runUtf8(main::run).
Tenorio Cabrera Julio Luis
Página 22
Manual Visual Prolog 7.5
En Visual Prolog, es posible asignar varios tipos de dominios a un argumento de un predicado. Esto se observa en el Ejercicio 16.
Ejercicio 16: implement main open core,console domains datos = nombre(string) ; apellidos(string) ; edad(integer). class facts persona : (datos). clauses persona(nombre("Luis")). persona(apellidos("Tenorio")). persona(edad(83)). run() :persona(nombre(N)), persona(apellidos(A)), persona(edad(E)), write("Los datos son:"), nl, write("Nombre: ",N), nl, write("Apelliidos: ",A), nl, write("Edad: ",E), nl, fail. run():write("Es todo lo que puedo mostrar..."), _=readChar(). end implement main goal console::runUtf8(main::run).
En Visual Prolog, es posible asignar a un predicado varios tipos de dominio asignado a un solo objeto de tipo dominio. Esto se observa en el Ejercicio 17.
Ejercicio 17:
Tenorio Cabrera Julio Luis
Página 23
Manual Visual Prolog 7.5
implement main open core,console domains datos = nombre(string) ; apellidos(string) ; edad(integer). class facts persona : (datos,datos,datos). clauses persona(nombre("Luis"),nombre("Rafael"),nombre("Alfredo")). persona(apellidos("Tenorio"),apellidos("Lozada"),apellidos("Cabrera")). persona(edad(83),edad(90),edad(45)). run() :persona(nombre(N),nombre(M),nombre(O)), persona(apellidos(A),apellidos(B),apellidos(C)), persona(edad(E),edad(F),edad(G)), write("Los NOMBRES son:",N," ",M," ",O),nl, write("Los APELIDOS son:",A," ",B," ",C),nl, write("Las EDADES son:",E," ",F," ",G),nl, fail. run():write("Es todo lo que puedo mostrar..."), _=readChar(). end implement main goal console::runUtf8(main::run).
Como se había referenciado en el Ejercicio 11, Visual Prolog ofrece la conversión de tipos de datos entre sí, por ejemplo para convertir el proceso de convertir el string “20” a número entero se observa el Ejercicio 18. Debe hacerse mención que en esta oportunidad se utilizará otro predicado llamado “hasDomain”, el que permitirá hacer la conversión mencionada anteriormente.
Tenorio Cabrera Julio Luis
Página 24
Manual Visual Prolog 7.5
Ejercicio 18: implement main open core,console clauses run() :ValorString="20", hasDomain(integer,ValorNumero), ValorNumero= toTerm(ValorString), write("En número original ",ValorNumero," incrementado en 40 es: ", ValorNumero+40), fail. run():_=readChar(). end implement main goal console::runUtf8(main::run).
Otro uso del predicado “hasDomain” es cuando se desea leer un dato por teclado tal como lo muestra el Ejercicio 19.
Ejercicio 19: implement main open core,console clauses run() :hasDomain(real,ValorNumero), write("Ingrese un valor:"), ValorNumero= read(), write("En número original ",ValorNumero," incrementado en 40.5 es: ", ValorNumero+40.5), _=readChar(), fail. run():_=readChar(). end implement main goal console::runUtf8(main::run).
Tenorio Cabrera Julio Luis
Página 25
Manual Visual Prolog 7.5
Visual Prolog ofrece un predicado llamado readString, el que permite leer un número limitado y obligatorio de caracteres por teclado, por ejemplo, si se quiere ingresar obligatoriamente una cantidad de 8 caracteres, se escribiría readString(8), por lo que en el caso de ingresar una cantidad menor que la dimension indicada por mas que se presione la tecla enter, la aplicación esperará a que se complete la cantidad de caracteres indicados en readString, y en el caso de ingresar una cantidad mayor de caracteres, el siguiente caracter que esté fuera de la dimension será tomado como el haber presionado la tecla enter. Esto se muestra por ejemplo en el Ejercicio 20. Es necesario el uso del predicado stdio.
Ejercicio 20: implement main open core,console clauses run() :write("Ingrese una cadena no mayor de 8 caracteres :"), Cadena= stdio::readString(8), write("La cadena finalmente quedó así ",Cadena), _=readChar(), fail. run():_=readChar(). end implement main goal console::runUtf8(main::run).
En Visual Prolog, las condicionales también están presentes, como el caso de if – then – end if, el cuál se comporta de la misma manera que en los demás lenguajes de programación. Una aplicación de la condicional if – then – end if, se muestra en el Ejercicio 21.
Ejercicio 21:
Tenorio Cabrera Julio Luis
Página 26
Manual Visual Prolog 7.5
implement main open core,console class predicates evalua : () nondeterm anyflow. clauses evalua():write("Ingrese un número menor a 20:"), hasDomain(integer,Numero), Numero=read(), if(Numero
View more...
Comments