<$BlogRSDUrl$>

Pro·Log·[IR]

Programación Lógica y Recuperación de Información

«Algorithm = Logic + Control» Robert Kowalski (1979)

¡Importante! esta página hace uso de estilos recogidos en la especificación CSS2, no soportados por el navegador que está utilizando. Por favor, lea esta recomendación al respecto.

Archivo

Guardado por meses.

Enlaces

Los siguientes listados son una referencia a partir de la cual ampliar la búsqueda de sitios relacionados (i).

Bitácoras en castellano

Bitácoras en inglés

Directorios, metablogs

Programación lógica, Inteligencia Artificial, Recuperación de Información

Usabilidad, Arquitectura de la Información

Listas, foros, wikis

Matemáticas, ciencias

Miscelánea

Búsquedas

Búsqueda simple en varios de los motores más conocidos. Para mayor precisión, entrar en la página correspondiente e ir al apartado de búsqueda avanzada.

Búsqueda con Google
 

Búsqueda con Yahoo!
 

Búsqueda con AlltheWeb

Varios

Esta página traducida:

Traducción al catalán, internostrum; traducción al portugués, universia.

Reciba un aviso de nuevos comentarios (por Bloglet).


Agregue este sitio a su lector de "feeds" (sindicación mediante el sistema Atom).

Sobre este sitio

Espacio dedicado a la programación lógica y la recuperación de información, con una atención especial al lenguaje Prolog y otros lenguajes afines, pertenecientes al paradigma lógico y declarativo. También se tratará de hablar de estos temas desde la perspectiva de la Biblioteconomía y la Documentación.

En esta página

17.10.03

Wiki para usuarios y desarrolladores de SWI-Prolog/XPCE

La comunidad de desarrolladores y usuarios de SWI-Prolog/XPCE, el compilador y entorno de desarrollo para Prolog creado y mantenido bajo la especificación ISO/Edimburgo (*) por el SWI (Universidad de Amsterdam), tiene su propio "Wiki" (definición de Wiki). Como herramienta de publicación utiliza TWiki, y es posible encontrar abundante documentación y ayudas sobre múltiples aspectos de este intérprete para Prolog, su librería para programación de interfaces gráficas de usuario (GUI's), y en general sobre dicho lenguaje de programación lógica.

Para tomar contacto con los contenidos de esta herramienta de publicación compartida, puede ser una buena idea, además de usar el buscador del sitio, comenzar por navegar a través de la página FAQ. Muy resumidamente, encontramos en este Wiki los siguientes apartados, al margen de los dedicados a la explicación y gestión de la propia herramienta de publicación:

Existe otro Twiki, Prolog Standardization, también auspiciado por el SWI, a través del cual los usuarios registrados pueden ayudar y hacer sugerencias en la tarea de definir y elaborar propuestas de estandarización que amplíen y perfeccionen la norma internacional vigente en la actualidad (ISO/IEC 13211-1, Programming Language Prolog Part I - General Core, 1995), primera y única aprobada hasta el momento como estándar ISO. El objetivo de esta iniciativa es unificar los planteamientos existentes al respecto, y superar la situación actual de dispersión [1] [2] del lenguaje, que se contrapone con la deseable y definitiva normalización de un estándar Prolog, dispersión que se materializa en la aparición de diversas implementaciones, comerciales y/o con fines académicos, a lo largo de los últimos años.

Estas implementaciones rara vez han soportado la totalidad de predicados ISO, y por contra han hecho uso de métodos y predicados particulares, no presentes en otras distribuciones. Tampoco han sido infrecuentes las diferencias de sintaxis en la escritura del código, e incluso la necesidad de hacer una declaración previa del tipo de variable/s que se va a utilizar (cadena de caracteres, constante, constante numérica, lista, etc.), cuando una de las características del lenguaje Prolog es precisamente que no es necesario hacer esa declaración, siendo sustituida, cuando lo requieren las necesidades de ejecución del programa, por comprobaciones de tipo. Veamos algunos ejemplos, ejecutados directamente en la línea de órdenes del intérprete:

?- integer(hola).

No
?- integer(75).

Yes
?- float(23).

No
?- float(88.5).

Yes

Las comprobaciones de tipo se realizan mediante una serie de predicados predefinidos que, dada una variable o parámetro de entrada, comprueban si se trata del tipo esperado, fallando en caso contrario. Los de uso más frecuente son "integer/1", "float/1", "number/1" y "atom/1". En un nivel de abstracción superior, es posible comprobar si un argumento (variable) está o no instanciado, mediante los predicados "var/1" y "nonvar/1".

Adviértase el uso de la notación functor/aridad para referenciar los predicados, donde el número que se indica tras la barra obliqua "/" expresa el número de argumentos ("0" en caso de ausencia de éstos). Así por ejemplo, si tomamos el predicado "append(X,Y,Z)", "append" es el functor, siendo "X", "Y" y "Z" los argumentos, y se expresa "append/3".

También es frecuente expresar los predicados, en las referencias técnicas del lenguaje Prolog, como sigue: "read(-Term)", "write(+Stream, +Term)", etc., donde el signo "-" (menos) denota que el predicado devolverá el argumento referenciado como un valor de salida, mientras que el signo "+" (más) indica lo contrario, el argumento es un valor de entrada. En determinados predicados los argumentos tienen un caracter reversible, es decir, pueden funcionar tanto como variables de entrada como de salida. Un ejemplo de estos últimos es el predicado "append/3". Dadas dos listas "L1" y "L2", devuelve una tercera lista "L3" que es el resultado de la concatenación de aquellas:

?- append([1,2],[3,4],Lista).

Lista = [1, 2, 3, 4]

Yes

Pero tambien, dada la lista concatenada "L3" y una de las dos listas iniciales, es capaz de proporcionar la lista restante:

?- append([1,2],Lista,[1,2,3,4]).

Lista = [3, 4]

Yes

El carácter reversible de los argumentos se indica mediante el símbolo "?", de forma que el predicado "append/3" se expresa en la notación que se viene comentando como "append(?L1, ?L2, ?L3)".

¿Un ejemplo práctico de comprobación de tipo? Supongamos un programa cuyo fin es determinar si una fecha introducida por el usuario como valor de entrada, se ajusta a un formato determinado (por ejemplo DD/MM/AA), y es además conforme con el sistema de calendario vigente en los países occidentales (calendario gregoriano). Este programa, entre otros cálculos, debería comprobar si lo introducido por el usuario son constantes numéricas, y no cualquier otra cosa, para lo cual se utilizaría el predicado "integer/1", que comprueba si el argumento de entrada es un número entero, fallando en caso contrario.

Téngase en cuenta que el programa descompondría, en primer lugar, la variable introducida por el usuario como una cadena única de caracteres, por ejemplo, "17/10/03", en tres variables distintas, "17", "10" y "03", que se corresponderían, respectivamente, con el día, mes y año de la fecha introducida.

La siguiente comprobación que debería hacer el programa es si se trata o no de la fecha de un año bisiesto. Son años bisiestos los múltiplos de 4, con la salvedad de aquellos que terminan en "00" (excepto casos especiales como el año 2000, que sí fue bisiesto). Este cálculo se puede realizar fácilmente, siendo de nuevo necesaria la utilización de una comprobación de tipo, mediante "integer/1" también en esta ocasión:

Cociente is Anio/4, integer(Cociente)

Si un número entero es múltiplo de 4, se entiende fácilmente que el cociente resultante de su división entre 4 debe ser también un número entero. Por tanto, la sentencia anterior se encarga de dividir la variable de entrada correspondiente al año ("Anio") entre 4, y si la variable de salida resultante ("Cociente") es un número entero, se infiere que la variable "Anio" se corresponde con un año bisiesto. Para calcular la situación contraria, se podría utilizar la siguiente sentencia:

Cociente is Anio/4, float(Cociente)

El predicado "float/1" comprueba si el argumento de entrada es una constante numérica de carácter decimal. Realmente no es necesaria esta segunda sentencia, ya que con la primera se contemplan implícitamente las dos posibles situaciones, es decir, que la variable "Cociente" sea o no una constante numérica entera, pudiendo obrar en consecuencia la ejecución del resto del programa (comprobación de los meses del año y los días del mes).

(*) El "estándar" de Edimburgo tiene su origen en el Prolog descrito por C.S. Clocksin y W.F. Mellish en su libro "Programming in Prolog" (Springer-Verlag, 1981), obra que ha conocido, traducida al castellano, varias ediciones a cargo de la editorial Gustavo Gili (e.g. Barcelona, 1993; ISBN: 84-252-1339-8).

[0] comentarios | # | lista |


Pro·Log·[IR],

Publicación: Blogger | Estadísticas: eXTReMe Tracking

Se recomienda ver este sitio con Mozilla 1+, Firefox 0.8+ ó Netscape 7+. Si no queda más remedio, con IE 6+. Si lo desea, comunique cualquier problema al respecto. También será bien recibida cualquier sugerencia sobre el contenido. La fuente de letra preferente es Georgia. Se prohibe la utilización del diseño de la página salvo autorización expresa del autor. Los contenidos escritos son de uso libre, siempre que se cite la fuente.