49
Manual Visual Prolog 7.5 Julio Luis Tenorio Cabrera.

Manual Visual Prolog 7.5 - I Parte

Embed Size (px)

DESCRIPTION

Este texto es una contribución al aprendizaje de Visual Prolog.

Citation preview

Manual Visual Prolog 7.5

Manual Visual Prolog 7.5

INDICE

INDICE1MODO CONSOLA2SESIN 012Figura 01: cono de Visual Prolog2Figura 02: Pantalla inicial de Visual Prolog3Figura 03: Pantalla de datos del proyecto del ejercicio 014Figura 04: Pantalla de estructura del proyecto del ejercicio 015Figura 05: Pantalla visualizacin de resultado de la ejecucin del proyecto del ejercicio 019SESIN 0214SESIN 0323SESIN 0430MODO GUI35SESIN 0535

MODO CONSOLASESIN 01

Visual Prolog, es un entorno de desarrollo para Sistemas Expertos, basado en la programacin lgica utilizando asimismo el mecanismo de razonamiento con encadenamiento hacia atrs para realizar el proceso de razonamiento.

En Visual Prolog, no es necesario programar el proceso de razonamiento ya que, cmo se mencion anteriormente, ya se encuentra implementado, por lo que slo se le debe de alimentar de la experiencia, es decir del conocimiento del experto o especialista humano, para la construccin 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 continuacin:

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:

Figura 02: Pantalla inicial de Visual Prolog

Para la creacin de un nuevo proyecto (Ejercicio 01) llamado Hola Mundo (por el momento de tipo consola), se hace click en el botn New Project y en la interfaz que aparece se escriben los datos necesario para el proyecto, tal como se muestra a continuacin: (no olvidar que el tipo de proyecto Project Kind es Console Application)

Figura 03: Pantalla de datos del proyecto del ejercicio 01

Luego de haber registrado los datos respectivos, se hace click en el botn Finish con lo que aparecer la siguiente interfaz y a la vez Visual Prolog compilar por defecto la aplicacin que se est desarrollando, mostrndose en la ventana Messages el proceso de compilacin y finalmente mostrndose el mensaje Project has been built es decir que el Proyecto ha sido construido:

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 libreras 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 tambin contiene al archivo main.ph y main.pro. Esto se muestra a continuacin:

#include@"main.ph"%privatelyusedpackages#include@"pfc\console\console.ph"#include@"pfc\core.ph"%privateinterfaces%privateclasses%implementations#include@"main.pro"

Asimismo por ejemplo, el archivo main.ph, requiere al archivo main.pack e incluye tambin al archivo core.pro de la carpeta pfc y al archivo main.cl. Se debe hacer mencin que el archivo core.pro, es fundamental ya que contiene todos los predicados para el funcionamiento de un programa por ejemplo, la definicin de los tipos de datos. Esto se muestra a continuacin:

#requires@"main.pack"%publiclyusedpackages#include@"pfc\core.ph"%exportedinterfaces%exportedclasses#include@"main.cl"

El archivo main.cl, contiene la declaracin del predicado run, el que se va a definir en main.pro. Esto se muestra a continuacin:

classmainopencorepredicatesrun:core::runnable.endclassmain

El archivo main.manifest contiene el cdigo XML del proyecto tal como se muestra a continuacin:

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 cdigo respectivo en el archivo main.pro, ya que es el archivo que contiene el cdigo fuente principal de la aplicacin cuando se trabaja en modo consola. Entonces se hace doble click sobre el archivo main.pro con lo que se muestra el siguiente cdigo:

implementmainopencoreclausesrun():-succeed.%placeyourowncodehereendimplementmaingoalconsole::runUtf8(main::run).

Ahora se procede a completar el cdigo por defecto tal como se muestra a continuacin:

implementmainopencoreclausesrun():- console::write("HolaMundo..."),_=console::readChar().endimplementmaingoalconsole::runUtf8(main::run).

Otra versin del programa Hola Mundo, que es la que usaremos de ahora en adelante en el presente manual, es la que se muestra a continuacin:

implementmainopencore,consoleclausesrun():-write("HolaMundo..."),_=readChar().endimplementmaingoalconsole::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 aplicacin y observar los resultados, se hace click en la opcin Build, luego en la subopcin Build, con lo que si no existen inconvenientes, Visual Prolog enviar el mensaje: Project has been built y luego se selecciona la subopcin Execute ubicada en la opcin del men principal: Build, con lo que se mostrar el resultado de la ejecucin de la aplicacin Hola Mundo, tal como se muestra a continuacin:

Figura 05: Pantalla visualizacin de resultado de la ejecucin del proyecto del ejercicio 01

Luego para terminar la ejecucin de la aplicacin se presiona la tecla Enter.

Ejercicio 02: Desarrollar una aplicacin que solicite un nombre y le enve un saludo incluido el nombre ingresado.

Solucin:Se muestra el cdigo de main.pro:implementmainopencore,consoleclausesrun():-write("Ingresesunombreporfavor:"),User=readLine(),write("Bienvenido",User,"presionaporfavorunateclaparacontinuar..."),_=readChar().endimplementmaingoalconsole::runUtf8(main::run).

Ejercicio 03: Desarrollar una aplicacin que muestre la capital de un Departamento.

Solucin:

En la solucin del presente programa se utilizar la variable annima o blanca o no ligada, que se representa con el guion bajo o underscore (_) el cul se utiliza para ignorar el valor que se capture con el predicado readChar(), ya que para el caso presente no es de inters. Asimismo se utiliza el predicado corte (!) el que evitar que el motor de inferencia de Visual Prolog ejecute la otra implementacin del predicado run ya que ste se debera ejecutar cuando la primera implementacin de run falle.Se muestra el cdigo de main.pro:

implementmainopencore,consoleclassfactscapital:(string,string).clausescapital("LaLibertad","Trujillo").run():-write("AcontinuacinmostrarlacapitaldeunDepartamento,porfavorpresioneunateclaparacontinuar..."),_=readChar(),capital(X,Y),write("Lacapitalde",X,"es:",Y),_=readChar(),!.run().endimplementmaingoalconsole::runUtf8(main::run).

Ejercicio 04: Desarrollar una aplicacin 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.

Solucin:

Se muestra el cdigo de main.pro:

implementmainopencore,consoleclassfactscapital:(string,string).clausescapital("LaLibertad","Trujillo").capital("Lambayeque","Chiclayo").capital("Lima","Lima").capital("Piura","Piura").run():-write("AcontinuacinmostrarculeslacapitaldeunDepartamento,ingreseelnombredelDepartamento:"),Dpto=readLine(),capital(Dpto,Capi),write("Lacapitalde",Dpto,"es:",Capi),_=readChar(),!.run():-write("LosientonoconozcolacapitalparaelDepartamentoingresado..."),_=readChar().endimplementmaingoalconsole::runUtf8(main::run).

Ejercicio 05: Desarrollar una aplicacin 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.

Solucin:

Se muestra el cdigo de main.pro:

implementmainopencore,consoleclasspredicatesbusca_capital:(string).classfactscapital:(string,string).clausescapital("LaLibertad","Trujillo").capital("Lambayeque","Chiclayo").capital("Lima","Lima").capital("Piura","Piura").run():-write("AcontinuacinmostrarculeslacapitaldeunDepartamento,ingreseelnombredelDepartamento:"),Dpto=readLine(),busca_capital(Dpto).busca_capital(Dpto):-capital(Dpto,Capi),write("Lacapitalde",Dpto,"es:",Capi),_=readChar(),!.busca_capital(Dpto):-write("LosientonoconozcolacapitalparaelDepartamento",Dpto),_=readChar().endimplementmaingoalconsole::runUtf8(main::run).

SESIN 02

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 continuacin se muestra un ejemplo en el ejercicio 06.

Ejercicio 06: Desarrollar una aplicacin que muestre las capitales de un nmero determinado de pases, mostrando un mensaje de culminacin cuando ya no encuentre ms pases en la Base de Conocimiento.

Solucin:

Se muestra el cdigo en main.pro:

implementmainopencore,consoleclassfactscapital:(string,string).clausescapital("Per","Lima").capital("Chile","SantiagodeChile").capital("Bolivia","LaPaz").capital("Ecuador","Quito").run():-write("AcontinuacinmostrarlascapitalesdelospasesregistradosenlaBasedeConocimiento"),nl,capital(P,C),write("Lacapitalde",P,"es",C),nl,fail.run():-write("EstodoloquetengoregistradoenlaBasedeConocimiento"),_=readChar().endimplementmaingoalconsole::runUtf8(main::run).

El predicado nondeterm modifica la naturaleza determinstica que por defecto posee una regla de conocimiento, es decir, cuando se declara una regla de conocimiento, siempre Visual Prolog, 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 implementacin de la regla. Entonces cuando no se desea construir otra implementacin 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 aplicacin que muestre las capitales de un nmero determinado de ciudades, mostrando un mensaje de culminacin cuando ya no encuentre ms ciudades en la Base de Conocimiento.

Solucin:

Se muestra el cdigo en main.pro:

implementmainopencore,consoleclasspredicatesbusca_capital:()nondeterm.classfactscapital:(string,string).clausescapital("LaLibertad","Trujillo").capital("Lambayeque","Chiclayo").capital("Lima","Lima").capital("Piura","Piura").busca_capital():-capital(Dpto,Capi),write("Lacapitalde",Dpto,"es:",Capi),nl.run():-busca_capital(),fail.run():-write("EsoestodoloquetengoenlaBasedeConocimiento"),_=readChar().endimplementmaingoalconsole::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 algn asignacin particular. Esto se muestra en el siguiente ejemplo.

Ejercicio 08: Desarrollar una aplicacin que muestre los lugares que le agrada visitar a un esposo siempre y cuando estos lugares sean del agrado de su esposa.

Solucin:

Se muestra el cdigo en main.pro:

implementmainopencore,consoleclasspredicatesle_gusta_al_esposo:(string,string)nondetermanyflow.classfactsle_gusta_a_la_esposa:(string,string).clausesle_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("ALuislegusta",Lugar),fail.run():-nl,write("Esoestodoloquelegustaalesposo"),_=readChar().endimplementmaingoalconsole::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 podra mostrar en los resultados alguna incoherencia como la mostrada en el ejercicio en mencin.

Uno de los tipos de datos que ofrece Visual Prolog, es string_list, el cual se caracteriza por permitir el manejo de los clsicos arreglos, en este caso de caracteres. A continuacin el siguiente Ejercicio 09 muestra la aplicacin de este tipo de dato.

Ejercicio 09:

implementmainopencore,consoleclassfactssoyunstringlist:(string_list).clausessoyunstringlist(["algo01","algo02"]).soyunstringlist(["algo03"]).run():-soyunstringlist(TipoString),write(TipoString),nl,fail.run():-_=readChar().endimplementmaingoalconsole::runUtf8(main::run).

As tambin 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 continuacin el Ejercicio 10 muestra la aplicacin de este tipo de dato.

Ejercicio 10:

implementmainopencore,consoleclassfactssoyununsigned:(unsigned).clausessoyununsigned(1).soyununsigned(0).run():-soyununsigned(TipoUnsigned), write(TipoUnsigned),nl,fail.run():-_=readChar().endimplementmaingoalconsole::runUtf8(main::run). As tambin 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 nmeros enteros positivos incluyendo el cero.

Por otro lado Visual Prolog ofrece los otros tipos de datos clsicos que otros lenguajes ofrecen como integer, real, char, etc., para cada uno de los cuales permite implementar tambin listas, es decir por ejemplo: integer_list, real_list, char_list, etc.

Visual Prolog ofrece la conversin de tipos de datos entre s, por ejemplo para convertir el proceso de convertir el string 20 a nmero se observa el Ejercicio 11 y para convertir de nmero a string se observa el Ejercicio 12.

Ejercicio 11:

implementmainopencore,consoleclausesrun():-ValorString="20",ValorNumero=toTerm(ValorString) + 0,write("Ennmeroes:",ValorNumero),fail.run():-_=readChar().endimplementmaingoalconsole::runUtf8(main::run).

Ejercicio 12:

implementmainopencore,consoleclausesrun():-ValorNumero=20,ValorString=toString(ValorNumero),write("EnStringes:",ValorString),fail.run():-_=readChar().endimplementmaingoalconsole::runUtf8(main::run).

Visual Prolog, ofrece tambin predicados para el manejo de cadenas, tal como lo muestra el Ejercicio 13.

Ejercicio 13:

implementmainopencore,consoleclausesrun():-Cadena="LuisTenorio",PartedeCadena=string::subChar(Cadena,5),write("Elcaracterestradoes:",PartedeCadena),fail.run():-_=readChar().endimplementmaingoalconsole::runUtf8(main::run).

Visual Prolog, dentro de la estructura de un programa permite el uso de la seccin: domains, esta seccin permite declarar los tipos de argumentos que se utilizarn en un hecho o regla de conocimiento. El Ejercicio 14 muestra el uso de domains.

Ejercicio 14:

implementmainopencore,consoledomainsnombre=string.classfactspersona:(nombre).clausespersona("Luis").persona("Isabel").run():-persona(Nombre),write("Personasregistrada:",Nombre),nl,fail.run():-_=readChar().endimplementmaingoalconsole::runUtf8(main::run).

Un objeto dominio, puede ser declarado para que asuma ms de un valor en momentos distintos. El Ejercicio 15 muestra lo mencionado:

Ejercicio 15:

implementmainopencore,consoledomainscargo=operativo;administrativo;gerencial.classfactslabora:(string,cargo).clauseslabora("Jorge",operativo).labora("Manuel",administrativo).labora("Carla",gerencial).run():-labora(Colaborador,Cargo),write(Colaborador,"ocupauncargo",Cargo),nl,fail.run():-_=readChar().endimplementmaingoalconsole::runUtf8(main::run).

SESIN 03

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:

implementmainopencore,consoledomainsdatos=nombre(string);apellidos(string);edad(integer).classfactspersona:(datos).clausespersona(nombre("Luis")).persona(apellidos("Tenorio")).persona(edad(83)).run():-persona(nombre(N)),persona(apellidos(A)),persona(edad(E)),write("Losdatosson:"), nl,write("Nombre:",N),nl,write("Apelliidos:",A),nl,write("Edad:",E),nl,fail.run():-write("Estodoloquepuedomostrar..."),_=readChar().endimplementmaingoalconsole::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:

implementmainopencore,consoledomainsdatos=nombre(string);apellidos(string);edad(integer).classfactspersona:(datos,datos,datos).clausespersona(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("LosNOMBRESson:",N,"",M,"",O),nl,write("LosAPELIDOSson:",A,"",B,"",C),nl,write("LasEDADESson:",E,"",F,"",G),nl,fail.run():-write("Estodoloquepuedomostrar..."),_=readChar().endimplementmaingoalconsole::runUtf8(main::run).

Como se haba referenciado en el Ejercicio 11, Visual Prolog ofrece la conversin de tipos de datos entre s, por ejemplo para convertir el proceso de convertir el string 20 a nmero entero se observa el Ejercicio 18. Debe hacerse mencin que en esta oportunidad se utilizar otro predicado llamado hasDomain, el que permitir hacer la conversin mencionada anteriormente.

Ejercicio 18:

implementmainopencore,consoleclausesrun():-ValorString="20",hasDomain(integer,ValorNumero),ValorNumero=toTerm(ValorString),write("Ennmerooriginal",ValorNumero,"incrementadoen40es:",ValorNumero+40),fail.run():-_=readChar().endimplementmaingoalconsole::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:

implementmainopencore,consoleclausesrun():-hasDomain(real,ValorNumero),write("Ingreseunvalor:"),ValorNumero=read(),write("Ennmerooriginal",ValorNumero,"incrementadoen40.5es:",ValorNumero+40.5),_=readChar(),fail.run():-_=readChar().endimplementmaingoalconsole::runUtf8(main::run).

Visual Prolog ofrece un predicado llamado readString, el que permite leer un nmero limitado y obligatorio de caracteres por teclado, por ejemplo, si se quiere ingresar obligatoriamente una cantidad de 8 caracteres, se escribira 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 aplicacin 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:

implementmainopencore,consoleclausesrun():-write("Ingreseunacadenanomayorde8caracteres:"),Cadena=stdio::readString(8),write("Lacadenafinalmentequedas",Cadena),_=readChar(),fail.run():-_=readChar().endimplementmaingoalconsole::runUtf8(main::run).

En Visual Prolog, las condicionales tambin estn presentes, como el caso de if then end if, el cul se comporta de la misma manera que en los dems lenguajes de programacin. Una aplicacin de la condicional if then end if, se muestra en el Ejercicio 21.

Ejercicio 21:

implementmainopencore,consoleclasspredicatesevalua:()nondetermanyflow.clausesevalua():-write("Ingreseunnmeromenora20:"),hasDomain(integer,Numero),Numero=read(),if(Numero