SlideShare una empresa de Scribd logo
1 de 5
Descargar para leer sin conexión
Programación lógica
     [white paper]


     Un recorrido por la programación lógica y uno de sus lenguajes más
     representativos: Prolog, clásico de la inteligencia artificial, que se aplica
     de múltiples formas en el desarrollo de software comercial.

                                                                                               > Los functores son identificadores que em-




                                                                                               > Un hecho establece una relación entre




     Estructuras básicas

                                                                                               > Una regla permite definir nuevas relacio-

     > Las constantes, representadas por una cadena de caracteres, pueden ser núme-
      L




     > Las variables son cadenas que comienzan con una letra mayúscula.
                a programación lógica, junto con la funcional, forma parte de lo que se co-




                                                                                               > Esto se lee: X (variable) es mortal si X es
                noce como programación declarativa. En los lenguajes tradicionales, la           piezan con minúscula, seguidos de una




                             Poste 1            Poste 2              Poste 3
                programación consiste en indicar cómo resolver un problema mediante sen-         lista de parámetros (términos) entre pa-
     tencias; en la programación lógica, se trabaja de una forma descriptiva, establecien-       réntesis, separados por comas.
     do relaciones entre entidades, indicando no cómo, sino qué hacer. La ecuación de Ro-
     bert Kowalski (Universidad de Edimburgo) establece la idea esencial de la programa-        Las sentencias son reglas o cláusulas. Hay
     ción lógica: algoritmos = lógica + control. Es decir, un algoritmo se construye especi-   hechos, reglas con cabeza y cola, y consultas.




                                                                                               > Para entender el concepto de consulta,
     ficando conocimiento en un lenguaje formal (lógica de primer orden), y el problema
     se resuelve mediante un mecanismo de inferencia (control) que actúa sobre aquél.
                                                                                                 objetos, y es la forma más sencilla de
     Prolog




                                                                                               > V(x)(humano(x)=>mortal(x))
                                                                                                 sentencia. Por ejemplo:




                                                                                               > humano(socrates)
       El lenguaje Prolog, principal representante del paradigma, se basa en un subconjun-
                                                                                                   humano (socrates).




                                                                                               > entonces mortal (socrates)
     to de la lógica de primer orden (restricción de la forma clausal de la lógica denomi-
     nada cláusulas de Horn). Philippe Roussel y Alain Colmerauer (Universidad de Aix-             ama (juan,maría)




                                                                                               > Partiendo de que los humanos son mor-
     Marseille) lo crearon en 1972, y su base teórica se debe en gran parte a Kowalski.
                                                                                                Se establece que Sócrates es humano y
                                                                                               que Juan ama a María.
      Prolog cuenta con dos tipos de estructuras: términos y sentencias. Los términos
     pueden ser constantes, variables o functores:
                                                                                                 nes a partir de otras ya existentes. Si que-
                                                                                                 remos establecer que todo humano es
       ros o cualquier cadena que comience en minúscula.                                         mortal, en lógica estándar escribiríamos
                                                                                                 V(x)(humano(x)=>mortal(x)), mientras que




     [Figura 1] Problema y resolución de las torres de Hanoi.
                                                                                                 en Prolog escribimos:

                                                                                                   mortal(X):-humano(X).



                                                                                                 humano. El símbolo :- significa “si” o, si
                                                                                                 lo leemos de derecha a izquierda, enton-
                                                                                                 ces o implica. En esta regla, mortal(X) es
                                                                                                 la cabeza, y humano(X) es el cuerpo.


                                                                                                 veamos un ejemplo. En lógica estándar:




                                                                                                 tales y de que Sócrates es humano,
                                                                                                 deducimos que Sócrates es mortal. Para
                                                                                                 realizar esa deducción en Prolog, hay
                                                                                                 que preguntar si es mortal Sócrates, o
                                                                                                 quién es mortal. Si del programa lógi-
                                                                                                 co (conjunto de hechos y reglas) se
                                                                                                 deduce que Sócrates es mortal, enton-
                                                                                                 ces ésa será la respuesta que obtendre-
                                                                                                 mos. Veamos el programa:



58                                                                                                                                 users.code
GERARDO ROSSEL



                                                                           Listas
                                                                                                 Investigador del CAETI.
                                                                                                  grossel@computer.org




   Operadores
 mortal(X):-humano(X).
 humano(Sócrates).                                                           Prolog manipula listas con una facilidad sintáctica que
                                                                           simplifica la programación: una lista es un par ordenado,
  Para preguntar interactivamente, los ambientes de Prolog tienen un       donde un elemento es un término (la cabeza), y el otro pue-
listener, un intérprete de línea de comando cuyo prompt es un signo        de ser un término, una lista o la lista vacía (la cola). Las lis-
de pregunta. Se introduce una sentencia (eventualmente con varia-          tas van entre corchetes, y la cabeza se separa de la cola con
bles), y Prolog intentará demostrarla (usando un algoritmo de inferen-     el símbolo pipe; la lista vacía se indica con dos corchetes se-
cia llamado SLD-Resolution, basado en la regla de resolución de            parados por un espacio. Haciendo un abuso de notación,
Robinson), buscando además constantes que puedan reemplazar las            también es posible enumerar todos los elementos de la lista
variables de la pregunta. Las preguntas de nuestro ejemplo serían:         separándolos con comas. Por ejemplo, la lista 1, 2, socrates,
                                                                           a, platon se escribe en Prolog de estas dos maneras:
 ?- mortal(Sócrates).
 Yes.                                                                       [1|[2|[socrates|[a|[platon|[]]]]]]
                                                                            [1, 2, socrates, a, platon]
 ?- mortal(X)
 X = socrates                                                                Para comprender un poco mejor el poder de la programa-
                                                                           ción declarativa, comparemos un algoritmo que determina si
  Las segundas líneas son las respuestas de Prolog: primero, afirman-      un elemento se encuentra en una lista en un lenguaje decla-
do que sí, Sócrates es mortal; después, contestando Sócrates al pregun-    rativo (por ejemplo, Pascal) y en Prolog. En Pascal:
tar quién es mortal. Si agregamos más conocimiento a nuestro progra-
ma lógico (por ejemplo, que Platón es mortal), podemos pedir más res-       function member(item:Integer; L:Array
puestas. Si luego de obtener Sócrates escribimos un punto y coma (así        of Integer):Boolean;
                                                                            var




     MATEMATICOS                                                           RELACIONALES
“pedimos más”), nos responderá Platón. Cuando Prolog no tenga más
                                                                              i:Integer;




     +      Suma                                                               Mayor que
respuestas, nos dirá que No; esa negativa no significa que lo que pre-
guntemos sea falso, sino que no lo conoce o no puede demostrarlo. Es        begin




     -      Resta                                                              Menor que
decir que si preguntamos, por ejemplo, si Arquímedes es mortal, la res-       i:=0;
                                                                              while((i <= length(L)) and (L[i] <> item)) do




     *      Multiplicación                                                 >= Mayor o igual que
puesta será que no, pero porque nuestro programa no cuenta con el co-
                                                                                  begin




     /      División (retorna siempre en punto flotante)                   =< Menor o igual que
nocimiento suficiente. Esto se denomina negación por falla.
                                                                                     i := i+1;




     //     División entera (trunca)                                       =:= Aritméticamente igual
 ?- mortal(X)                                                                     end;




     mod    Resto de división                                              == Aritméticamente diferente
 X = socrates;                                                                Result := item = L[i];




     **     Potenciación
 X = platon;                                                                end;
 No
                                                                             Para saber si un elemento es parte de una lista, en Prolog
  Este modo interactivo es muy útil para prueba y prototipación, pero      sólo declaramos que es su cabeza o es parte de su cola.
dependiendo de la implementación Prolog en particular, es posible
realizar invocaciones desde otros ambientes, o ejecutar un programa         member(X,[X|Xs]).
Prolog que tenga un predicado main (que será el que se intentará pro-       member(X,[Y|Ys]) :- member(X,Ys).
bar). Para facilitar el desarrollo de aplicaciones, Prolog cuenta con un
conjunto de características que “ensucian” de alguna manera su pure-         El predicado member (parte del estándar de Prolog) dice que
za en lo que hace al paradigma, pero que lo vuelven utilizable. Habla-     un elemento (representado por la variable X) es miembro de
mos, por ejemplo, de escritura por pantalla, pedido de datos al usua-      una lista si es la cabeza de ella (la cabeza de la lista [X|Xs]
rio y otros elementos específicos de control del mecanismo de inferen-     es X), y también que un elemento es miembro de una lista si
cia (el predicado de corte es el más conocido).                            es miembro de la cola (la cola de la lista [Y|Ys] es Ys, que es,




                                                                           >
                                                                           <




                                                                                                                                               59
[white paper - Programación lógica]



     Operadores aritméticos y relacionales



                                                                                                 sobre otro de menor diámetro. La [Figura 1]
     a su vez, una lista, un término o la lista vacía, según definimos anteriormente). En un     Las torres de Hanoi
     caso indicamos cómo determinar que un elemento es parte de la lista, mientras que en          Este problema puede mostrar la potencia
     el otro declaramos qué significa que un elemento sea parte de la lista. En esta última      del paradigma lógico. Se comienza ordenan-
     situación, el motor de inferencia se encargará de responder cuando preguntemos.             do los discos de mayor a menor (de abajo
                                                                                                 hacia arriba) sobre un eje, y se trata de llevar-
                                                                                                 los a otro (del primero al último) para que
      El predicado igual (=) compara dos términos, y es verdadero solamente cuando               queden de la misma forma. Es posible despla-
     ambos son idénticos o cuando alguna sustitución de variables los hace idénticos (es         zar los discos de a uno (siempre tomando el




                                                                                                 > deben moverse N-1 discos del poste 1 al
     más correcto decir “cuando unifican”). Las siguientes consultas nos dan un ejemplo:         de arriba), y nunca puede ubicarse un disco

      ?- 1 = 1.




     nes de Prolog responden no. En la tabla [Operadores] vemos otras posibilidades.
                                                                                                 muestra los estados inicial y final, luego de
      yes




                                                                                                 > debe moverse el disco restante al poste
                                                                                                 realizar los movimientos. Existen tres postes,
      ?- 1 = 2.                                                                                  y uno de ellos se usa como auxiliar (con sólo
      no                                                                                         dos sería imposible). Se trata, entonces, de
      ?- 2 = 1+1.




                                                                                                 > luego hay que mover N-1 discos del poste
                                                                                                 hacer un programa que pueda mover N dis-
      no




            Editor de reglas
                                                                                                 cos desde el poste 1 hasta el poste 3, usando




                                                                      Respuestas
      ?- a=A.




             si.. entonces
                                                                                                 el poste 2 como auxiliar. Para lograrlo, esta-
      A = a ;                                                                                    blecemos una regla cuya cabeza sea el predi-
      No                                                                                         cado Hanoi con un parámetro indicando la
                                                                                                 cantidad de discos por mover; en el cuerpo de




                                     Componente lógico
       Puede parecer extraño que la consulta 2 = 1+1 nos arroje un no como respuesta; en         la regla pondremos el predicado mover con




                                                                        Motor
                                  Programa lógico específico
                Traductor
     realidad, la constante 2 no unifica con el predicado + con dos argumentos 1 y 1. Para       los parámetros: cantidad de discos (N), desde




                                                                        Prolog
     estas comparaciones, y para conseguir asignaciones, se usa el predicado is:                 dónde (poste 1), hasta dónde (poste 3) y qué
                                                                                                 usaremos como auxiliar (poste 2).
      ?- 2 is 1+1.
      yes                                                                                         hanoi(N) :- mover(N, poste1,




                                          Base lógica
      ?- X is 1+2.                                                                                 poste3, poste2).




                                     precio(x):=hora(y,3)...
      X = 3 ;
      no                                                                                           Luego debemos especificar mover, para lo
      ?- 1 is X+2.                                                                               cual usaremos dos reglas. Trabajar en Prolog
      Error                                                                                      nos exige pensamiento recursivo: podemos




                                    Tablas en base de datos
                                                                                                 decir que, para mover N discos desde el poste
       En el primer caso, 1 + 1 es 2, el is responde yes. En el segundo, responde que X=3 es     1 al 3 usando el 2 como auxiliar:




     [Figura 2] Reglas de negocios y Prolog.
     la sustitución adecuada a X = 1+2; al pedir otra respuesta (con el punto y coma), no la
     encuentra. El último ejemplo es un error: al usar is, la parte derecha debe estar instan-
     ciada. El estándar establece que en otro caso es un error, aunque algunas distribucio-        poste 2, usando el 3 como auxiliar;


                                                                                                   3, quedando en el poste correcto;


                                                                                                   2 al poste 3 usando el 1 como auxiliar.

                                                                                                  Asumimos que es fácil mover N-1 discos,
                                                                                                 pero podemos aplicar este razonamiento y
                                                                                                 quedarnos 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. Esa
                                                                                                 es justamente la regla que aquí necesitamos:

                                                                                                  mover(0,_,_,_).

                                                                                                   El carácter _ representa variables anónimas
                                                                                                 (en este caso no nos importa con qué postes



60                                                                                                                                     users.code
[white paper - Programación lógica]

        Enlaces relacionados
          AMBIENTES PROLOG:
          > Amzi! Prolog: www.amzi.com
          > SWI Prolog: www.swi-prolog.org
          > VisualProlog: www.visual-prolog.com                                       > Factual. Puede ser modelado e implementado como
          > Logic Programming Associates: www.lpa.co.uk
          > GNU Prolog: gprolog.inria.fr

          RECURSOS                                                                    > Procedural. Serie de pasos para resolver problemas.
          > Libro en inglés:
            cblpc0142.leeds.ac.uk/~paul/prologbook                                    > Lógico. Representa un conjunto de reglas para mode-
          > Association for Logic Programming (ALP):
            www.cs.kuleuven.ac.be/%7Edtai/projects/ALP
          > Blog en español:
            programacionlogica.blogspot.com
                                                                                      Reglas de negocios y Prolog
                                                                                        Uno de los aspectos críticos en el desarrollo de aplica-
                                                                                      ciones empresariales es el de la programación de reglas de
                                                                                      negocio. Existen numerosos trabajos acerca de la mejor
                                                                                      forma de modelarlas: el problema se relaciona con el tipo
                                                                                      de conocimiento que requieren. Tenemos tres tipos:


                                                                                        datos (por ejemplo, filas en una tabla relacional).
                                                                                        Establece hechos.




               Programa
                                                                                        lar relaciones entre objetos (por ejemplo, en una apli-




            (Java, JSP, ASP,
                                                                                      de inferencias. Veámoslo gráficamente en la [Figura 2].
                                                                                        cación de tarifas telefónicas, serían las relaciones entre




              ASP.NET, VB,
                                                                                        horarios, distancia, descuentos, plan del usuario, tiem-




              Delphi, Excel,
                                                                                        po de duración, costo de la llamada, etc.).




              API, C#, etc.)
                                                 Extensiones Amzi!
                                                (LSX, Acceso a base
                                                                                        Los dos primeros tipos de conocimiento pueden mode-




                                               de datos, Sockets, etc.)
     trabajamos, ya que no hay discos). Usamos, además, un predicado auxi-            larse e implementarse simplemente con las herramientas
     liar que escriba por pantalla el movimiento actual (se usa write, que es         tradicionales de bases de datos y lenguajes imperativos
     una facilidad extra lógica, y nl, que significa new line). El resultado final:   (C#, Java, Smalltalk, Eiffel, etc.), pero ni el paradigma de
                                                                                      orientación a objetos provee una semántica adecuada pa-




              Amzi! Logic
      % Torres de Hanoi %                                                             ra modelar conocimiento lógico. Este tipo no es fácil de




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




                                                                                      integración total multiplataforma (ver [Figura 3]) con los
                                                                                      representar en un esquema tradicional: no es suficiente
      mover(0,_,_,_).




                                               Extensiones propias
                                                 (LSX, callback a
                                                                                      una base de datos, dado que las relaciones son demasiado
      mover(N,A,B,C) :-




                                              Delphi/.NET/Java, etc.)
                                                                                      complejas para una tabla. Tampoco es adecuado el mode-
        M is N-1, mover(M,A,C,B), escribir_mov(A,B),                                  lo procedural, ya que fuerza a transformar relaciones ló-
         mover(M,C,B,A).                                                              gicas en secuencias de instrucciones (en este último as-
      escribir_mov(Desde,Hasta) :-




               Base lógica
                                                                                      pecto, hay que diferenciar un conjunto de reglas si-enton-
        write('mover desde: '),                                                       ces de un conjunto de instrucciones de un lenguaje pro-
        write( Desde ),                                                               cedural if-then; en la primera no hay sentido de secuen-
        write(' hasta: '),




     [Figura 3] Interacción a través de Amzi! Logic Server.
                                                                                      cia explícito; en la segunda, sí). Prolog, así como otras ex-
        write(Hasta),                                                                 tensiones específicas, es adecuado para modelar este tipo
        nl.                                                                           de conocimiento lógico. Una implementación eficiente de
                                                                                      dicho conocimiento lógico puede requerir un paso inter-
                                                                                      medio: modelar primero reglas de negocio en un formato
                                                                                      claro para los encargados de establecerlas (alguna sinta-
                                                                                      xis tipo si-entonces) y luego trasladarlas automáticamen-
                                                                                      te a un programa lógico que use las facilidades del motor


                                                                                      Integración total: lógica para .NET y Java
                                                                                        Para que el uso de programas lógicos pueda aplicarse al
                                                                                      desarrollo de software moderno, es necesario que sean
                                                                                      verdaderos componentes lógicos que puedan utilizarse
                                                                                      desde entornos como .NET, JSP, Delphi, Java, etc. Muchas
                                                                                      implementaciones actuales de Prolog proveen mecanis-
                                                                                      mos para invocar programas Prolog desde otros ambien-
                                                                                      tes. El entorno Amzi! Prolog + Logic Server brinda una

                                                                                      ambientes más conocidos. Además, podemos invocar
                                                                                      desde Prolog rutinas hechas en otros lenguajes, mediante
                                                                                      predicados extendidos (así Prolog puede actualizar, por
                                                                                      ejemplo, el estado de un botón en pantalla habilitándolo
                                                                                      o no dependiendo de un complejo conjunto de relaciones
                                                                                      lógicas). Naturalmente, existen diversos IDEs muy com-
                                                                                      pletos para el desarrollo de programas Prolog: el Amzi!
                                                                                      utiliza Eclipse, muy conocido por la comunidad Java.



62                                                                                                                                      users.code
Ejemplo: Java y Prolog
                                                              Veamos un caso real de utilización de Prolog en una
                                                              aplicación Java: se trata de una compañía que brinda
                                                              servicios para manejar el financiamiento de propiedades. El
                                                              centro de sus servicios es una aplicación web que permite a
                                                              sus clientes buscar la mejor solución para un préstamo
                                                              hipotecario. El módulo de cotizaciones fue desarrollado
                                                              utilizando 5000 líneas de código Java y varias tablas de una
                                                              base de datos; es el más crítico y el que soporta el mayor
                                                              peso de las reglas de negocio. Era necesario cambiarlo todo
                                                              el tiempo para adaptarse a nuevas reglas y factores de
                                                              tasación. A esto se agregaba un largo ciclo de afirmación de
Gerardo Rossel es Licenciado en Ciencias de la Compu-         calidad, dado que la modificación de código procedural para
                                                              realizar las adaptaciones era proclive a producir errores
                                                              nuevos. Se precisaba una solución con menos errores y que
                                                              permitiera una rápida adaptación a nuevas reglas: se
                                                              reemplazó el módulo de tasaciones, construyendo un
                                                              módulo lógico con Amzi!, y en dos meses las 5000 líneas
                                                              Java y las 18 tablas de la base habían dado lugar a sólo 500
                                                              líneas Prolog. La base lógica resultante estaba casi libre de
                                                              errores, y el ciclo de modificación/prueba se redujo en gran
                                                              forma. El resto de la aplicación sigue en Java, aunque se
                                                              planea migrar módulos particularmente complejos.
Conclusiones
  Hemos presentado las características principales de la
programación lógica encarnadas en su principal represen-
tante: Prolog. Luego del ímpetu inicial con que contó, hoy
se la puede ver como un paradigma adecuado para deter-
minados dominios, como sistemas expertos y reglas de
negocios. Integrándolo 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 programación con restric-
ciones, soporte de paralelismo y concurrencia, etc. q




tación y doctorando de la Facultad de Ciencias Exactas y
Naturales de la UBA. Es docente e investigador (a cargo
del Grupo de Investigación y Desarrollo de Agentes y Sis-
temas Inteligentes del CAETI) en la Facultad de Tecnolo-
gía Informática de la UAI. En el campo profesional, don-
de actúa desde hace más de quince años, es Chief Scien-
tist y responsable de ingeniería en Uppersoft Ingeniería de
Software, representante de Amzi! Prolog en Sudamérica,
y se especializa en inteligencia artificial, desarrollo de
software (.NET y J2EE) y el diseño por contratos. Además,
es consultor de proyectos especiales para Omnisis S.A.

Más contenido relacionado

Más de Eli Diaz

(Meta2.2) ejercicio de variables resuelto dev c++
(Meta2.2) ejercicio de variables resuelto dev c++ (Meta2.2) ejercicio de variables resuelto dev c++
(Meta2.2) ejercicio de variables resuelto dev c++ Eli Diaz
 
(Meta1.2) problemas de algoritmos, diagramas de flujo y pseudocodigos
(Meta1.2) problemas de algoritmos, diagramas de flujo y pseudocodigos (Meta1.2) problemas de algoritmos, diagramas de flujo y pseudocodigos
(Meta1.2) problemas de algoritmos, diagramas de flujo y pseudocodigos Eli Diaz
 
(Meta2.1) ensayo¨ la programación en la vida diaria y mi área profesional¨
(Meta2.1) ensayo¨ la programación en la vida diaria y mi área profesional¨ (Meta2.1) ensayo¨ la programación en la vida diaria y mi área profesional¨
(Meta2.1) ensayo¨ la programación en la vida diaria y mi área profesional¨ Eli Diaz
 
(Meta 5.1)función sin parámetros que no retorna valor dev c++
(Meta 5.1)función sin parámetros que no retorna valor dev c++ (Meta 5.1)función sin parámetros que no retorna valor dev c++
(Meta 5.1)función sin parámetros que no retorna valor dev c++ Eli Diaz
 
(Meta 5)temperatura 3 dev c++
(Meta 5)temperatura 3 dev c++ (Meta 5)temperatura 3 dev c++
(Meta 5)temperatura 3 dev c++ Eli Diaz
 
(Meta 5)temperatura 2 dev c++
(Meta 5)temperatura 2 dev c++ (Meta 5)temperatura 2 dev c++
(Meta 5)temperatura 2 dev c++ Eli Diaz
 
(Meta 5.1) base de datos de alumnos dev c++
(Meta 5.1) base de datos de alumnos dev c++ (Meta 5.1) base de datos de alumnos dev c++
(Meta 5.1) base de datos de alumnos dev c++ Eli Diaz
 
(Meta 5) ejemplo vectores dev c++
(Meta 5) ejemplo vectores dev c++ (Meta 5) ejemplo vectores dev c++
(Meta 5) ejemplo vectores dev c++ Eli Diaz
 
(Meta 5)temperatura dev c++
(Meta 5)temperatura dev c++ (Meta 5)temperatura dev c++
(Meta 5)temperatura dev c++ Eli Diaz
 
(Meta 5) ejemplo vectores 2 dev c++
(Meta 5) ejemplo vectores 2 dev c++ (Meta 5) ejemplo vectores 2 dev c++
(Meta 5) ejemplo vectores 2 dev c++ Eli Diaz
 
(Meta 5.1)ventas totales. mayores e inferiores dev c++
(Meta 5.1)ventas totales. mayores e inferiores dev c++ (Meta 5.1)ventas totales. mayores e inferiores dev c++
(Meta 5.1)ventas totales. mayores e inferiores dev c++ Eli Diaz
 
(Meta 4.2) semestre,numero de materias y cantidad a pagar de un alumno dev c++
(Meta 4.2) semestre,numero de materias y cantidad a pagar de un alumno dev c++(Meta 4.2) semestre,numero de materias y cantidad a pagar de un alumno dev c++
(Meta 4.2) semestre,numero de materias y cantidad a pagar de un alumno dev c++Eli Diaz
 
(Meta 4.2) fiesta de 15 años dev c++
(Meta 4.2) fiesta de 15 años  dev c++ (Meta 4.2) fiesta de 15 años  dev c++
(Meta 4.2) fiesta de 15 años dev c++ Eli Diaz
 
(Meta 4.1)mostrar el cuadrado y el residuo de un numero dev c++
(Meta 4.1)mostrar el cuadrado y el residuo de un numero dev c++ (Meta 4.1)mostrar el cuadrado y el residuo de un numero dev c++
(Meta 4.1)mostrar el cuadrado y el residuo de un numero dev c++ Eli Diaz
 
(Meta 4.1)identificador de numero par e impar dev c++
(Meta 4.1)identificador de numero par e impar dev c++ (Meta 4.1)identificador de numero par e impar dev c++
(Meta 4.1)identificador de numero par e impar dev c++ Eli Diaz
 
(Meta 4.1)conversosr pesos a dolares y dolares a pesos dev c++
(Meta 4.1)conversosr pesos a dolares y dolares a pesos dev c++ (Meta 4.1)conversosr pesos a dolares y dolares a pesos dev c++
(Meta 4.1)conversosr pesos a dolares y dolares a pesos dev c++ Eli Diaz
 
(Meta 4.2) fiesta de 15 años 2 dev c++
(Meta 4.2) fiesta de 15 años  2 dev c++ (Meta 4.2) fiesta de 15 años  2 dev c++
(Meta 4.2) fiesta de 15 años 2 dev c++ Eli Diaz
 
(Meta 4) ejemplo lectura de datos, dato mayor de 3 datos dev c++
(Meta 4) ejemplo lectura de datos, dato mayor de 3 datos  dev c++ (Meta 4) ejemplo lectura de datos, dato mayor de 3 datos  dev c++
(Meta 4) ejemplo lectura de datos, dato mayor de 3 datos dev c++ Eli Diaz
 
(Meta 4) ejemplo laboratorios dev c++
(Meta 4) ejemplo laboratorios dev c++ (Meta 4) ejemplo laboratorios dev c++
(Meta 4) ejemplo laboratorios dev c++ Eli Diaz
 
(Meta 4) ejemplo cursos dev c++
(Meta 4) ejemplo cursos dev c++ (Meta 4) ejemplo cursos dev c++
(Meta 4) ejemplo cursos dev c++ Eli Diaz
 

Más de Eli Diaz (20)

(Meta2.2) ejercicio de variables resuelto dev c++
(Meta2.2) ejercicio de variables resuelto dev c++ (Meta2.2) ejercicio de variables resuelto dev c++
(Meta2.2) ejercicio de variables resuelto dev c++
 
(Meta1.2) problemas de algoritmos, diagramas de flujo y pseudocodigos
(Meta1.2) problemas de algoritmos, diagramas de flujo y pseudocodigos (Meta1.2) problemas de algoritmos, diagramas de flujo y pseudocodigos
(Meta1.2) problemas de algoritmos, diagramas de flujo y pseudocodigos
 
(Meta2.1) ensayo¨ la programación en la vida diaria y mi área profesional¨
(Meta2.1) ensayo¨ la programación en la vida diaria y mi área profesional¨ (Meta2.1) ensayo¨ la programación en la vida diaria y mi área profesional¨
(Meta2.1) ensayo¨ la programación en la vida diaria y mi área profesional¨
 
(Meta 5.1)función sin parámetros que no retorna valor dev c++
(Meta 5.1)función sin parámetros que no retorna valor dev c++ (Meta 5.1)función sin parámetros que no retorna valor dev c++
(Meta 5.1)función sin parámetros que no retorna valor dev c++
 
(Meta 5)temperatura 3 dev c++
(Meta 5)temperatura 3 dev c++ (Meta 5)temperatura 3 dev c++
(Meta 5)temperatura 3 dev c++
 
(Meta 5)temperatura 2 dev c++
(Meta 5)temperatura 2 dev c++ (Meta 5)temperatura 2 dev c++
(Meta 5)temperatura 2 dev c++
 
(Meta 5.1) base de datos de alumnos dev c++
(Meta 5.1) base de datos de alumnos dev c++ (Meta 5.1) base de datos de alumnos dev c++
(Meta 5.1) base de datos de alumnos dev c++
 
(Meta 5) ejemplo vectores dev c++
(Meta 5) ejemplo vectores dev c++ (Meta 5) ejemplo vectores dev c++
(Meta 5) ejemplo vectores dev c++
 
(Meta 5)temperatura dev c++
(Meta 5)temperatura dev c++ (Meta 5)temperatura dev c++
(Meta 5)temperatura dev c++
 
(Meta 5) ejemplo vectores 2 dev c++
(Meta 5) ejemplo vectores 2 dev c++ (Meta 5) ejemplo vectores 2 dev c++
(Meta 5) ejemplo vectores 2 dev c++
 
(Meta 5.1)ventas totales. mayores e inferiores dev c++
(Meta 5.1)ventas totales. mayores e inferiores dev c++ (Meta 5.1)ventas totales. mayores e inferiores dev c++
(Meta 5.1)ventas totales. mayores e inferiores dev c++
 
(Meta 4.2) semestre,numero de materias y cantidad a pagar de un alumno dev c++
(Meta 4.2) semestre,numero de materias y cantidad a pagar de un alumno dev c++(Meta 4.2) semestre,numero de materias y cantidad a pagar de un alumno dev c++
(Meta 4.2) semestre,numero de materias y cantidad a pagar de un alumno dev c++
 
(Meta 4.2) fiesta de 15 años dev c++
(Meta 4.2) fiesta de 15 años  dev c++ (Meta 4.2) fiesta de 15 años  dev c++
(Meta 4.2) fiesta de 15 años dev c++
 
(Meta 4.1)mostrar el cuadrado y el residuo de un numero dev c++
(Meta 4.1)mostrar el cuadrado y el residuo de un numero dev c++ (Meta 4.1)mostrar el cuadrado y el residuo de un numero dev c++
(Meta 4.1)mostrar el cuadrado y el residuo de un numero dev c++
 
(Meta 4.1)identificador de numero par e impar dev c++
(Meta 4.1)identificador de numero par e impar dev c++ (Meta 4.1)identificador de numero par e impar dev c++
(Meta 4.1)identificador de numero par e impar dev c++
 
(Meta 4.1)conversosr pesos a dolares y dolares a pesos dev c++
(Meta 4.1)conversosr pesos a dolares y dolares a pesos dev c++ (Meta 4.1)conversosr pesos a dolares y dolares a pesos dev c++
(Meta 4.1)conversosr pesos a dolares y dolares a pesos dev c++
 
(Meta 4.2) fiesta de 15 años 2 dev c++
(Meta 4.2) fiesta de 15 años  2 dev c++ (Meta 4.2) fiesta de 15 años  2 dev c++
(Meta 4.2) fiesta de 15 años 2 dev c++
 
(Meta 4) ejemplo lectura de datos, dato mayor de 3 datos dev c++
(Meta 4) ejemplo lectura de datos, dato mayor de 3 datos  dev c++ (Meta 4) ejemplo lectura de datos, dato mayor de 3 datos  dev c++
(Meta 4) ejemplo lectura de datos, dato mayor de 3 datos dev c++
 
(Meta 4) ejemplo laboratorios dev c++
(Meta 4) ejemplo laboratorios dev c++ (Meta 4) ejemplo laboratorios dev c++
(Meta 4) ejemplo laboratorios dev c++
 
(Meta 4) ejemplo cursos dev c++
(Meta 4) ejemplo cursos dev c++ (Meta 4) ejemplo cursos dev c++
(Meta 4) ejemplo cursos dev c++
 

Último

Actividades eclipse solar 2024 Educacion
Actividades eclipse solar 2024 EducacionActividades eclipse solar 2024 Educacion
Actividades eclipse solar 2024 Educacionviviantorres91
 
BOCA Y NARIZ (2).pdf....................
BOCA Y NARIZ (2).pdf....................BOCA Y NARIZ (2).pdf....................
BOCA Y NARIZ (2).pdf....................ScarletMedina4
 
Apunte de clase Pisos y Revestimientos 3
Apunte de clase Pisos y Revestimientos 3Apunte de clase Pisos y Revestimientos 3
Apunte de clase Pisos y Revestimientos 3Gonella
 
Salvando mi mundo , mi comunidad , y mi entorno
Salvando mi mundo , mi comunidad  , y mi entornoSalvando mi mundo , mi comunidad  , y mi entorno
Salvando mi mundo , mi comunidad , y mi entornoday561sol
 
Buenas Practicas de Manufactura para Industria Farmaceutica
Buenas Practicas de Manufactura para Industria FarmaceuticaBuenas Practicas de Manufactura para Industria Farmaceutica
Buenas Practicas de Manufactura para Industria FarmaceuticaMarco Camacho
 
Apunte de clase Pisos y Revestimientos 1
Apunte de clase Pisos y Revestimientos 1Apunte de clase Pisos y Revestimientos 1
Apunte de clase Pisos y Revestimientos 1Gonella
 
TALLER_DE_ORALIDAD_LECTURA_ESCRITURA_Y.pptx
TALLER_DE_ORALIDAD_LECTURA_ESCRITURA_Y.pptxTALLER_DE_ORALIDAD_LECTURA_ESCRITURA_Y.pptx
TALLER_DE_ORALIDAD_LECTURA_ESCRITURA_Y.pptxMartaChaparro1
 
4 ÑOS EXPERIENCIA DE APRENDIZAJE 1 (1).docx
4 ÑOS EXPERIENCIA DE APRENDIZAJE 1 (1).docx4 ÑOS EXPERIENCIA DE APRENDIZAJE 1 (1).docx
4 ÑOS EXPERIENCIA DE APRENDIZAJE 1 (1).docxElicendaEspinozaFlor
 
Filosofía del gobierno del general Alfaro
Filosofía del gobierno del general AlfaroFilosofía del gobierno del general Alfaro
Filosofía del gobierno del general AlfaroJosé Luis Palma
 
tema5 2eso 2024 Europa entre los siglos XII y XV
tema5 2eso 2024 Europa entre los siglos XII y XVtema5 2eso 2024 Europa entre los siglos XII y XV
tema5 2eso 2024 Europa entre los siglos XII y XVChema R.
 
Biografía del General Eloy Alfaro Delgado
Biografía del General Eloy Alfaro DelgadoBiografía del General Eloy Alfaro Delgado
Biografía del General Eloy Alfaro DelgadoJosé Luis Palma
 
MEDIACIÓN INTERNACIONAL MF 1445 vl45.pdf
MEDIACIÓN INTERNACIONAL MF 1445 vl45.pdfMEDIACIÓN INTERNACIONAL MF 1445 vl45.pdf
MEDIACIÓN INTERNACIONAL MF 1445 vl45.pdfJosé Hecht
 
4° SEM23 ANEXOS DEL DOCENTE 2023-2024.pptx
4° SEM23 ANEXOS DEL DOCENTE 2023-2024.pptx4° SEM23 ANEXOS DEL DOCENTE 2023-2024.pptx
4° SEM23 ANEXOS DEL DOCENTE 2023-2024.pptxfotofamilia008
 
Amor o egoísmo, esa es la cuestión por definir.pdf
Amor o egoísmo, esa es la cuestión por definir.pdfAmor o egoísmo, esa es la cuestión por definir.pdf
Amor o egoísmo, esa es la cuestión por definir.pdfAlejandrino Halire Ccahuana
 
Si cuidamos el mundo, tendremos un mundo mejor.
Si cuidamos el mundo, tendremos un mundo mejor.Si cuidamos el mundo, tendremos un mundo mejor.
Si cuidamos el mundo, tendremos un mundo mejor.monthuerta17
 

Último (20)

¿Amor o egoísmo? Esa es la cuestión.pptx
¿Amor o egoísmo? Esa es la cuestión.pptx¿Amor o egoísmo? Esa es la cuestión.pptx
¿Amor o egoísmo? Esa es la cuestión.pptx
 
El Bullying.
El Bullying.El Bullying.
El Bullying.
 
Actividades eclipse solar 2024 Educacion
Actividades eclipse solar 2024 EducacionActividades eclipse solar 2024 Educacion
Actividades eclipse solar 2024 Educacion
 
BOCA Y NARIZ (2).pdf....................
BOCA Y NARIZ (2).pdf....................BOCA Y NARIZ (2).pdf....................
BOCA Y NARIZ (2).pdf....................
 
Mimos _
Mimos                                       _Mimos                                       _
Mimos _
 
Apunte de clase Pisos y Revestimientos 3
Apunte de clase Pisos y Revestimientos 3Apunte de clase Pisos y Revestimientos 3
Apunte de clase Pisos y Revestimientos 3
 
Salvando mi mundo , mi comunidad , y mi entorno
Salvando mi mundo , mi comunidad  , y mi entornoSalvando mi mundo , mi comunidad  , y mi entorno
Salvando mi mundo , mi comunidad , y mi entorno
 
Buenas Practicas de Manufactura para Industria Farmaceutica
Buenas Practicas de Manufactura para Industria FarmaceuticaBuenas Practicas de Manufactura para Industria Farmaceutica
Buenas Practicas de Manufactura para Industria Farmaceutica
 
Apunte de clase Pisos y Revestimientos 1
Apunte de clase Pisos y Revestimientos 1Apunte de clase Pisos y Revestimientos 1
Apunte de clase Pisos y Revestimientos 1
 
TALLER_DE_ORALIDAD_LECTURA_ESCRITURA_Y.pptx
TALLER_DE_ORALIDAD_LECTURA_ESCRITURA_Y.pptxTALLER_DE_ORALIDAD_LECTURA_ESCRITURA_Y.pptx
TALLER_DE_ORALIDAD_LECTURA_ESCRITURA_Y.pptx
 
4 ÑOS EXPERIENCIA DE APRENDIZAJE 1 (1).docx
4 ÑOS EXPERIENCIA DE APRENDIZAJE 1 (1).docx4 ÑOS EXPERIENCIA DE APRENDIZAJE 1 (1).docx
4 ÑOS EXPERIENCIA DE APRENDIZAJE 1 (1).docx
 
Filosofía del gobierno del general Alfaro
Filosofía del gobierno del general AlfaroFilosofía del gobierno del general Alfaro
Filosofía del gobierno del general Alfaro
 
Acuerdo segundo periodo - Grado Sexto.pptx
Acuerdo segundo periodo - Grado Sexto.pptxAcuerdo segundo periodo - Grado Sexto.pptx
Acuerdo segundo periodo - Grado Sexto.pptx
 
Sesión ¿Amor o egoísmo? Esa es la cuestión
Sesión  ¿Amor o egoísmo? Esa es la cuestiónSesión  ¿Amor o egoísmo? Esa es la cuestión
Sesión ¿Amor o egoísmo? Esa es la cuestión
 
tema5 2eso 2024 Europa entre los siglos XII y XV
tema5 2eso 2024 Europa entre los siglos XII y XVtema5 2eso 2024 Europa entre los siglos XII y XV
tema5 2eso 2024 Europa entre los siglos XII y XV
 
Biografía del General Eloy Alfaro Delgado
Biografía del General Eloy Alfaro DelgadoBiografía del General Eloy Alfaro Delgado
Biografía del General Eloy Alfaro Delgado
 
MEDIACIÓN INTERNACIONAL MF 1445 vl45.pdf
MEDIACIÓN INTERNACIONAL MF 1445 vl45.pdfMEDIACIÓN INTERNACIONAL MF 1445 vl45.pdf
MEDIACIÓN INTERNACIONAL MF 1445 vl45.pdf
 
4° SEM23 ANEXOS DEL DOCENTE 2023-2024.pptx
4° SEM23 ANEXOS DEL DOCENTE 2023-2024.pptx4° SEM23 ANEXOS DEL DOCENTE 2023-2024.pptx
4° SEM23 ANEXOS DEL DOCENTE 2023-2024.pptx
 
Amor o egoísmo, esa es la cuestión por definir.pdf
Amor o egoísmo, esa es la cuestión por definir.pdfAmor o egoísmo, esa es la cuestión por definir.pdf
Amor o egoísmo, esa es la cuestión por definir.pdf
 
Si cuidamos el mundo, tendremos un mundo mejor.
Si cuidamos el mundo, tendremos un mundo mejor.Si cuidamos el mundo, tendremos un mundo mejor.
Si cuidamos el mundo, tendremos un mundo mejor.
 

Programacion logica

  • 1. Programación lógica [white paper] Un recorrido por la programación lógica y uno de sus lenguajes más representativos: Prolog, clásico de la inteligencia artificial, que se aplica de múltiples formas en el desarrollo de software comercial. > Los functores son identificadores que em- > Un hecho establece una relación entre Estructuras básicas > Una regla permite definir nuevas relacio- > Las constantes, representadas por una cadena de caracteres, pueden ser núme- L > Las variables son cadenas que comienzan con una letra mayúscula. a programación lógica, junto con la funcional, forma parte de lo que se co- > Esto se lee: X (variable) es mortal si X es noce como programación declarativa. En los lenguajes tradicionales, la piezan con minúscula, seguidos de una Poste 1 Poste 2 Poste 3 programación consiste en indicar cómo resolver un problema mediante sen- lista de parámetros (términos) entre pa- tencias; en la programación lógica, se trabaja de una forma descriptiva, establecien- réntesis, separados por comas. do relaciones entre entidades, indicando no cómo, sino qué hacer. La ecuación de Ro- bert Kowalski (Universidad de Edimburgo) establece la idea esencial de la programa- Las sentencias son reglas o cláusulas. Hay ción lógica: algoritmos = lógica + control. Es decir, un algoritmo se construye especi- hechos, reglas con cabeza y cola, y consultas. > Para entender el concepto de consulta, ficando conocimiento en un lenguaje formal (lógica de primer orden), y el problema se resuelve mediante un mecanismo de inferencia (control) que actúa sobre aquél. objetos, y es la forma más sencilla de Prolog > V(x)(humano(x)=>mortal(x)) sentencia. Por ejemplo: > humano(socrates) El lenguaje Prolog, principal representante del paradigma, se basa en un subconjun- humano (socrates). > entonces mortal (socrates) to de la lógica de primer orden (restricción de la forma clausal de la lógica denomi- nada cláusulas de Horn). Philippe Roussel y Alain Colmerauer (Universidad de Aix- ama (juan,maría) > Partiendo de que los humanos son mor- Marseille) lo crearon en 1972, y su base teórica se debe en gran parte a Kowalski. Se establece que Sócrates es humano y que Juan ama a María. Prolog cuenta con dos tipos de estructuras: términos y sentencias. Los términos pueden ser constantes, variables o functores: nes a partir de otras ya existentes. Si que- remos establecer que todo humano es ros o cualquier cadena que comience en minúscula. mortal, en lógica estándar escribiríamos V(x)(humano(x)=>mortal(x)), mientras que [Figura 1] Problema y resolución de las torres de Hanoi. en Prolog escribimos: mortal(X):-humano(X). humano. El símbolo :- significa “si” o, si lo leemos de derecha a izquierda, enton- ces o implica. En esta regla, mortal(X) es la cabeza, y humano(X) es el cuerpo. veamos un ejemplo. En lógica estándar: tales y de que Sócrates es humano, deducimos que Sócrates es mortal. Para realizar esa deducción en Prolog, hay que preguntar si es mortal Sócrates, o quién es mortal. Si del programa lógi- co (conjunto de hechos y reglas) se deduce que Sócrates es mortal, enton- ces ésa será la respuesta que obtendre- mos. Veamos el programa: 58 users.code
  • 2. GERARDO ROSSEL Listas Investigador del CAETI. grossel@computer.org Operadores mortal(X):-humano(X). humano(Sócrates). Prolog manipula listas con una facilidad sintáctica que simplifica la programación: una lista es un par ordenado, Para preguntar interactivamente, los ambientes de Prolog tienen un donde un elemento es un término (la cabeza), y el otro pue- listener, un intérprete de línea de comando cuyo prompt es un signo de ser un término, una lista o la lista vacía (la cola). Las lis- de pregunta. Se introduce una sentencia (eventualmente con varia- tas van entre corchetes, y la cabeza se separa de la cola con bles), y Prolog intentará demostrarla (usando un algoritmo de inferen- el símbolo pipe; la lista vacía se indica con dos corchetes se- cia llamado SLD-Resolution, basado en la regla de resolución de parados por un espacio. Haciendo un abuso de notación, Robinson), buscando además constantes que puedan reemplazar las también es posible enumerar todos los elementos de la lista variables de la pregunta. Las preguntas de nuestro ejemplo serían: separándolos con comas. Por ejemplo, la lista 1, 2, socrates, a, platon se escribe en Prolog de estas dos maneras: ?- mortal(Sócrates). Yes. [1|[2|[socrates|[a|[platon|[]]]]]] [1, 2, socrates, a, platon] ?- mortal(X) X = socrates Para comprender un poco mejor el poder de la programa- ción declarativa, comparemos un algoritmo que determina si Las segundas líneas son las respuestas de Prolog: primero, afirman- un elemento se encuentra en una lista en un lenguaje decla- do que sí, Sócrates es mortal; después, contestando Sócrates al pregun- rativo (por ejemplo, Pascal) y en Prolog. En Pascal: tar quién es mortal. Si agregamos más conocimiento a nuestro progra- ma lógico (por ejemplo, que Platón es mortal), podemos pedir más res- function member(item:Integer; L:Array puestas. Si luego de obtener Sócrates escribimos un punto y coma (así of Integer):Boolean; var MATEMATICOS RELACIONALES “pedimos más”), nos responderá Platón. Cuando Prolog no tenga más i:Integer; + Suma Mayor que respuestas, nos dirá que No; esa negativa no significa que lo que pre- guntemos sea falso, sino que no lo conoce o no puede demostrarlo. Es begin - Resta Menor que decir que si preguntamos, por ejemplo, si Arquímedes es mortal, la res- i:=0; while((i <= length(L)) and (L[i] <> item)) do * Multiplicación >= Mayor o igual que puesta será que no, pero porque nuestro programa no cuenta con el co- begin / División (retorna siempre en punto flotante) =< Menor o igual que nocimiento suficiente. Esto se denomina negación por falla. i := i+1; // División entera (trunca) =:= Aritméticamente igual ?- mortal(X) end; mod Resto de división == Aritméticamente diferente X = socrates; Result := item = L[i]; ** Potenciación X = platon; end; No Para saber si un elemento es parte de una lista, en Prolog Este modo interactivo es muy útil para prueba y prototipación, pero sólo declaramos que es su cabeza o es parte de su cola. dependiendo de la implementación Prolog en particular, es posible realizar invocaciones desde otros ambientes, o ejecutar un programa member(X,[X|Xs]). Prolog que tenga un predicado main (que será el que se intentará pro- member(X,[Y|Ys]) :- member(X,Ys). bar). Para facilitar el desarrollo de aplicaciones, Prolog cuenta con un conjunto de características que “ensucian” de alguna manera su pure- El predicado member (parte del estándar de Prolog) dice que za en lo que hace al paradigma, pero que lo vuelven utilizable. Habla- un elemento (representado por la variable X) es miembro de mos, por ejemplo, de escritura por pantalla, pedido de datos al usua- una lista si es la cabeza de ella (la cabeza de la lista [X|Xs] rio y otros elementos específicos de control del mecanismo de inferen- es X), y también que un elemento es miembro de una lista si cia (el predicado de corte es el más conocido). es miembro de la cola (la cola de la lista [Y|Ys] es Ys, que es, > < 59
  • 3. [white paper - Programación lógica] Operadores aritméticos y relacionales sobre otro de menor diámetro. La [Figura 1] a su vez, una lista, un término o la lista vacía, según definimos anteriormente). En un Las torres de Hanoi caso indicamos cómo determinar que un elemento es parte de la lista, mientras que en Este problema puede mostrar la potencia el otro declaramos qué significa que un elemento sea parte de la lista. En esta última del paradigma lógico. Se comienza ordenan- situación, el motor de inferencia se encargará de responder cuando preguntemos. do los discos de mayor a menor (de abajo hacia arriba) sobre un eje, y se trata de llevar- los a otro (del primero al último) para que El predicado igual (=) compara dos términos, y es verdadero solamente cuando queden de la misma forma. Es posible despla- ambos son idénticos o cuando alguna sustitución de variables los hace idénticos (es zar los discos de a uno (siempre tomando el > deben moverse N-1 discos del poste 1 al más correcto decir “cuando unifican”). Las siguientes consultas nos dan un ejemplo: de arriba), y nunca puede ubicarse un disco ?- 1 = 1. nes de Prolog responden no. En la tabla [Operadores] vemos otras posibilidades. muestra los estados inicial y final, luego de yes > debe moverse el disco restante al poste realizar los movimientos. Existen tres postes, ?- 1 = 2. y uno de ellos se usa como auxiliar (con sólo no dos sería imposible). Se trata, entonces, de ?- 2 = 1+1. > luego hay que mover N-1 discos del poste hacer un programa que pueda mover N dis- no Editor de reglas cos desde el poste 1 hasta el poste 3, usando Respuestas ?- a=A. si.. entonces el poste 2 como auxiliar. Para lograrlo, esta- A = a ; blecemos una regla cuya cabeza sea el predi- No cado Hanoi con un parámetro indicando la cantidad de discos por mover; en el cuerpo de Componente lógico Puede parecer extraño que la consulta 2 = 1+1 nos arroje un no como respuesta; en la regla pondremos el predicado mover con Motor Programa lógico específico Traductor realidad, la constante 2 no unifica con el predicado + con dos argumentos 1 y 1. Para los parámetros: cantidad de discos (N), desde Prolog estas comparaciones, y para conseguir asignaciones, se usa el predicado is: dónde (poste 1), hasta dónde (poste 3) y qué usaremos como auxiliar (poste 2). ?- 2 is 1+1. yes hanoi(N) :- mover(N, poste1, Base lógica ?- X is 1+2. poste3, poste2). precio(x):=hora(y,3)... X = 3 ; no Luego debemos especificar mover, para lo ?- 1 is X+2. cual usaremos dos reglas. Trabajar en Prolog Error nos exige pensamiento recursivo: podemos Tablas en base de datos decir que, para mover N discos desde el poste En el primer caso, 1 + 1 es 2, el is responde yes. En el segundo, responde que X=3 es 1 al 3 usando el 2 como auxiliar: [Figura 2] Reglas de negocios y Prolog. la sustitución adecuada a X = 1+2; al pedir otra respuesta (con el punto y coma), no la encuentra. El último ejemplo es un error: al usar is, la parte derecha debe estar instan- ciada. El estándar establece que en otro caso es un error, aunque algunas distribucio- poste 2, usando el 3 como auxiliar; 3, quedando en el poste correcto; 2 al poste 3 usando el 1 como auxiliar. Asumimos que es fácil mover N-1 discos, pero podemos aplicar este razonamiento y quedarnos 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. Esa es justamente la regla que aquí necesitamos: mover(0,_,_,_). El carácter _ representa variables anónimas (en este caso no nos importa con qué postes 60 users.code
  • 4. [white paper - Programación lógica] Enlaces relacionados AMBIENTES PROLOG: > Amzi! Prolog: www.amzi.com > SWI Prolog: www.swi-prolog.org > VisualProlog: www.visual-prolog.com > Factual. Puede ser modelado e implementado como > Logic Programming Associates: www.lpa.co.uk > GNU Prolog: gprolog.inria.fr RECURSOS > Procedural. Serie de pasos para resolver problemas. > Libro en inglés: cblpc0142.leeds.ac.uk/~paul/prologbook > Lógico. Representa un conjunto de reglas para mode- > Association for Logic Programming (ALP): www.cs.kuleuven.ac.be/%7Edtai/projects/ALP > Blog en español: programacionlogica.blogspot.com Reglas de negocios y Prolog Uno de los aspectos críticos en el desarrollo de aplica- ciones empresariales es el de la programación de reglas de negocio. Existen numerosos trabajos acerca de la mejor forma de modelarlas: el problema se relaciona con el tipo de conocimiento que requieren. Tenemos tres tipos: datos (por ejemplo, filas en una tabla relacional). Establece hechos. Programa lar relaciones entre objetos (por ejemplo, en una apli- (Java, JSP, ASP, de inferencias. Veámoslo gráficamente en la [Figura 2]. cación de tarifas telefónicas, serían las relaciones entre ASP.NET, VB, horarios, distancia, descuentos, plan del usuario, tiem- Delphi, Excel, po de duración, costo de la llamada, etc.). API, C#, etc.) Extensiones Amzi! (LSX, Acceso a base Los dos primeros tipos de conocimiento pueden mode- de datos, Sockets, etc.) trabajamos, ya que no hay discos). Usamos, además, un predicado auxi- larse e implementarse simplemente con las herramientas liar que escriba por pantalla el movimiento actual (se usa write, que es tradicionales de bases de datos y lenguajes imperativos una facilidad extra lógica, y nl, que significa new line). El resultado final: (C#, Java, Smalltalk, Eiffel, etc.), pero ni el paradigma de orientación a objetos provee una semántica adecuada pa- Amzi! Logic % Torres de Hanoi % ra modelar conocimiento lógico. Este tipo no es fácil de Server hanoi(N) :- mover(N, poste1, poste3, poste2). integración total multiplataforma (ver [Figura 3]) con los representar en un esquema tradicional: no es suficiente mover(0,_,_,_). Extensiones propias (LSX, callback a una base de datos, dado que las relaciones son demasiado mover(N,A,B,C) :- Delphi/.NET/Java, etc.) complejas para una tabla. Tampoco es adecuado el mode- M is N-1, mover(M,A,C,B), escribir_mov(A,B), lo procedural, ya que fuerza a transformar relaciones ló- mover(M,C,B,A). gicas en secuencias de instrucciones (en este último as- escribir_mov(Desde,Hasta) :- Base lógica pecto, hay que diferenciar un conjunto de reglas si-enton- write('mover desde: '), ces de un conjunto de instrucciones de un lenguaje pro- write( Desde ), cedural if-then; en la primera no hay sentido de secuen- write(' hasta: '), [Figura 3] Interacción a través de Amzi! Logic Server. cia explícito; en la segunda, sí). Prolog, así como otras ex- write(Hasta), tensiones específicas, es adecuado para modelar este tipo nl. de conocimiento lógico. Una implementación eficiente de dicho conocimiento lógico puede requerir un paso inter- medio: modelar primero reglas de negocio en un formato claro para los encargados de establecerlas (alguna sinta- xis tipo si-entonces) y luego trasladarlas automáticamen- te a un programa lógico que use las facilidades del motor Integración total: lógica para .NET y Java Para que el uso de programas lógicos pueda aplicarse al desarrollo de software moderno, es necesario que sean verdaderos componentes lógicos que puedan utilizarse desde entornos como .NET, JSP, Delphi, Java, etc. Muchas implementaciones actuales de Prolog proveen mecanis- mos para invocar programas Prolog desde otros ambien- tes. El entorno Amzi! Prolog + Logic Server brinda una ambientes más conocidos. Además, podemos invocar desde Prolog rutinas hechas en otros lenguajes, mediante predicados extendidos (así Prolog puede actualizar, por ejemplo, el estado de un botón en pantalla habilitándolo o no dependiendo de un complejo conjunto de relaciones lógicas). Naturalmente, existen diversos IDEs muy com- pletos para el desarrollo de programas Prolog: el Amzi! utiliza Eclipse, muy conocido por la comunidad Java. 62 users.code
  • 5. Ejemplo: Java y Prolog Veamos un caso real de utilización de Prolog en una aplicación Java: se trata de una compañía que brinda servicios para manejar el financiamiento de propiedades. El centro de sus servicios es una aplicación web que permite a sus clientes buscar la mejor solución para un préstamo hipotecario. El módulo de cotizaciones fue desarrollado utilizando 5000 líneas de código Java y varias tablas de una base de datos; es el más crítico y el que soporta el mayor peso de las reglas de negocio. Era necesario cambiarlo todo el tiempo para adaptarse a nuevas reglas y factores de tasación. A esto se agregaba un largo ciclo de afirmación de Gerardo Rossel es Licenciado en Ciencias de la Compu- calidad, dado que la modificación de código procedural para realizar las adaptaciones era proclive a producir errores nuevos. Se precisaba una solución con menos errores y que permitiera una rápida adaptación a nuevas reglas: se reemplazó el módulo de tasaciones, construyendo un módulo lógico con Amzi!, y en dos meses las 5000 líneas Java y las 18 tablas de la base habían dado lugar a sólo 500 líneas Prolog. La base lógica resultante estaba casi libre de errores, y el ciclo de modificación/prueba se redujo en gran forma. El resto de la aplicación sigue en Java, aunque se planea migrar módulos particularmente complejos. Conclusiones Hemos presentado las características principales de la programación lógica encarnadas en su principal represen- tante: Prolog. Luego del ímpetu inicial con que contó, hoy se la puede ver como un paradigma adecuado para deter- minados dominios, como sistemas expertos y reglas de negocios. Integrándolo 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 programación con restric- ciones, soporte de paralelismo y concurrencia, etc. q tación y doctorando de la Facultad de Ciencias Exactas y Naturales de la UBA. Es docente e investigador (a cargo del Grupo de Investigación y Desarrollo de Agentes y Sis- temas Inteligentes del CAETI) en la Facultad de Tecnolo- gía Informática de la UAI. En el campo profesional, don- de actúa desde hace más de quince años, es Chief Scien- tist y responsable de ingeniería en Uppersoft Ingeniería de Software, representante de Amzi! Prolog en Sudamérica, y se especializa en inteligencia artificial, desarrollo de software (.NET y J2EE) y el diseño por contratos. Además, es consultor de proyectos especiales para Omnisis S.A.