Otros lenguajes lógicos además de Prolog Inteligencia en redes de comunicaciones Otros Lenguajes Lógicos además de Prolog Eduardo Fernández Matamala Inteligencia en Redes de Comunicación La programación lógica es aquel tipo de programación que permite al software “razonar”, esto es, hacer razonamientos, por ejemplo, de tipo deductivo o inductivo. Dada una base de datos consistente en un conjunto de entidades, propiedades de esas entidades y relaciones de unas entidades con otras, el sistema es capaz de hacer razonamientos. Básicamente, este proceso se expresa de la siguiente forma: Resultados = reglas + hechos Donde entendemos que “hechos” es el conjunto de datos que conoce el sistema a priori(o que va adquiriendo a lo largo de su ejecución) y “reglas” son un conjunto de operaciones que se pueden aplicar a dichos datos para sacar un resultado lógico. Algunos campos donde este tipo de lenguajes es aplicado son en la implementación de Sistemas Expertos (programas que generan una respuesta o una recomendación sobre el tema para el que están implementados) o para la Generación de Nuevos Teoremas (dadas una serie de reglas, generan teoremas) Lenguajes Lógicos ALF (Another logical framework) Este lenguaje combina la programación lógica con la programación funcional (funcional – basado en la evaluación de expresiones y funciones matemáticas más que en la utilización de comandos como <alloc>, <malloc>…). Al igual que Prolog, ALF esta basado en “cláusulas de Horn” (por eso es programación lógica) pero también en funciones y ecuaciones (y por esto es también -1- Eduardo Fernández Matamala Otros lenguajes lógicos además de Prolog Inteligencia en redes de comunicaciones programación funcional). En ALF, se puede mezclar expresiones y ecuaciones; puedes poner una expresión funcional como si fuese un predicado y cualquier predicado puede ser introducido como condición en cualquier ecuación. La base del procesamiento de ALF es “resolution-narrowing-rewritingrejection”. ALF usa reglas de resolución para evaluar los literales y reglas de “estrechamiento”( “narrowing”) para evaluar las expresiones funcionales. Esto lo hace buscando en un árbol, que es una representación del lenguaje. Como el proceso de “narrowing” puede ser largo, se usan técnicas de “leftmost-innermost basic narrowing”, que son más eficientes (“el final de la expresión que se evalúa primero siempre es un cierre de paréntesis, el primer cierre y después de evaluar esta expresión, se sustituye todo él por el resultado al que se ha llegado, y se sigue procesando el siguiente paréntesis”). Además, las expresiones sufren un proceso de reescritura (“rewriting”) antes de ser procesadas por las reglas de “narrowing” y las ecuaciones cuyos dos lados de la igualdad no tengan el mismo nodo como origen son rechazadas (“rejected”). Estos dos pasos previos, hacen que la búsqueda sea mucho más eficiente. Además ALF usa ”backtracking” con búsqueda en profundidad en el árbol de derivaciones. Ejemplo de “narrowing”: Se definen las reglas: s(M)+N=s(M+N)) ; 0+N=N ; Tenemos la expression: X + s(0) = s(s(0)) Primer paso de narrowing: Si X=s(Y) Æ S(Y+s(0)) = s(s(0)) Segundo paso de narrowing: (unificación) Y+s(0) = s(0) Æ Y=0 Î Solución: X=s(0) Los programas escritos en ALF, se compilan y dan lugar a una serie de instrucciones de una máquina virtual basada en Warren Abstract Machine (WAM) con múltiples extensiones para soportar “narrowing and rewriting”. Actualmente, esta máquina virtual es un emulador y su implementación está basada en C. Este lenguaje es “open Source”, por lo que cualquier usuario puedo introducir sus funciones y modificarlo a su gusto. Aquí tenemos un ejemplo de este lenguaje. En este caso, es un archivo de la librería predefinida, en el que se define lo que es un vector y suspropiedades. -2- Eduardo Fernández Matamala Otros lenguajes lógicos además de Prolog Inteligencia en redes de comunicaciones Gödel programming language Gödel es un lenguaje en el que las sentencias lógicas llevan un orden y en el que existe el polimorfismo. Está basado en módulos (que aceptan polimorfismo) y en tipos de datos (soporta enteros y racionales con una precisión infinita, y número en coma flotante) y tiene una amplia librería de módulos predefinidos. Es un buen lenguaje para tareas de meta-programación, tales como compilación, depuración, análisis, verificación o transformación de programas, ya que es mucho más declarativo que Prolog, por ejemplo. Como curiosidad, se puede destacar que este lenguaje no funciona en un entorno Windows. Ejemplo: Máximo Común Divisor MODULE IMPORT PREDICATE GCD. Integers. Gcd : Integer * Integer * Integer. Gcd(i,j,d) <CommonDivisor(i,j,d) & ~ SOME [e] (CommonDivisor(i,j,e) & e > d). PREDICATE CommonDivisor : Integer * Integer * Integer. CommonDivisor(i,j,d) <IF (i = 0 \/ j = 0) THEN d = Max(Abs(i),Abs(j)) ELSE 1 =< d =< Min(Abs(i),Abs(j)) & i Mod d = 0 & j Mod d = 0. -3- Eduardo Fernández Matamala Otros lenguajes lógicos además de Prolog Inteligencia en redes de comunicaciones Mercury programming language Mercury es un lenguaje de alto nivel (es decir, no se preocupa de problemas como la reserva y liberación de memoria) derivado de Prolog, pero con una implementación que le hace ser más útil para representar y tratar problemas del mundo real. Combina toda la expresividad del lenguaje declarativo con avanzadas técnicas de análisis estático y detección de errores. Es un lenguaje compilado, lo que le permite detectar numerosos errores antes de poder ejecutar la aplicación. El compilador “traduce” el programa de lenguaje Mercury a C, que es un lenguaje portable a cualquier plataforma. Además, al igual que el lenguaje de Gödel, Mercury es un lenguaje que utiliza módulos, lo que da una gran modularidad en el desarrollo de aplicaciones, solventando así uno de los mayores problemas a los que se enfrentaban los lenguajes de programación lógicos. Las principales características de Mercury son: • • • Es puramente declarativo Æ los predicados y funciones en Mercury siempre obtienen conclusiones lógicas La comunicación con el programa es mediante una librería de funciones que necesitan como parámetro el estado anterior del “mundo” además del resto de parámetros que considere el usuario necesario y dan como salida el nuevo estado del “mundo” además de otros resultados específicos. La declaración de tipos en Mercury se hace de manera lógica: :- type maybe(T) ---> • yes(T) ; no. Se puede predeterminar el número de veces que se va a llamar a un predicado dentro del programa. :- pred factorial(int::in, int::out) is det. • • “det” indica una vez, “semidet” como mucho una vez, “multi” al menos una vez y “nondet” un número arbitrario de veces El compilador comprobará que se cumple y, en caso contrario, rechazará el programa Mercury tiene un sistema modular. Los programas consisten en la composición de uno o más módulos. Cada módulo tiene una sección llamada <interface> donde se declaran todos los tipos, funciones y predicados que se pueden exportar a otros módulos y otra sección <implementation> donde están las definiciones de las entidades exportadas así como definiciones de tipos y predicados no exportables, locales al módulo. El compilador genera código muy eficiente La última versión estable de Mercury es la 0.11.0, aunque ya hay una versión beta estable, la 0.11.1 (2004-06-30) Ejemplo: HolaMundo -4- Eduardo Fernández Matamala Otros lenguajes lógicos además de Prolog Inteligencia en redes de comunicaciones :- module hello_world. :- interface. :- import_module io. :- pred main(io__state, io__state). :- mode main(di, uo) is det. :- implementation. main --> io__write_string("Hello, World!\n"). Otro ejemplo: Problema de las 9 Reinas Código En Mercury aquí Código generado por el compilador Mercury aquí Lista de lenguajes lógicos • ACE, PALS: And/Or-Parallel Implementation of Prolog ÆEs una implementación de Prolog, pero que soporta una arquitectura multiprocesador Æ http://www.cs.nmsu.edu/lldap/NewSite/bugrep.htm • Actor Prolog Æ http://www.cplire.ru/Lab144/ • ALF Æ http://www.cs.chalmers.se/Cs/Research/Logic/alf/guide.html • CLP(FD) ÆOtra extensión de Prolog, especializado en los problemas CSPs (Constraint Satisfaction Problem) De forma general, podemos decir que un programa en CLP(FD) consta de tres partes: “generación de variables” (donde también se especifica su domino), “definición de restricciones” (sobre las variables) y “labeling”, donde se instancian las variables por enumeración. Ejemplo: SEND MORE MONEY puzzle sendmory(Vars):Vars=[S,E,N,D,M,O,R,Y], % variable generation Vars :: 0..9, alldifferent(Vars), % constraint generation S #\= 0, M #\= 0, 1000*S+100*E+10*N+D + 1000*M+100*O+10*R+E #= 10000*M+1000*O+100*N+10*E+Y, labeling(Vars). % labeling • cu-Prolog -5- Eduardo Fernández Matamala Otros lenguajes lógicos además de Prolog Inteligencia en redes de comunicaciones Æ Otro lenguaje lógico para CSPs • Eclipse Æ Programación lógica con restricciones Æ http://www.icparc.ic.ac.uk/eclipse/ • Elf Æ Programación lógica con restricciones basado en Logical Framework (metalenguaje) Æ http://www-2.cs.cmu.edu/afs/cs/user/fp/www/elf.html • Flang Æ Programación lógica-funcional • Fish Æ http://fishell.sourceforge.net/ • Gödel Æ http://www.cs.bris.ac.uk/~bowers/goedel.html • KLIC Æ Programación lógica concurrente. Derivado del lenguaje KL1 , que a su vez, es derivado de GHC (Guarded Horn Clauses) Æ http://www.klic.org/ • Lambda Prolog Æ Extensión de Prolog, incluyendo tipos polimórficos, módulos y tipos de datos abstractos. Æ http://www.lix.polytechnique.fr/Labo/Dale.Miller/lProlog/index.html • LIFE (Logic, Inheritance, Functions, and Equations) Æ Trata de ser la unificación de los lenguajes lógicos, funcionales y orientados a objetos • Logtalk Æ Extensión a Prolog orientada a objetos Æ http://www.logtalk.org/ • Mercury Æ http://www.cs.mu.oz.au/research/mercury/index.html • MONA Æ Lenguaje lógico y además “traduce” los programas (fórmulas) a autómatas de estados finitos Æ http://www.brics.dk/mona/ • Muse -6- Eduardo Fernández Matamala Otros lenguajes lógicos además de Prolog Inteligencia en redes de comunicaciones Æ Versión Or-parallel del lenguaje SICTStus Prolog Æ http://www.sics.se/ps/muse.html • Progol • RELFUN Æ Extiende la lógica de Horn con sintaxis de orden superior Æ http://www.dfki.uni-kl.de/~vega/relfun.html • SAMPLE Æ http://sampletalk.8m.com/ • SICStus Prolog Æ Igual que Prolog, pero conforme al estándar ISO/IEC Æ http://www.sics.se/sicstus.html Además… Existen numerosas extensiones y compiladores de Prolog: Aquarius Prolog, GNU Prolog, Beta-Prolog, BinProlog… Æ http://www.codebox.8m.com/prolog.htm Ejemplo: Código escrito en Prolog /* Filename: ancestor.pro Author: Br. David Carlson Date: December 6, 1999 This program creates a small set of facts and rules on who is the ancestor of whom. The user types the desired goal interactively when the program is run. */ /* Note that ancestor(A, B) means that A is an ancestor of B. */ ancestor(bob, susan). ancestor(A, X) :- parent(A, X). ancestor(A, X) :- parent(A, C), ancestor(C, X). /* Note that parent(P, C) means that P is a parent of C. */ parent(fred, sally). parent(tina, sally). parent(sally, john). parent(sally, diane). parent(sam, bill). En este enlace hay diversos ejemplos: http://cis.stvincent.edu/carlsond/prolog.html Bibliografía: www.wikipedia.com http://vl.fmnet.info/logic-prog/#others -7- Eduardo Fernández Matamala