prolog

Embed Size (px)

Citation preview

  • 58 users.code

    [white paper]

    a programacin lgica, junto con la funcional, forma parte de lo que se co-noce como programacin declarativa. En los lenguajes tradicionales, laprogramacin consiste en indicar cmo resolver un problema mediante sen-

    tencias; en la programacin lgica, se trabaja de una forma descriptiva, establecien-do relaciones entre entidades, indicando no cmo, sino qu hacer. La ecuacin de Ro-bert Kowalski (Universidad de Edimburgo) establece la idea esencial de la programa-cin lgica: algoritmos = lgica + control. Es decir, un algoritmo se construye especi-ficando conocimiento en un lenguaje formal (lgica de primer orden), y el problemase resuelve mediante un mecanismo de inferencia (control) que acta sobre aqul.

    PrologEl lenguaje Prolog, principal representante del paradigma, se basa en un subconjun-

    to de la lgica de primer orden (restriccin de la forma clausal de la lgica denomi-nada clusulas de Horn). Philippe Roussel y Alain Colmerauer (Universidad de Aix-Marseille) lo crearon en 1972, y su base terica se debe en gran parte a Kowalski.

    Estructuras bsicasProlog cuenta con dos tipos de estructuras: trminos y sentencias. Los trminos

    pueden ser constantes, variables o functores:

    > Las constantes, representadas por una cadena de caracteres, pueden ser nme-ros o cualquier cadena que comience en minscula.

    > Las variables son cadenas que comienzan con una letra mayscula.

    > Los functores son identificadores que em-piezan con minscula, seguidos de unalista de parmetros (trminos) entre pa-rntesis, separados por comas.

    Las sentencias son reglas o clusulas. Hayhechos, reglas con cabeza y cola, y consultas.

    > Un hecho establece una relacin entreobjetos, y es la forma ms sencilla desentencia. Por ejemplo:

    humano (socrates).ama (juan,mara)

    Se establece que Scrates es humano yque Juan ama a Mara.

    > Una regla permite definir nuevas relacio-nes a partir de otras ya existentes. Si que-remos establecer que todo humano esmortal, en lgica estndar escribiramosV(x)(humano(x)=>mortal(x)), mientras queen Prolog escribimos:

    mortal(X):-humano(X).

    > Esto se lee: X (variable) es mortal si X eshumano. El smbolo :- significa si o, silo leemos de derecha a izquierda, enton-ces o implica. En esta regla, mortal(X) esla cabeza, y humano(X) es el cuerpo.

    > Para entender el concepto de consulta,veamos un ejemplo. En lgica estndar:

    > V(x)(humano(x)=>mortal(x))> humano(socrates)> entonces mortal (socrates)

    > Partiendo de que los humanos son mor-tales y de que Scrates es humano,deducimos que Scrates es mortal. Pararealizar esa deduccin en Prolog, hayque preguntar si es mortal Scrates, oquin es mortal. Si del programa lgi-co (conjunto de hechos y reglas) sededuce que Scrates es mortal, enton-ces sa ser la respuesta que obtendre-mos. Veamos el programa:

    Programacin lgicaUn recorrido por la programacin lgica y uno de sus lenguajes msrepresentativos: Prolog, clsico de la inteligencia artificial, que se aplica de mltiples formas en el desarrollo de software comercial.

    L

    Poste 1 Poste 2 Poste 3

    [Figura 1] Problema y resolucin de las torres de Hanoi.

  • 59

    GERARDO ROSSELInvestigador del [email protected]

    mortal(X):-humano(X).humano(Scrates).

    Para preguntar interactivamente, los ambientes de Prolog tienen unlistener, un intrprete de lnea de comando cuyo prompt es un signode pregunta. Se introduce una sentencia (eventualmente con varia-bles), y Prolog intentar demostrarla (usando un algoritmo de inferen-cia llamado SLD-Resolution, basado en la regla de resolucin deRobinson), buscando adems constantes que puedan reemplazar lasvariables de la pregunta. Las preguntas de nuestro ejemplo seran:

    ?- mortal(Scrates).Yes.

    ?- mortal(X)X = socrates

    Las segundas lneas son las respuestas de Prolog: primero, afirman-do que s, Scrates es mortal; despus, contestando Scrates al pregun-tar quin es mortal. Si agregamos ms conocimiento a nuestro progra-ma lgico (por ejemplo, que Platn es mortal), podemos pedir ms res-puestas. Si luego de obtener Scrates escribimos un punto y coma (aspedimos ms), nos responder Platn. Cuando Prolog no tenga msrespuestas, nos dir que No; esa negativa no significa que lo que pre-guntemos sea falso, sino que no lo conoce o no puede demostrarlo. Esdecir que si preguntamos, por ejemplo, si Arqumedes es mortal, la res-puesta ser que no, pero porque nuestro programa no cuenta con el co-nocimiento suficiente. Esto se denomina negacin por falla.

    ?- mortal(X)X = socrates;X = platon;No

    Este modo interactivo es muy til para prueba y prototipacin, perodependiendo de la implementacin Prolog en particular, es posiblerealizar invocaciones desde otros ambientes, o ejecutar un programaProlog que tenga un predicado main (que ser el que se intentar pro-bar). Para facilitar el desarrollo de aplicaciones, Prolog cuenta con unconjunto de caractersticas que ensucian de alguna manera su pure-za en lo que hace al paradigma, pero que lo vuelven utilizable. Habla-mos, por ejemplo, de escritura por pantalla, pedido de datos al usua-rio y otros elementos especficos de control del mecanismo de inferen-cia (el predicado de corte es el ms conocido).

    ListasProlog manipula listas con una facilidad sintctica que

    simplifica la programacin: una lista es un par ordenado,donde un elemento es un trmino (la cabeza), y el otro pue-de ser un trmino, una lista o la lista vaca (la cola). Las lis-tas van entre corchetes, y la cabeza se separa de la cola conel smbolo pipe; la lista vaca se indica con dos corchetes se-parados por un espacio. Haciendo un abuso de notacin,tambin es posible enumerar todos los elementos de la listaseparndolos con comas. Por ejemplo, la lista 1, 2, socrates,a, platon se escribe en Prolog de estas dos maneras:

    [1|[2|[socrates|[a|[platon|[]]]]]][1, 2, socrates, a, platon]

    Para comprender un poco mejor el poder de la programa-cin declarativa, comparemos un algoritmo que determina siun elemento se encuentra en una lista en un lenguaje decla-rativo (por ejemplo, Pascal) y en Prolog. En Pascal:

    function member(item:Integer; L:Arrayof Integer):Boolean;

    vari:Integer;

    begini:=0;while((i Mayor que< Menor que>= Mayor o igual que=< Menor o igual que=:= Aritmticamente igual=\= Aritmticamente diferente

    Operadores

  • 60 users.code

    [white paper - Programacin lgica]

    a su vez, una lista, un trmino o la lista vaca, segn definimos anteriormente). En uncaso indicamos cmo determinar que un elemento es parte de la lista, mientras que enel otro declaramos qu significa que un elemento sea parte de la lista. En esta ltimasituacin, el motor de inferencia se encargar de responder cuando preguntemos.

    Operadores aritmticos y relacionalesEl predicado igual (=) compara dos trminos, y es verdadero solamente cuando

    ambos son idnticos o cuando alguna sustitucin de variables los hace idnticos (esms correcto decir cuando unifican). Las siguientes consultas nos dan un ejemplo:

    ?- 1 = 1.yes?- 1 = 2.no?- 2 = 1+1.no?- a=A.A = a ;No

    Puede parecer extrao que la consulta 2 = 1+1 nos arroje un no como respuesta; enrealidad, la constante 2 no unifica con el predicado + con dos argumentos 1 y 1. Paraestas comparaciones, y para conseguir asignaciones, se usa el predicado is:

    ?- 2 is 1+1.yes?- X is 1+2.X = 3 ;no?- 1 is X+2.Error

    En el primer caso, 1 + 1 es 2, el is responde yes. En el segundo, responde que X=3 esla sustitucin adecuada a X = 1+2; al pedir otra respuesta (con el punto y coma), no laencuentra. El ltimo ejemplo es un error: al usar is, la parte derecha debe estar instan-ciada. El estndar establece que en otro caso es un error, aunque algunas distribucio-nes de Prolog responden no. En la tabla [Operadores] vemos otras posibilidades.

    Las torres de HanoiEste problema puede mostrar la potencia

    del paradigma lgico. Se comienza ordenan-do los discos de mayor a menor (de abajohacia arriba) sobre un eje, y se trata de llevar-los a otro (del primero al ltimo) para quequeden de la misma forma. Es posible despla-zar los discos de a uno (siempre tomando elde arriba), y nunca puede ubicarse un discosobre otro de menor dimetro. La [Figura 1]muestra los estados inicial y final, luego derealizar los movimientos. Existen tres postes,y uno de ellos se usa como auxiliar (con slodos sera imposible). Se trata, entonces, dehacer un programa que pueda mover N dis-cos desde el poste 1 hasta el poste 3, usandoel poste 2 como auxiliar. Para lograrlo, esta-blecemos una regla cuya cabeza sea el predi-cado Hanoi con un parmetro indicando lacantidad de discos por mover; en el cuerpo dela regla pondremos el predicado mover conlos parmetros: cantidad de discos (N), desdednde (poste 1), hasta dnde (poste 3) y quusaremos como auxiliar (poste 2).

    hanoi(N) :- mover(N, poste1,poste3, poste2).

    Luego debemos especificar mover, para locual usaremos dos reglas. Trabajar en Prolognos exige pensamiento recursivo: podemosdecir que, para mover N discos desde el poste1 al 3 usando el 2 como auxiliar:

    > deben moverse N-1 discos del poste 1 alposte 2, usando el 3 como auxiliar;

    > debe moverse el disco restante al poste3, quedando en el poste correcto;

    > luego hay que mover N-1 discos del poste2 al poste 3 usando el 1 como auxiliar.

    Asumimos que es fcil mover N-1 discos,pero podemos aplicar este razonamiento yquedarnos con N-2, y as sucesiva o recursi-vamente. Esto se implementa en una regla:

    mover(N,A,B,C) :-M is N-1, mover(M,A,C,B),escribir_mov(A,B), mover(M,C,B,A).

    No olvidar el caso base: cuando no hay dis-cos para mover, no hay que hacer nada. Esaes justamente la regla que aqu necesitamos:

    mover(0,_,_,_).

    El carcter _ representa variables annimas(en este caso no nos importa con qu postes

    Editor de reglassi.. entonces

    Traductor MotorProlog

    Componente lgicoPrograma lgico especfico

    Base lgicaprecio(x):=hora(y,3)...

    Tablas en base de datos

    Respuestas

    [Figura 2] Reglas de negocios y Prolog.

  • 62 users.code

    Reglas de negocios y PrologUno de los aspectos crticos en el desarrollo de aplica-

    ciones empresariales es el de la programacin de reglas denegocio. Existen numerosos trabajos acerca de la mejorforma de modelarlas: el problema se relaciona con el tipode conocimiento que requieren. Tenemos tres tipos:

    > Factual. Puede ser modelado e implementado comodatos (por ejemplo, filas en una tabla relacional).Establece hechos.

    > Procedural. Serie de pasos para resolver problemas.

    > Lgico. Representa un conjunto de reglas para mode-lar relaciones entre objetos (por ejemplo, en una apli-cacin de tarifas telefnicas, seran las relaciones entrehorarios, distancia, descuentos, plan del usuario, tiem-po de duracin, costo de la llamada, etc.).

    Los dos primeros tipos de conocimiento pueden mode-larse e implementarse simplemente con las herramientastradicionales de bases de datos y lenguajes imperativos(C#, Java, Smalltalk, Eiffel, etc.), pero ni el paradigma deorientacin a objetos provee una semntica adecuada pa-ra modelar conocimiento lgico. Este tipo no es fcil derepresentar en un esquema tradicional: no es suficienteuna base de datos, dado que las relaciones son demasiadocomplejas para una tabla. Tampoco es adecuado el mode-lo procedural, ya que fuerza a transformar relaciones l-gicas en secuencias de instrucciones (en este ltimo as-pecto, hay que diferenciar un conjunto de reglas si-enton-ces de un conjunto de instrucciones de un lenguaje pro-cedural if-then; en la primera no hay sentido de secuen-cia explcito; en la segunda, s). Prolog, as como otras ex-tensiones especficas, es adecuado para modelar este tipode conocimiento lgico. Una implementacin eficiente dedicho conocimiento lgico puede requerir un paso inter-medio: modelar primero reglas de negocio en un formatoclaro para los encargados de establecerlas (alguna sinta-xis tipo si-entonces) y luego trasladarlas automticamen-te a un programa lgico que use las facilidades del motorde inferencias. Vemoslo grficamente en la [Figura 2].

    Integracin total: lgica para .NET y JavaPara que el uso de programas lgicos pueda aplicarse al

    desarrollo de software moderno, es necesario que seanverdaderos componentes lgicos que puedan utilizarsedesde entornos como .NET, JSP, Delphi, Java, etc. Muchasimplementaciones actuales de Prolog proveen mecanis-mos para invocar programas Prolog desde otros ambien-tes. El entorno Amzi! Prolog + Logic Server brinda unaintegracin total multiplataforma (ver [Figura 3]) con losambientes ms conocidos. Adems, podemos invocardesde Prolog rutinas hechas en otros lenguajes, mediantepredicados extendidos (as Prolog puede actualizar, porejemplo, el estado de un botn en pantalla habilitndoloo no dependiendo de un complejo conjunto de relacioneslgicas). Naturalmente, existen diversos IDEs muy com-pletos para el desarrollo de programas Prolog: el Amzi!utiliza Eclipse, muy conocido por la comunidad Java.

    trabajamos, ya que no hay discos). Usamos, adems, un predicado auxi-liar que escriba por pantalla el movimiento actual (se usa write, que esuna facilidad extra lgica, y nl, que significa new line). El resultado final:

    % Torres de Hanoi %hanoi(N) :- mover(N, poste1, poste3, poste2).mover(0,_,_,_).mover(N,A,B,C) :-

    M is N-1, mover(M,A,C,B), escribir_mov(A,B),mover(M,C,B,A).

    escribir_mov(Desde,Hasta) :- write('mover desde: '),write( Desde ),write(' hasta: '),write(Hasta),nl.

    [white paper - Programacin lgica]

    Amzi! LogicServer

    Base lgica

    Extensiones Amzi!(LSX, Acceso a base

    de datos, Sockets, etc.)

    Extensiones propias(LSX, callback a

    Delphi/.NET/Java, etc.)

    Programa(Java, JSP, ASP,

    ASP.NET, VB,Delphi, Excel, API, C#, etc.)

    [Figura 3] Interaccin a travs de Amzi! Logic Server.

    Enlaces relacionadosAMBIENTES PROLOG:> Amzi! Prolog: www.amzi.com> SWI Prolog: www.swi-prolog.org> VisualProlog: www.visual-prolog.com> Logic Programming Associates: www.lpa.co.uk> GNU Prolog: gprolog.inria.fr

    RECURSOS> Libro en ingls:

    cblpc0142.leeds.ac.uk/~paul/prologbook> Association for Logic Programming (ALP):

    www.cs.kuleuven.ac.be/%7Edtai/projects/ALP> Blog en espaol:

    programacionlogica.blogspot.com

  • Ejemplo: Java y PrologConclusionesHemos presentado las caractersticas principales de laprogramacin lgica encarnadas en su principal represen-tante: Prolog. Luego del mpetu inicial con que cont, hoyse la puede ver como un paradigma adecuado para deter-minados dominios, como sistemas expertos y reglas denegocios. Integrndolo con ambientes de desarrollo, po-demos dotar a nuestras aplicaciones de inteligencia y fle-xibilidad. Existen ampliaciones con soporte para otras l-gicas, como la difusa, para la programacin con restric-ciones, soporte de paralelismo y concurrencia, etc. l

    Gerardo Rossel es Licenciado en Ciencias de la Compu-tacin y doctorando de la Facultad de Ciencias Exactas yNaturales de la UBA. Es docente e investigador (a cargodel Grupo de Investigacin y Desarrollo de Agentes y Sis-temas Inteligentes del CAETI) en la Facultad de Tecnolo-ga Informtica de la UAI. En el campo profesional, don-de acta desde hace ms de quince aos, es Chief Scien-tist y responsable de ingeniera en Uppersoft Ingeniera deSoftware, representante de Amzi! Prolog en Sudamrica,y se especializa en inteligencia artificial, desarrollo desoftware (.NET y J2EE) y el diseo por contratos. Adems,es consultor de proyectos especiales para Omnisis S.A.

    Veamos un caso real de utilizacin de Prolog en unaaplicacin Java: se trata de una compaa que brindaservicios para manejar el financiamiento de propiedades. Elcentro de sus servicios es una aplicacin web que permite asus clientes buscar la mejor solucin para un prstamohipotecario. El mdulo de cotizaciones fue desarrolladoutilizando 5000 lneas de cdigo Java y varias tablas de unabase de datos; es el ms crtico y el que soporta el mayorpeso de las reglas de negocio. Era necesario cambiarlo todoel tiempo para adaptarse a nuevas reglas y factores detasacin. A esto se agregaba un largo ciclo de afirmacin decalidad, dado que la modificacin de cdigo procedural pararealizar las adaptaciones era proclive a producir erroresnuevos. Se precisaba una solucin con menos errores y quepermitiera una rpida adaptacin a nuevas reglas: sereemplaz el mdulo de tasaciones, construyendo unmdulo lgico con Amzi!, y en dos meses las 5000 lneasJava y las 18 tablas de la base haban dado lugar a slo 500lneas Prolog. La base lgica resultante estaba casi libre deerrores, y el ciclo de modificacin/prueba se redujo en granforma. El resto de la aplicacin sigue en Java, aunque seplanea migrar mdulos particularmente complejos.