tag:blogger.com,1999:blog-54548822008-03-28T20:50:40.407+01:00Programación Lógica y Recuperación de Informaciónetxehttp://www.blogger.com/profile/10987668917577281087noreply@blogger.comBlogger50125tag:blogger.com,1999:blog-5454882.post-1141666755832184692006-03-06T18:37:00.000+01:002006-03-20T17:46:39.213+01:00DCG: notación de reglas gramaticales en Prolog<p>La notación de reglas gramaticales DCG (Definite Clause Grammar,
en castellano <em>gramática de cláusulas definidas</em>) es
una variante o extensión sintáctica de la sintaxis ordinaria
del lenguaje Prolog, cuyo objeto es implementar gramáticas formales
de forma abreviada, y en consecuencia simplificar y hacer más legibles
los analizadores sintácticos escritos en este lenguaje, ya que permite
manejar información (entiéndase por ésta "variables")
implícita. Su expresión es una notación abreviada
de la sintaxis del lenguaje Prolog, recogida por la práctica totalidad
de los <em>parsers</em> e intérpretes actuales para este lenguaje, que la
transforman automáticamente y de forma interna en cláusulas
normales. En la notación <acronym title="Definite Clause Grammar" lang="en">DCG</acronym>
el operador infijo ":-" es sustituido por el operador del mismo carácter
"-->", y se puede establecer, a modo de ejemplo, la siguiente correspondencia
entre notaciones, siendo la primera la cláusula Prolog en sintaxis ordinaria, y la segunda
la notación <acronym title="Definite Clause Grammar" lang="en">DCG</acronym>
equivalente:</p>
<p class="codigo">oracion(S0,S) :- sintagma_nominal(S0,S1), sintagma_verbal(S1,S).<br />
oracion --> sintagma_nominal, sintagma_verbal.</p>
<p>La anterior cláusula Prolog se expresa en palabras como sigue:</p>
<blockquote>"Existe una oración entre S0 y S si existe un sintagma nominal
entre S0 y S1, y existe un sintagma verbal entre S1 y S"</blockquote>
<p>La notación <acronym title="Definite Clause Grammar" lang="en">DCG</acronym>
se basa en la utilizada para las <a href="http://es.wikipedia.org/wiki/Gram%C3%A1tica_libre_de_contexto">gramáticas libres de contexto</a> (<em>context-free
grammars</em> o CFGs, <a href="http://es.wikipedia.org/wiki/Gram%C3%A1tica_transformacional">N. Chomsky</a>), estructura jerárquica que indica
las relaciones de las construcciones del lenguaje, descritas mediante notación
BNF (<em>Backus Normal Form</em> ó
<em>Backus-Naur form</em>), creada
originalmente para definir la estructura sintáctica del lenguaje
ALGOL60 (1960, John Backus), y muy utilizada tanto para definir la estructura
sintáctica de los lenguajes de programación, como para definir
estructuras sintácticas de los lenguajes en general. Por tanto, mediante notación <acronym title="Definite Clause Grammar" lang="en">DCG</acronym>,
es posible manejar directamente en lenguaje Prolog gramáticas libres de contexto. Las gramáticas
libres de contexto vienen a ser una simplificación de la gramática
ordinaria, que, por ejemplo, y referida al idioma castellano, podría
adoptar la siguiente expresión en notación <acronym title="Definite Clause Grammar" lang="en">DCG</acronym>:</p>
<div class="codigo">
<p>oracion --> sintagma_nominal, sintagma_verbal.</p>
<p>sintagma_nominal --> determinante, nombre.</p>
<p>sintagma_verbal --> verbo, sintagma_nominal.
<br />sintagma_verbal --> verbo.</p>
<p>determinante --> [el].
<br />determinante --> [la].</p>
<p>nombre --> [hombre].
<br />nombre --> [manzana].</p>
<p>verbo --> [come].
<br />verbo --> [canta].</p>
</div>
<p>Que el sistema Prolog (en este caso <a href="http://www.swi-prolog.org/" lang="en">SWI-Prolog</a>)
traduce automáticamente al siguiente conjunto de cláusulas:</p>
<div class="codigo">
<p>oracion(A,B):- sintagma_nominal(A,C),
<br />
sintagma_verbal(C,B).</p>
<p>sintagma_nominal(A,B):- determinante(A,C),
<br />
nombre(C,B).</p>
<p>sintagma_verbal(A,B):- verbo(A,C),
<br />
sintagma_nominal(C,B).
<br />sintagma_verbal(A,B):- verbo(A,B).</p>
<p>determinante([el|A],A).
<br />determinante([la|A],A).</p>
<p>nombre([hombre|A],A).
<br />nombre([manzana|A],A).</p>
<p>verbo([come|A],A).
<br />verbo([canta|A],A).</p>
</div>
<p>Como es fácilmente deducible, el programa basado en esta pequeña
y muy limitada gramática, solo aceptará como oraciones gramaticalmente
correctas "el hombre come la manzana", "el hombre canta", y combinaciones
similares, incluso por ejemplo frases a todas luces gramaticalmente incorrectas
como "la manzana canta", "la hombre come", etc., devolviéndonos
una lista vacía, pero no aceptará por ejemplo "el hombre
baila" (el verbo "baila" no se halla dentro de la base de hechos o conocimiento
del programa). Se entiende por tanto que una gramática completa,
que abarque todas las posibles estructuras, relaciones y combinaciones de
las partes constitutivas de una lengua, requiere un programa muy complejo
y difícil de implementar. En el ejemplo expuesto, se pueden obtener
todas las oraciones aceptadas como gramaticalmente correctas por la gramática
del programa, lanzando en el intérprete el siguiente objetivo:</p>
<p class="codigo">?- oracion(X,[]).</p>
<p>Por su parte, un ejemplo muy sencillo de gramática para el idioma
inglés, escrita mediante notación <acronym title="Definite Clause Grammar" lang="en">DCG</acronym>,
adopta la siguiente expresión:</p>
<div class="codigo">
<p>sentence --> noun_phrase, verb_phrase.</p>
<p>noun_phrase --> noun.
<br />noun_phrase --> determiner, noun, rel_clause.</p>
<p>verb_phrase --> verb.
<br />verb_phrase --> verb, noun_phrase.</p>
<p>rel_clause --> [].
<br />rel_clause --> [that], verb_phrase.</p>
<p>determiner --> [the].
<br />determiner --> [a].</p>
<p>noun --> [john].
<br />noun --> [annie].
<br />noun --> [man].
<br />noun --> [men].
<br />noun --> [woman].
<br />noun --> [women].
<br />...</p>
<p>verb --> [like].
<br />verb --> [likes].
<br />...</p>
</div>
<p>En la notación <acronym title="Definite Clause Grammar" lang="en">DCG</acronym>
se suprimen dos parámetros, una lista de entrada, y una lista de
salida. La primera puede estar representada, por ejemplo, por la oración
[el,perro,muerde] y la segunda por una lista vacía [] que es el
resultado de comprobar la estructura sintáctica de dicha oración
en función del <em>parser</em> utilizado. Adicionalmente, es posible
agregar variables a las gramáticas representadas mediante notación <acronym title="Definite Clause Grammar" lang="en">DCG</acronym>, por ejemplo para especificar el género y el número.</p>
<p>Como se ha dicho anteriormente, la notación <acronym title="Definite Clause Grammar" lang="en">DCG</acronym>
permite añadir argumentos adicionales, y también incorporar objetivos Prolog
en el cuerpo de las reglas, estos últimos encerrados entre llaves
{}. Los argumentos adicionales nos permitirían por ejemplo introducir
las reglas gramaticales correctas en función de las convenciones
adoptadas por la lengua objeto de representación, y así evitar incorrecciones en la concordancia género / número,
etc. También, mediante notación <acronym title="Definite Clause Grammar" lang="en">DCG</acronym>
también es posible construir programas capaces de representar árboles
de análisis de una oración (que representan las categorías
gramaticales implicadas en la descomposición de sus partes), y <a href="http://www.nyu.edu/pages/linguistics/ling.html#tree" lang="en">árboles
sintácticos</a> (<em>parse trees</em>) que de una forma gráfica
muestran la estructura en forma de árbol descendente de determinada
construcción gramatical. Como explicamos en la anterior anotación,
los analizadores sintácticos o <em>parsers</em> se encargan de la
construcción de árboles de análisis de las oraciones
de una lengua, capaces de representar la estructura sintagmática
de las mismas. Siguiendo con el ejemplo de la sencilla gramática
en castellano, expuesto más arriba, la representación gráfica
del árbol de análisis de la oración "el hombre come
la manzana" presenta el siguiente aspecto, haciendo uso para ello <a href="http://www.sdsc.edu/~ludaesch/CSE232b-02/draw.swi">de
este programa</a>:</p>
<div class="codigo">
<p>?- draw(o(sn(d(el),n(hombre)),sv(v(come),sn(d(la),n(manzana))))).</p>
<p>
o
<br />
|
<br /> +--------------------+
<br /> sn
sv
<br /> |
|
<br /> +-------+ +------------+
<br /> d n
v sn
<br /> | |
| |
<br /> | |
| +--------+
<br /> | |
| d
n
<br /> | |
| |
|
<br /> | |
| |
|
<br /> el hombre come
la manzana</p>
</div>
<p>Donde "o" = oración, "sn" = Sintagma Nominal, "d" = Determinante,
"n" = Nombre, "sv" = Sintagma Verbal, y "v" = Verbo. Hay que advertir que
este programa no realiza el árbol de análisis propiamente
dicho, que es:</p>
<p class="codigo">o(sn(d(el),n(hombre)),sv(v(come),sn(d(la),n(manzana))))</p>
<p>Simplemente lleva a cabo su representación gráfica en
forma de diagrama de caracteres <acronym title="American Standard Code for Information Interchange" lang="en">ASCII</acronym>.
El código fuente del programa en cuestión, que originalmente
se llama <a href="http://www.sdsc.edu/~ludaesch/CSE232b-02/draw.swi">draw.swi</a>,
ha sido copiado a un editor de texto plano, y salvado con la extensión
".pl" para poder ser ejecutado por el intérprete <a href="http://www.swi-prolog.org/" lang="en">SWI-Prolog</a>,
aunque otra opción es asociar los archivos con extensión
".swi" con el ejecutable de dicho intérprete. Su autor es <a href="http://users.sdsc.edu/~ludaesch/" lang="en">Bertram
Ludäscher</a>, de la "University of California Davis".</p>
<p>Los ejemplos de notación <acronym title="Definite Clause Grammar" lang="en">DCG</acronym>
y Prolog en castellano se han tomado del capítulo 9, "Uso de reglas
gramaticales en Prolog", apartado 9.1, "El problema del análisis
sintáctico", de la obra de W.F. Clocksin y C.S. Mellish "Programación
en Prolog" (2ª ed.; Barcelona: Gustavo Gili, 1993; ISBN: 84-252-1339-8),
traducción del original en inglés "Programming in Prolog",
a la que me remito para obtener una explicación detallada sobre
reglas gramaticales, análisis sintáctico, y notación <acronym title="Definite Clause Grammar" lang="en">DCG</acronym>
en Prolog, habida cuenta de que los autores reseñados hacen una
exposición clara y perfectamente comprensible sobre el particular,
perfectamente asequible para las personas no excesivamente versadas en
este lenguaje.</p>
<p>Por su parte el ejemplo de gramática en inglés se ha obtenido
del capítulo 17, "Languague Processing with Grammar Rules", de la
obra "Prolog - Programming for Artificial Intelligence" (Ivan Bratko, 2ª
ed.; Addison-Wesley, 1990; ISBN: 0-201-41606-9). Se trata de un libro muy
recomendable, de nivel más avanzado y completo que el de Clocksin
y Mellish, claramente más introductorio, y como su propio nombre
indica cubre por un lado las generalidades del lenguaje Prolog, y por otro
lado su aplicación a las principales técnicas del campo de
la <acronym title="Inteligencia Artificial">IA</acronym> (búsqueda
y clasificación, sistemas expertos y representación del conocimiento, <acronym title="Procesamiento del Lenguaje Natural">PLN</acronym>,
Machine Learning, etc.).</p>
<p>Por último, mencionar otro ejemplo de utilización práctica
de la notación <acronym title="Definite Clause Grammar" lang="en">DCG</acronym> y el lenguaje de programación lógica Prolog, la librería
Html-write [<a href="http://gollem.science.uva.nl/twiki/pl/bin/view/Library/HtmlWrite" lang="en">1</a>]
[<a href="http://www.swi-prolog.org/packages/http.html#sec:3.8" lang="en">2</a>]
[<a href="http://www.mycgiserver.com/~gpiancastelli/archives.jsp?post=0050" lang="en">3</a>]
del intérprete y entorno de desarrollo <a href="http://www.swi-prolog.org/" lang="en">SWI-Prolog</a>,
que traslada términos Prolog en <acronym title="HyperText Markup Language" lang="en">HTML</acronym>, generando salidas en este último lenguaje, para lo cual hace uso precisamente de estructuras escritas en notación <acronym title="Definite Clause Grammar" lang="en">DCG</acronym>.</p>
<p>Más información (<acronym title="Procesamiento del Lenguaje Natural">PLN</acronym>
y <acronym title="Definite Clause Grammar" lang="en">DCG</acronym>s
en Prolog):</p>
<ul class="conmargeninf">
<li>
<a href="http://www.amzi.com/AdventureInProlog/advfrtop.htm">Adventure
in Prolog</a> - <a href="http://www.amzi.com/AdventureInProlog/a15nlang.htm">15.
Natural Language</a>.</li>
<li>
En <a href="http://www.coli.uni-saarland.de/~kris/learn-prolog-now/" lang="en">Learn
Prolog Now!</a>: <a href="http://www.coli.uni-saarland.de/~kris/learn-prolog-now/html/node54.html" lang="en">7.
Definite Clause Grammars</a>, <a href="http://www.coli.uni-saarland.de/~kris/learn-prolog-now/html/node64.html" lang="en">8.
More Definite Clause Grammars</a> (<a href="http://www.loria.fr/~blackbur/">P.
Blackburn</a>, <a href="http://www.cogsci.ed.ac.uk/~jbos/">J. Bos</a>,
<a href="http://www.coli.uni-sb.de/~kris/">K.
Striegnitz</a>).</li>
<li>
<a href="http://www.ida.liu.se/~ulfni/lpp/">Logic, Programming and Prolog</a>
- 10. Logic and Grammars (monografía, en formato PDF; U. Nilsson,
J. Maluszynski).</li>
<li>
<a href="http://www.cogs.susx.ac.uk/lab/nlp/gazdar/nlp-in-prolog/">Natural
Language Processing in Prolog</a> (<a href="http://www.cogs.susx.ac.uk/lab/nlp/gazdar/">G.
Gazdar</a>, C. Mellish; <a href="http://www.cogs.susx.ac.uk/local/books/nlp-in-prolog/index.html">otra
ubicación</a>).</li>
<li>
<a href="http://www.ucm.es/info/atg/COMP-COURSE/cl_parsing.html">Parsing
in Natural Language Processing</a> (<a href="http://www.ucm.es/info/atg/COMP-COURSE/cl.html">Julia
Lavid</a>).</li>
<li>
<a href="http://www.cs.vu.nl/~dick/PTAPG.html">Parsing Techniques - A Practical
Guide</a> (monografía, varios formatos; D. Grune, Ceriel J.H. Jacobs).</li>
<li>
<a href="http://utenti.lycos.it/parsers/index.htm">Parsing techniques in
Prolog</a> (monografía, formato ".doc"; Klaus von Bremen).</li>
<li>
<a href="http://www.mtome.com/">Prolog and Natural-Language Analysis</a>
(monografía, formato PDF; F.C.N. Pereira, S.M. Shieber).</li>
<li>
<a href="http://www.csupomona.edu/~jrfisher/www/prolog_tutorial/contents.html">Prolog
Tutorial - 7. Introduction to Natural Language Processing</a> (<a href="http://www.csupomona.edu/~jrfisher/www/">J.R.
Fisher</a>).</li>
<li>
<a href="http://cs.wwc.edu/~cs_dept/KU/PR/Prolog.html#dcg">Prolog Tutorial
- Definite Clause Grammars</a> (A. Aaby; <a href="http://cs.wwc.edu/KU/PR/Prolog.html#dcg" lang="en">otra
ubicación</a>).</li>
<li>
<a href="http://cs.wwc.edu/~aabyan/LogicPgmg/naturalLanguage.html" lang="en">Natural
Language Processing</a> (A. Aaby).</li>
<li>
<a href="http://cs.wwc.edu/~aabyan/LogicPgmg/CODE/DCG/doc/doc.html" lang="en">A
Natural Language Processor</a> (A. Aaby).</li>
<li>
<a href="http://www.dai.ed.ac.uk/groups/ssp/bookpages/quickprolog/quickprolog.html">Quick
Prolog</a> - <a href="http://www.dai.ed.ac.uk/groups/ssp/bookpages/quickprolog/node27.html">Definite
Clause Grammars</a> (D.S. Robertson).</li>
<li>
<a href="http://www.info.ucl.ac.be/people/PVR/edcg.html" lang="en">Extended
DCG's: Declarative Programming with State</a> (<a href="http://www.info.ucl.ac.be/people/cvvanroy.html">Peter
Van Roy</a>).</li>
<li>
<a href="http://www.ai.uga.edu/mc/ProNTo/" lang="en">ProNTo - Prolog Natural
Language Tools</a>.</li>
</ul>
<p>Específicamente sobre <acronym title="Definite Clause Grammar" lang="en">DCG</acronym>:</p>
<ul class="conmargeninf">
<li>
<a href="http://www.cs.sfu.ca/cs/people/Faculty/Cameron/Teaching/383/DCG.html" lang="en">Parsing
in Prolog</a> (<a href="http://www.cs.sfu.ca/~cameron/Teaching/384/99-3/DCG.html" lang="en">otra
ubicación</a>).</li>
<li>
<a href="http://www.cs.sfu.ca/cs/people/Faculty/Cameron/Teaching/383/DCG2.html" lang="en">Definite
Clause Grammars</a> (<a href="http://www.cs.sfu.ca/~cameron/Teaching/384/99-3/DCG2.html" lang="en">otra
ubicación</a>).</li>
<li>
<a href="http://www.cs.sfu.ca/cs/people/Faculty/Cameron/Teaching/383/regexp-plg.html" lang="en">Perl
Style Regular Expressions in Prolog</a> (<a href="http://www.cs.sfu.ca/~cameron/Teaching/384/99-3/regexp-plg.html" lang="en">otra
ubicación</a>).</li>
<li>
<a href="http://www.ingenio.co.uk/prolog/dcgs.html" lang="en">Introduction
to Definite Clause Grammars</a>.</li>
</ul>
<p>CFGs y BNF:</p>
<ul class="conmargeninf">
<li>
<a href="http://www.cs.buap.mx/~jcom/lprog/gramaticas.html">Lenguajes de
Programación: Notación BNF y otras gramáticas</a>.</li>
<li>
<a href="http://cui.unige.ch/db-research/Enseignement/analyseinfo/AboutBNF.html" lang="en">What
is BNF notation?</a></li>
<li>
<a href="http://foldoc.doc.ic.ac.uk/foldoc/foldoc.cgi?Backus-Naur+Form" lang="en">Backus-Naur
Form</a> (en <acronym title="Free On-Line Dictionary of Computing" lang="en"><a href="http://foldoc.doc.ic.ac.uk/foldoc/index.html" lang="en">FOLDOC</acronym></a>).</li>
<li>
<a href="http://en2.wikipedia.org/wiki/Context-free_grammar" lang="en">Context-free
grammar</a> (en <a href="http://en2.wikipedia.org/" lang="en">Wikipedia</a>).</li>
</ul>
<p>Forman parte del mismo conjunto de <a href="http://www.cs.sfu.ca/cs/people/Faculty/Cameron/Teaching/383/" lang="en">lecturas
de clase</a>:</p>
<ul class="conmargeninf">
<li>
<a href="http://www.cs.sfu.ca/cs/people/Faculty/Cameron/Teaching/383/syn-sem-prag-meta.html" lang="en">Four
Concepts in Programming Language Description: Syntax, Semantics, Pragmatics
and Metalanguage</a>.</li>
<li>
<a href="http://www.cs.sfu.ca/cs/people/Faculty/Cameron/Teaching/383/BNF.html" lang="en">Grammatical
Description of Syntax: The BNF Metalanguage</a>.</li>
<li>
<a href="http://www.cs.sfu.ca/cs/people/Faculty/Cameron/Teaching/383/deriv-ambig.html" lang="en">Derivations,
Ambiguity and Semantics</a>.</li>
<li>
<a href="http://www.cs.sfu.ca/cs/people/Faculty/Cameron/Teaching/383/RegExpMetalanguage.html" lang="en">Nonrecursive
Syntax: The Regular Expression Metalanguage</a>.</li>
<li>
<a href="http://www.cs.sfu.ca/cs/people/Faculty/Cameron/Teaching/383/syn-issues.html" lang="en">Between
Lexics and Syntax: Whitespace, Layout, Comment Conventions</a>.</li>
</ul>etxehttp://www.blogger.com/profile/10987668917577281087noreply@blogger.comtag:blogger.com,1999:blog-5454882.post-1141001781771714832006-02-27T01:55:00.000+01:002006-02-28T11:16:09.893+01:00Analizadores sintácticos y tokenización<p>Dentro del complejo y amplio ámbito de dominio del Procesamiento
del Lenguaje Natural (PLN), una de las funciones esenciales de los analizadores sintácticos
o <em>parsers</em> es el análisis de cadenas de <em>tokens</em> en busca
de posibles errores sintácticos (recordemos que la sintaxis, entendida en sentido amplio, es aquella parte
de la gramática que se ocupa de las normas que rigen la formalización
de las <em>palabras</em> en estructuras mayores tales como las <em>oraciones</em>,
así como de las relaciones que establecen entre si dichas palabras). Un <em>token</em> se puede definir
como la unidad mínima de información con significado propio
dentro de una secuencia de caracteres alfanuméricos. Estas cadenas
de unidades mínimas de información o <em>unidades léxicas</em>,
son generadas previamente por el módulo lexicográfico integrado
en el parser, encargado de identificarlas dentro de un texto o secuencia
ordenada de caracteres alfanuméricos. Por su parte, la <em>tokenización</em>
es un proceso consistente en la descomposición, en forma de lista,
de esas cadenas de <em>tokens</em> en sus unidades mínimas. Así,
un programa de este tipo podría generar la siguiente lista de <em>tokens</em>
a partir de la frase "¡Hola Mundo!":</p>
<p class="codigo">[161, 72, 111, 108, 97, 32, 77, 117, 110, 100, 111, 33]</p>
<p>Donde cada uno de los números de la lista se corresponde con el
carácter ASCII (American Standard Code for Information Interchange) correspondiente a cada una de las unidades mínimas de significación
identificadas en la frase, en el mismo orden. Por supuesto es posible llevar
a cabo el proceso inverso, y a partir de esa lista generar las cadenas
de <em>tokens</em> que forman la frase en cuestión. La <em>tokenización</em>
es por tanto el proceso básico que permite manejar el lenguaje natural
escrito para su posterior procesamiento, en base a su descomposición
en unidades mínimas de información con significado propio.</p>
<p>La mayor parte de los lenguaje de programación contemplan instrucciones
específicas para llevar a cabo el proceso de <em>tokenización</em>
de cadenas ordenadas de caracteres alfanuméricos, si bien es posible
implementar alternativamente esta operación mediante otros procedimientos
proporcionados por esos lenguajes.</p>
<p>Así, un programa que pretenda "leer" un texto, deberá
en primer lugar "tokenizarlo", generando una lista de los <em>tokens</em>, o unidades
léxicas mínimas con significado propio, identificados en
ese texto. A continuación, procederá a identificar unidades
mayores de significado propio (contemplando por ejemplo la presencia, como
elemento separador, del carácter <acronym title="American Standard Code for Information Interchange" lang="en">ASCII</acronym> 36, que se corresponde con
el espacio en blanco), lo que podríamos asimilar como "palabras",
para, finalmente, acabar identificando otras unidades de significación
de orden superior, frases u oraciones. Diferenciadas las oraciones del
texto "leído", el parser procede a realizar el análisis sintáctico
propiamente dicho, identificando para ello las partes constitutivas de
dichas oraciones que, a tal fin, son comparadas con patrones previamente
definidos de estructuras posibles, que dependerán de la lengua de
escritura del texto, y del nivel de complejidad de análisis que
se pretenda alcanzar, ya que contemplar todas las posibles estructuras
de una lengua y sus numerosas variaciones, y representarlas mediante una
serie de reglas, no es una tarea precisamente sencilla.</p>
<p>La detección de las variaciones de posición admitidas
en cada lengua, en relación con el orden de las palabras, o análisis
de las transformaciones, se realiza mediante procesos de análisis
estructural que tratan de identificar la estructura profunda de una oración
en relación con su estructura superficial. El análisis estructural,
en base a la estructura superficial (2) de una oración y, cambiando
el orden de determinadas palabras, trata de determinar su posible transformación
a una estructura de tipo profundo (1):</p>
<blockquote>(1) Estructura profunda: "Pedro come una manzana"<br />
(2) Estructura superficial: "Come Pedro una manzana"</blockquote>
<p>La implementación del proceso de <em>tokenización</em>, al
margen de la utilización de instrucciones específicas que
transforman directamente una cadena de caracteres alfanuméricos
en una cadena de <em>tokens</em>, implica la utilización de otro tipo de
instrucciones cuya función es la "lectura" individual, uno a uno,
de los caracteres presentes en el canal o grupo activo de entrada de datos
(<em>input stream</em>) que se halla especificado, que por lo general será
bien el teclado del ordenador, que es el canal activo de entrada por defecto
(al igual que el canal de salida de datos, <em>output stream</em>, por defecto
es el monitor del ordenador), o bien un fichero de texto ubicado en la
ruta que se indique.</p>
<p>Así, en el lenguaje Prolog existe el predicado predefinido <strong>name(?AtomOrInt,
?String)</strong>. El argumento <strong>AtomOrInt</strong> es la variable que representa
la cadena de caracteres alfanuméricos o "átomo" que se desea
<em>tokenizar</em>, mientras que el argumento <strong>String</strong> es la variable
que representa la lista resultante. El símbolo "<strong>?</strong>" indica
que ambos argumentos son reversibles, es decir, que pueden funcionar tanto
como variables de entrada de datos como variables de salida, si bien uno
de ellos ha de estar necesariamente instanciado. Su modo de funcionamiento
es el siguiente:</p>
<div class="codigo">
<p>?- name('¡Hola Mundo!', X).</p>
<p>X = [161, 72, 111, 108, 97, 32, 77, 117, 110|...] [write]</p>
<p>X = [161, 72, 111, 108, 97, 32, 77, 117, 110, 100, 111, 33]</p>
<p>Yes</p>
</div>
<p>La indicación <strong>[write]</strong> simplemente expresa que, una vez que
el intérprete proporciona la lista de <em>tokens</em>, incompleta como indica
la barra vertical seguida de puntos suspensivos "<strong>|...</strong>", se ha tecleado
el operador <strong>w</strong> para que ésta se muestre en toda su extensión,
ya que, en este caso <a href="http://www.swi-prolog.org/" lang="en">SWI-Prolog</a>,
muestra por defecto en pantalla una versión abreviada de las listas,
cuando estas exceden determinada longitud (no obstante se pueden obtener
listas completas utilizando el comando "w", tal y como se explica <a href="http://gollem.swi.psy.uva.nl/twiki/pl/bin/view/FAQ/AllOutput" title="I want the whole answer" lang="en">en
esta página</a>).</p>
<p>Por supuesto, existen más predicados para la manipulación
de átomos, como se referencia en el apartado "<a href="http://www.swi.psy.uva.nl/projects/SWI-Prolog/Manual/manipatom.html" lang="en">Analysing
and Constructing Atoms</a>" del manual de <a href="http://www.swi-prolog.org/" lang="en">SWI-Prolog</a>.</p>
<p>Otra forma de tokenizar átomos en Prolog es utilizar el predicado
<strong>get0/1</strong>
y <strong>get0/2</strong> y algún tipo de algoritmo recursivo que vaya "recorriendo"
todo el texto del canal activo de entrada de datos (un archivo externo,
por ejemplo), y al tiempo introduzca los <em>tokens</em> resultantes, incluyendo
los espacios en blanco (<strong>get/1</strong> y <strong>get/2</strong> no los leen), en una
lista acumuladora, en tanto no se alcance determinado marcador de parada,
definido previamente (para este fin suele aprovecharse el átomo
<strong>end_of_file</strong>,
que se corresponde con el final de texto). Este predicado realmente lee
el byte correspondiente a cada carácter alfanumérico individual,
asociándolo con su correspondiente código ASCII.</p>
<p>El analizador sintáctico, en base a los constituyentes de una
oración (véanse los principios de la <a href="http://es.wikipedia.org/wiki/Generativismo">gramática generativa</a>
de Noam Chomsky), y mediante un número finito de reglas, trata de
determinar la gramaticalidad o no de un número infinito de construcciones.
Un analizador sintáctico trata de ver hasta que punto puede someterse
un grupo de palabras a una estructura de reglas. Así por ejemplo,
si tenemos la oración:</p>
<blockquote>Pedro come una manzana</blockquote>
<p>en primer lugar, y mediante un proceso de <em>tokenización</em>, se
genera una lista de las palabras que contiene. De esta lista inicial de
palabras, se puede diferenciar una sublista que se corresponda con el Sintagma
Nominal (SN) de la oración, y si ésta puede concatenarse
con otras sublistas que según determinadas
reglas se verifica como Sintagma Verbal (SV), la oración se concluye que
es gramatical. Lo que importa en los constituyentes es el orden de las
palabras de la oración.</p>
<p>El analizador sintáctico realiza el análisis secuencialmente,
palabra por palabra, partiendo de una lista inicial que, siguiendo con
el ejemplo de la oración expuesta, sería:</p>
<p class="codigo">[pedro,come,una,manzana]</p>
<p>El proceso de computación de las reglas del analizador sintáctico
debe dar como resultado otra lista, que será una lista vacía
<strong>[]</strong> si la oración inicial es gramatical (siempre en base a las reglas
que tenga definidas el analizador). En definitiva, partiendo de la lista
inicial de palabras, el analizador sintáctico comprueba si ésta
se puede subdividir en dos sublistas, que se corresponden, respectivamente,
con el <acronym title="Sintagma Nominal">SN</acronym> y el <acronym title="Sintagma Verbal">SV</acronym> de la oración.</p>
<p>Más información: <a href="http://elies.rediris.es/elies9/3-1-2.htm">El
análisis sintáctico y el análisis semántico</a>.</p>etxehttp://www.blogger.com/profile/10987668917577281087noreply@blogger.comtag:blogger.com,1999:blog-5454882.post-1140347377440502542006-02-19T12:08:00.000+01:002006-03-02T17:01:04.806+01:00¿Ha llegado el fin de los tesauros documentales?<p>Aunque no suele ser mi costumbre publicar integramente textos completos
en este sitio (para esos menesteres mantengo abierto <a href="http://vistoyleido.blogspot.com/">Visto y Leído</a>),
me permito hacerlo en esta ocasión dado el indudable interés
que tiene el que reproduzco a continuación, en función de
las ideas que plantea, las experiencias prácticas puestas de manifiesto y compartidas por el autor, y el debate que todo ello pretende
suscitar. Se trata de un mensaje enviado
por <a href="http://multidoc.rediris.es/joseramon/">José Ramón
Pérez Agüera</a> (Departamento de Sistemas Informáticos
y Programación, Facultad de Informática, Universidad Complutense
de Madrid) a la lista de distribución <a href="http://www.rediris.es/list/info/iwetel.es.html">IWETEL</a>,
el pasado 13/02/2006 (para acceder al texto original, en el apartado de archivos, hace falta estar
suscrito a dicho foro de discusión para profesionales del ámbito de las bibliotecas y los centros de documentación).</p>
<p>[Comienza el texto de Pérez Agüera]</p>
<p>"Aunque no me toca publicar nota en <a href="http://www.thinkepi.net/">Thinkepi</a>,
llevo unos meses (de hecho algún año que otro) dándole
vueltas a este asunto y me gustaría contar con la opinión
de la comunidad de documentalistas, más allá de mis propias
observaciones, con lo cual este correo no pretende ser una nota sino dar
pie a un debate en el que los documentalistas no están teniendo
voz, al desarrollarse dentro del campo de la informática.</p>
<p>Trabajo en generación automática de tesauros, lo cual
me ha llevado a realizar experimentos de indización automática
y expansión de consultas a partir de tesauros realizados a mano.
Concretamente he utilizado tres tesauros: ISOC-Economía, EUROVOC
y SPINES, todos ellos conocidos de sobra. La colección sobre la
que he realizado las pruebas ha sido el sub-conjunto de noticias de economía
y política generadas por la Agencia EFE en 1994 (efe94 es una colección
típica en experimentos de recuperación de información
que consta de un total de 215.738 documentos. Yo he utilizado 23.390 en
mis experimentos para centrarme en el área de política y
economía, las cuales son cubiertas en buena medida por los tesauros
anteriormente mencionados).</p>
<p>A parte también he contado con un conjunto 22 de consultas con
sus respectivos juicios de relevancia para el dominio mencionado de cara
a la realización de los experimentos. Estas consultas las he obtenido
del congreso <a href="http://www.clef-campaign.org/" lang="en">CLEF</a>
[Cross-Language Evaluation Forum] que se celebra todo los años y
que se centra en temas de recuperación de información mono
y multilingüe.</p>
<p>Como motor de búsqueda he usado <a href="http://lucene.apache.org/" lang="en">Lucene</a>,
adaptado al español con <em>stemming</em> sobre los términos
de indización, el cual está basado en el <a href="http://www.ub.es/bid/04figue2.htm#ModeloVectorial">modelo
tradicional de espacio vectorial</a> de Salton (un clásico, vamos).</p>
<p>El objetivo de mis primeros experimentos ha sido el de comprobar de
que forma afectaba a la recuperación de información automatizada
el uso de tesauros documentales como los que se usan todos los días
en centros de documentación de todo el mundo. Y cual no ha sido
mi sorpresa al comprobar que tanto juntos como por separado, usando todos
o parte de los tipos de relaciones que existen en los tesauros, realizando
expansión global directa o ponderada (la forma en que he ponderado
los tesauros es otra historia), en cada uno de los casos los tesauros mencionados,
no han mejorado prácticamente nada la recuperación en la
colección, ni en precisión, ni en recall (ni en otro cerro
de medidas que he ido aplicando basadas en el modelo propuesto por <a href="http://trec.nist.gov/" lang="en">TREC</a>
[Text REtrieval Conference], otro congreso de <acronym title="Recuperación de Información">RI</acronym>
que tiene un programita bastante completillo llamado trec_eval para evaluar
la recuperación), es más en algunos de los experimentos,
dependiendo de la longitud de la consulta el uso de tesauros documentales
hechos a mano empeoraba los resultados.</p>
<p>El siguiente paso en mi investigación ha sido trabajar con tesauros
generados automáticamente a partir de tres metodologías básicas:</p>
<ul class="conmargeninf">
<li>
Procesamiento lingüístico de la colección (<em>POS-Tagging</em>,
análisis sintáctico, análisis de árboles de
dependencia entre términos).</li>
<li>
Análisis de co-ocurrencias para la generación de las relaciones
entre términos (<em>Latent Semantic analysis</em>, Qui y Frei (y su
versión española implementada por Zazo, Berrocal y Cia de
Salamanca), Jing y Croft, etc.).</li>
<li>
Utilización de otros recursos lingüísticos (léase
<a href="http://www.illc.uva.nl/EuroWordNet/" lang="en">eurowordnet</a>
en su versión española, y diccio).</li>
</ul>
<p>Los tesauros generados automáticamente a partir de estas metodologías
sí han proporcionado mejoras significativas en la recuperación.
No me quiero poner aquí más pesado de la cuenta sobre los
detalles técnicos y las cifras pero para el que las quiera se las
puedo pasar.</p>
<p>El caso es que comenté el hecho con Antonio García Jiménez,
que de esto de tesauros documentales sabe un rato, y me comentó
ciertas ideas muy valiosas que explicaban en parte los resultados, y que
se podrían resumir (Antonio, si andas por ahí, corrígeme
si me equivoco) en que los tesauros no se adaptaban perfectamente a la
colección sobre la que yo los aplicaba y que por tanto se necesitaría
un tesauro hecho a mano para la colección con la que yo trabajo
para obtener una mejora basada en el uso de tesauros documentales.</p>
<p>Tras este comentario me quede rumiando y modifique la colección
para adaptarla terminológicamente a los tesauros con los que yo
contaba, para hacer confluir ambos conjuntos de datos en lo posible y así
comprobar si mejoraba algo la capacidad de recuperación de los tesauros,
pero por desgracia los datos han seguido siendo bastante descorazonadores.</p>
<p>Después de todas estas pruebas me surgió la siguiente
pregunta ¿realmente tienen lugar los tesauros hechos a mano, y basados
en la metodología y normativas tradicionales en el panorama de recuperación
automatizada imperante hoy, ya sea dentro o fuera de Internet?</p>
<p>Mi respuesta por el momento, y a falta de vuestros comentarios, es que
no tienen lugar y que es necesario plantearse con urgencia varios cambios
en la metodología de elaboración de tesauros que existe actualmente
y de la que las normas ISO, el libro de Gilchrist y Aitchison y el libro
de Blanca Gil, suponen las principales referencias.</p>
<p>Los principales problemas del uso de tesauros documentales en Recuperación
de Información Automatizada son:</p>
<ul class="conmargeninf">
<li>
Dispersión de datos: Es decir en la colección aparecen constantemente
palabras que el tesauro no es capaz de normalizar (este problema no se
soluciona con una actualización periódica hecha a mano en
función del crecimiento de la colección).</li>
<li>
Ambigüedad Semántica excesiva aún en tesauros de dominio
específico como los mencionados.</li>
<li>
Inconsistencias en la estructura de los tesauros.</li>
</ul>
<p>Todos estos problemas son normales teniendo en cuenta que son tesauros
hechos y gestionados a mano sin ningún mecanismo más o menos
automático de control de consistencia (de hecho la mera importación
de los tesauros a <acronym title="Structured Query Language" lang="en">SQL</acronym> a permitido la detección de estas inconsistencias
estructurales) más allá de programas tipo multites y demás.</p>
<p>A esto se suma que tal y como se hacen los tesauros hoy en día,
y en contra de lo que muchos opinan, tampoco sirve para la transición
a las ontologías, debido a cuestiones básicas de diseño
(fundamentalmente el paradigma orientado a objetos) con las que los tesauros
documentales no cumplen ni de lejos y que provoca serios problemas de consistencia
cuando intentamos convertir un tesauro documental en una ontología.</p>
<p>En vista a estos hechos y a que yo no doy más de mi por el momento
en este asunto, me gustaría conocer vuestra opinión en este
tema (pues a muchos les va el pan en ello, pienso yo). Por concretar, las
preguntas iniciales, sin excluir otras posible que podéis ir haciendo
serían:</p>
<ul class="conmargeninf">
<li>
¿Cual es el papel de los tesauros documentales en el contexto de
la recuperación de información automatizada en centros de
documentación?</li>
<li>
¿Cual es el papel de los tesauros documentales en la recuperación
de información en Internet?</li>
<li>
¿Es necesario modificar el paradigma de elaboración de tesauros
actualmente imperante? ¿en que sentido?</li>
</ul>
<p>Yo, aunque no soy un experto tesaurista tengo mis opiniones que iré
poniendo aquí si el debate tiene éxito, pero las que me interesan
son las vuestras.</p>
<p>Espero haber sido claro, si tenéis cualquier duda sobre lo que
he escrito o algo no se entiendo no dudéis en preguntar, espero
que con suerte y entre todos le podamos dar un tiento a este problema tan
puramente documental."</p>
<p>[Fin del texto de Pérez Agüera]</p>
<p>Pues ya saben, cualquier comentario, rectificación, aportación
etc., en relación con las cuestiones planteadas en el texto anterior,
pueden enviarlo a la referida lista IWETEL, y así enriquecer el
debate que sin duda merece el conjunto de asuntos planteados por Pérez
Agüera en relación con la recuperación de información,
la indización automatizada, y el papel que los tesauros como instrumento
de descripción normalizada juegan en todo ello...</p>
<p>De Pérez Agüera, y sobre los temas que aborda en su comunicación
a la lista IWETEL, ver también: "<a href="http://www.w3.org/2001/sw/Europe/events/200406-esp/trabajo-final-extratesauros/trabajo-final-extratesauros.html">Automatización
de Tesauros y su utilización en la Web Semántica</a>" (<a href="http://www.w3.org/2001/sw/Europe/" lang="en">SWAD-Europe</a>,
taller <em>Introducción al uso de la Web Semántica</em>, 13 de junio 2004). Véanse también en general los <a href="http://www.w3.org/2001/sw/Europe/reports/intro.html" lang="en">SWAD-Europe
Reports</a> y <a href="http://www.w3.org/2001/sw/Europe/showcase/presentations.html" lang="en">SWAD-Europe
Presentations</a>. SWAD significa <em>Semantic Web Activity: Advanced Development</em>. También me parece pertinente reseñar, de la revista <em><a href="http://www.um.es/fccd/anales/">Anales
de Documentación</a></em> (nº 7, 2004, págs. 79-95),
el artículo de Antonio García Jiménez "<a href="http://www.um.es/fccd/anales/ad07/ad0706.pdf">Instrumentos
de Representación del Conocimiento: Tesauros versus Ontologías</a>"
(en <acronym title="Portable Document Format" lang="en">PDF</acronym>).</p>
<p>En otro orden de cosas, aprovecho la ocasión para relacionar
a continuación una serie de enlaces, referencias y textos que han ido mereciendo
mi atención en los últimos meses (los entrecomillados son citas textuales
tomadas de los sitios referenciados):</p>
<h3>Artículos, introducciones, anotaciones de "blogs":</h3>
<ul class="conmargeninf">
<li>
<a href="http://www.j-paine.org/why_prolog.html" lang="en">Why Use Prolog?</a>
(<a href="http://www.j-paine.org/" lang="en">Jocelyn Paine</a>). Documento
en el que se exponen diez (buenas) razones para (en opinión del
autor) utilizar el lenguaje de programación lógica Prolog.</li>
<li>
<a href="http://www.cs.cornell.edu/home/llee/papers/cstb.pdf" lang="en">"I'm
sorry Dave, I'm afraid I can't do that": Linguistics, Statistics, and Natural
Language Processing circa 2001</a> (en <acronym title="Portable Document Format" lang="en">PDF</acronym>;
Lillian Lee, Cornell University).</li>
<li>
<a href="http://www.monografias.com/trabajos16/curso-visual-prolog/curso-visual-prolog.shtml">Programación
utilizando Visual Prolog 6.0</a> (R. Fuentes Covarrubias, Universidad de
Colima, Facultad de Ingeniería Mecánica y Eléctrica,
México).</li>
<li>
<a href="http://www.maa.org/devlin/devlin_2_00.html" lang="en">The legacy
of the Reverend Bayes</a> (en <a href="http://www.maa.org/news/devangle.html" lang="en">Devlin's
Angle</a>, febrero 2000).</li>
<li>
Dos muy buenas introducciones básicas al lenguaje Prolog: <a href="http://www.bitwisemag.com/copy/programming/prolog/intro/firststeps.html" lang="en">First
Steps in Prolog: an easy introduction to this <acronym title="Artificial Intelligence" lang="en">AI</acronym>
language</a> / <a href="http://www.bitwisemag.com/copy/reviews/software/programming/prolog/free_prologs.html" lang="en">Free
Prologs: a guide to freely available Prolog systems</a> (H. Collingbourne;
en <a href="http://www.bitwisemag.com/" lang="en">Bitwise Magazine</a>).</li>
<li>
<a href="http://thatlogicblog.blogspot.com/2006/02/linear-logic-naturally.html" lang="en">Linear
Logic - Naturally!</a> (en <a href="http://thatlogicblog.blogspot.com/" lang="en">That
Logic Blog</a>): "Linear logic has enjoyed enormous popularity over the
last couple of decades or so. For those without some training in structural
proof theory, understanding the system can be quite intimidating, especially
because of the funny notation and weird jargon. In this post, I am going
to show you that, in fact, you could have invented linear logic! [...]".</li>
<li>
<a href="http://sevein.matap.uma.es/~aciego/TR/gaceta.pdf">Lógica,
Matemática, Deducción Automática</a> (Manuel Ojeda
Aciego, Dept. Matemática Aplicada, Universidad de Málaga;
en <acronym title="Portable Document Format" lang="en">PDF</acronym>):
"Presentamos una breve perspectiva histórica del desarrollo en paralelo
y, a veces, entrelazado, de la Lógica y las Matemáticas,
con el objetivo final de presentar la Lógica Computacional y, en
particular, la Deducción Automática, como un área
de investigación matemática de extraordinario potencial práctico,
no en balde distintos autores de conocido prestigio afirman que la Lógica
es a la Computación como el Cálculo Infinitesimal es a la
Física.".</li>
</ul>
<h3>Páginas y sitios web:</h3>
<ul class="conmargeninf">
<li>
<a href="http://diwww.epfl.ch/mantra/tutorial/english/" lang="en">Neural
Java: Neural Networks Tutorial with Java Applets</a>. "Neural Java is a
series of exercises and demos. Each exercise consists of a short introduction,
a small demonstration program written in Java (Java Applet), and a series
of questions which are intended as an invitation to play with the programs
and explore the possibilities of different algorithms. [...]".</li>
<li>
<a href="http://euriskotwo.blogspot.com/" lang="en">My Artificial Intelligence
project</a>.</li>
<li>
<a href="http://en.wikibooks.org/wiki/Programming:Prolog" lang="en">Wikibook
on Prolog</a> ("[...] This book can serve as a textbook or tutorial for
anyone who wants to learn the prolog programming language. No prior programming
experience is required. Some basic knowledge of logic can come in handy.
[...]").</li>
<li>
<a href="http://yandes.sourceforge.net/" lang="en">Yandes</a>. Conjunto
de módulos concebidos para ayudar a los estudiantes de Lógica,
implementados en lenguaje Prolog. Actualmente son los siguientes: TT: construcción
de tablas de verdad para Lógica proposicional. Incluye además
dos predicados para determinar una fórmula como válida, satisfactible,
o insatisfactible, y un razonamiento como correcto o incorrecto; ND: construcción
de demostraciones de deducción natural; CNF: convierte fórmulas
en forma conjuntiva normal, o en forma clausal.</li>
<li>
<a href="http://triple.semanticweb.org/" lang="en">TRIPLE</a> ("[...] an
RDF query, inference, and transformation language for the Semantic Web.
[...]").</li>
<li>
<a href="http://www.um.es/gtiweb/adrico/">Glosario de Recuperación
de Información Web</a> (Adriana Colino Tomé; vía <a href="http://irsweb.blogspot.com/">Recuperación
de Información en la Web</a>).</li>
</ul>
<h3>Conferencias, congresos:</h3>
<ul class="conmargeninf">
<li>
<a href="http://www.mdai.info/mdai2006/" lang="en">Modeling Decisions for
Artificial Intelligence</a> (Tarragona, 3-5 abril 2006): "Decision making
processes, and information fusion tools at large, are currently embedded
in most Artificial Intelligence applications. As a consequence, systems
based on decision making and fusion techniques are becoming pervasive.
They are currently in use in all kind of environments, from entertainment
gadgets to safety-critical or risk management software.".</li>
<li>
<a href="http://www.cs.uky.edu/iclp06/" lang="en">22nd International Conference
on Logic Programming</a> (ICLP 2006, 17-20 agosto 2006).</li>
</ul>etxehttp://www.blogger.com/profile/10987668917577281087noreply@blogger.comtag:blogger.com,1999:blog-5454882.post-1131839082998349132005-11-13T00:43:00.000+01:002005-11-21T14:20:05.346+01:00Algoritmo de aprendizaje ID3<p>Una de las aplicaciones prácticas de las Redes Neuronales Artificiales
(RNA), es la clasificación de datos, entendida ésta como
un proceso de búsqueda de propiedades comunes a una serie de objetos
de un dominio del conocimiento, en función de los valores de determinados
atributos. Dentro de la cuestión de la clasificación automática,
en tanto que proceso subsidiario de procesos más generales englobados
dentro de lo que se conoce como "machine learning", uno de los algoritmos
de aprendizaje automático más conocidos, basado en "ejemplos",
es el denominado ID3, o "Iterative Dichotomizer (version) 3" (J.R. Quinlan, 1979). Trabaja con datos simbólicos, en contraposición
a los datos numéricos, y se basa en la obtención de un árbol
de decisión <a name="ref_arboles"></a>(<a href="#arboles">ver
anexo</a>), a partir del cual se obtienen una serie de reglas de producción,
capaces de representar un dominio o universo determinado, generando conocimiento
independiente de dicho dominio (el sistema de aprendizaje parte de un estado
inicial del dominio escogido en el que no existe conocimiento de partida,
extrayendo patrones comunes de entre los ejemplos utilizados, a partir
de los cuales genera una base de conocimientos de aplicación a dicho
dominio). El árbol de decisión permite por tanto clasificar
los datos de entrada. Se pueden distinguir dos tipos de procesos de aprendizaje:</p>
<ul class="conmargeninf">
<li>
Supervisado: los ejemplos o "explicaciones" son proporcionados al sistema
por un sujeto externo. Pertenecen a esta categoría las clasificaciones
de datos basadas en árboles de decisión en base a ejemplos,
como es el caso del algoritmo de aprendizaje <acronym title="Iterative Dichotomizer (version) 3" lang="en">ID3</acronym>.</li>
<li>
No supervisado: los ejemplos u "observaciones" son creados por el propio
sistema. Pertenecen a esta categoría los procesos de agrupamiento
de datos o <em>data clustering</em> (o simplemente <em>clustering</em>).</li>
</ul>
<p>Atendiendo a un plano de abstracción conceptual superior, en el
denominado "machine learning" o aprendizaje de máquina, es posible
diferenciar dos tipos de aprendizaje: <em>aprendizaje memorístico</em> (o
aprendizaje de memoria) y <em>aprendizaje cognoscitivo</em>. El primero hace referencia
a procesos de memorización de a) hechos y b) secuencias o procedimientos
de acciones, siendo el tipo de aprendizaje más fácil de implementar
en un sistema computacional "inteligente". El segundo tipo de aprendizaje,
el cognoscitivo, es el que hace uso de procedimientos de razonamiento a
partir de un conocimiento básico, de forma que sea posible la obtención
de "descripciones de clase", generalizaciones que se obtienen de la observación
de ejemplos concretos. Es por tanto un tipo de aprendizaje basado en un
razonamiento de carácter inductivo, aquel que permite la formulación
de principios generales, a partir de casos específicos individuales,
a diferencia del razonamiento deductivo, que a partir de generalizaciones,
y por medio de la lógica (silogismos), infiere conclusiones de carácter
particular y concreto. En el razonamiento inductivo, es la acumulación
de observaciones lo que permite llegar a conclusiones de validez universal.</p>
<p>No obstante, no es infrecuente, en los sistemas de aprendizaje automático,
encontrar ambos universos de razonamiento, ya que las generalizaciones
que se obtienen mediante el razonamiento inductivo, a partir de un grupo
relativamente reducido de "ejemplos" u observaciones (fase de entrenamiento
previo), servirán posteriormente para la obtención de conclusiones
particulares a través de un proceso de razonamiento deductivo.</p>
<p>Los árboles de decisión o clasificación consisten
en una técnica de carácter inductivo muy utilizada en el
ámbito del aprendizaje automático. Gráficamente, están
formados por nodos y ramas. Los primeros representan el identificador de
un atributo concreto. Los nodos terminales u hojas representan los valores
asociados a dicho atributo, mientras que las ramas. A cada uno de estos
valores, se accede a través de una rama que parte del nodo en cuestión.
Los casos son dirigidos hacia una u otra rama en función de los
valores de sus atributos. Los árboles de clasificación son
un método de aprendizaje válido en aquellas situaciones en
las cuales los ejemplos de partida se pueden representar mediante un conjunto
finito de atributos y valores. Los árboles de clasificación
también se pueden concebir, desde un punto de vista algorítmico,
como un conjunto de reglas <em>if-then</em>.</p>
<p>El carácter de los árboles de decisión es jerárquico,
por lo que solo son capaces de representar conocimiento jerárquico,
la mayor parte del mismo. Por otro lado, su construcción tienen
un carácter recursivo y descendente, de los conceptos generales
a los particulares, razón por la cual el acrónimo TDIDT (Top-Down Induction on Decision Trees) es utilizado para referirse a los algoritmos de construcción de árboles de decisión, como es el caso del algoritmo <acronym title="Iterative Dichotomizer (version) 3" lang="en">ID3</acronym> de Quinlan.</p>
<p>La mayoría de las heurísticas utilizadas para la determinación
de árboles de decisión mediante algoritmos de aprendizaje,
<a href="http://www.inference.phy.cam.ac.uk/mackay/itprnn/book.html" title="Information Theory, Inference, and Learning Algorithms" lang="en">se
basan</a> en la teoría matemática de la información (<a href="http://www-groups.dcs.st-and.ac.uk/~history/Mathematicians/Shannon.html" lang="en">C.
Shannon</a>, W. Weaver; Bell Laboratories, 1948) [<a href="http://www.lucent.com/minds/infotheory/" lang="en">1</a>] [<a href="http://programacionlogica.blogspot.com/2004_01_01_programacionlogica_archive.html#107395732842307963">2</a>]. Las heurísticas
son criterios, métodos o principios, que permiten decidir, de entre
varias alternativas de acción, cuál será la más
efectiva para cumplir determinada meta. Permiten restringir el número
de evaluaciones, y en consecuencia repercuten en una mejora de los tiempos
de búsqueda de soluciones. Entropía y cantidad de información
son dos conceptos que se dan la mano en el campo de las heurísticas.
Sobre Entropía y cantidad de información, ver en <a href="http://tiopetrus.blogia.com/">Tio
Petros</a>: [<a href="http://tiopetrus.blogia.com/2005/061301-entropia-y-cantidad-de-informacion-1-..php">1</a>]
[<a href="http://tiopetrus.blogia.com/2005/061401-entropia-y-cantidad-de-informacion-2-.php">2</a>]
[<a href="http://tiopetrus.blogia.com/2005/061501-entropia-y-cantidad-de-informacion-3-.php">3</a>]
[<a href="http://tiopetrus.blogia.com/2005/061601-entropia-y-cantidad-de-informacion-y-4-.php">4</a>].</p>
<p>El algoritmo <acronym title="Iterative Dichotomizer (version) 3" lang="en">ID3</acronym> genera lo que se conoce como reglas "duras", es decir,
aquellas que solo atienden a dos posibles estados (verdadero-falso, positivo-negativo,
0-1, etc.), y que tienen por tanto un carácter bivalente, a diferencia
de las reglas "borrosas", que permiten representar un rango infinito de
valores entre dos extremos de una escala, como las que se obtienen mediante
algoritmos <acronym title="Iterative Dichotomizer (version) 3" lang="en">ID3</acronym> "extendidos" (ID4, ID5, ID5R, C4.5, C5, etc.).</p>
<p>Pseudocódigo del algoritmo <acronym title="Iterative Dichotomizer (version) 3" lang="en">ID3</acronym>:</p>
<p class="codigo">Si todos los ejemplos de E pertenecen a una misma clase C, entonces
<br /> arbol1 <-- nodo etiquetado con C
<br />SiNo
<br /> Si a = f, entonces
<br /> C <-- clase mayoritaria de los ejemplos
de E
<br /> arbol1 <-- nodo etiquetado con C
<br /> SiNo
<br /> A <-- mejor atributo de a
<br /> arbol1 <-- nodo etiquetado con A
<br /> Para cada v perteneciente a los valores
de A, hacer
<br /> EAv <-- los ejemplos
de E que tienen el valor v para el atributo A
<br /> Si EAv = f, entonces
<br />
arbol2 <-- nodo etiquetado con la clase mayoritaria en E
<br /> SiNo
<br />
arbol2 <-- ID3(EAv , a-{A})
<br /> arbol1 <-- añadir
a arbol1 el arbol2, a través de una rama etiquetada con v
<br />Devolver arbol1</p>
<p>Otra representación en pseudocódigo del algoritmo <acronym title="Iterative Dichotomizer (version) 3" lang="en">ID3</acronym>:</p>
<p class="codigo">Aprendizaje-Árbol-Decisión(<em>Ejemplos</em>, <em>Atributos</em>,
<em>Default</em>)
<br /> retorna un árbol de decisión
<br /><br /><strong>IF</strong> no hay <em>Ejemplos</em>, retornar <em>Default</em>
<br /><strong>ELSE IF</strong> si todos los <em>Ejemplos</em> tienen la misma clasificación,
<br /> <strong>retornar</strong> la clasificación,
<br /><strong>ELSE IF</strong> <em>Atributo</em>s = vacío, <strong>retornar</strong> Mayoría(<em>Ejemplos</em>)
<br /><strong>ELSE</strong>
<br /> mejor-atr <-- elegir-atributo(<em>Atributos</em>, <em>Ejemplos</em>)
<br /> árbol <-- nuevo árbol de decisión
con raíz en mejor-atr
<br /> <strong>FOR EACH</strong> valor v[i] de mejor-atr <strong>DO</strong>
<br /> <em>Ejemplos</em>[i] <-- {elementos
de <em>Ejemplos</em> con mejor-atr = v[i]}
<br /> subar <-- Aprendizaje-Árbol-Decisión(ejemplos[i],
<em>Atributos</em>
- mejor-atr, Mayoría(<em>Ejemplos</em>))
<br /> agregar rama al árbol con etiqueta
v[i] y subárbol subar
<br /> <strong>OD</strong>
<br /><strong>retornar</strong> árbol</p>
<p>Los procesos de aprendizaje, que hacen uso de la clasificación
de datos, mediante el descubrimiento de patrones, se utilizan con profusión
dentro de lo que se conoce como "Data Mining", en castellano minería
de datos, explotación de datos, o descubrimiento de conocimiento
en bases de datos, diversidad terminológica en torno a la cual existe
una cierta polémica.</p>
<p>Maximiliano del Rio es autor de una versión escrita en lenguaje
Prolog del algoritmo de aprendizaje <acronym title="Iterative Dichotomizer (version) 3" lang="en">ID3</acronym>. Los archivos correspondientes
a esta implementación (<a href="http://www.programacion.com/codigo/65/">librería
Clasif</a>) se pueden localizar bien en la sección de <a href="http://www.programacion.com/codigo/">código
fuente</a> de <a href="http://www.programacion.com/">programacion.com</a>
(comprimidos en un "zip"), o en el <a href="http://gollem.swi.psy.uva.nl/twiki/pl/bin/view/Main/MaximilianoDelRio" lang="en">espacio
personal</a> que el propio autor tiene en el "<a href="http://gollem.swi.psy.uva.nl/twiki/pl/bin/view" lang="en">Wiki</a>"
de <a href="http://www.swi-prolog.org/" lang="en">SWI-Prolog</a>. En "<a href="http://gollem.swi.psy.uva.nl/twiki/pl/pub/Main/MaximilianoDelRio/guia.txt">guia.txt</a>"
se explica el manejo de esta implementación del <a href="http://gollem.swi.psy.uva.nl/twiki/pl/pub/Main/MaximilianoDelRio/id3.pl">algoritmo
<acronym title="Iterative Dichotomizer (version) 3" lang="en">ID3</acronym> en Prolog</a>, que hace uso de la <a href="http://www.swi-prolog.org/packages/odbc.html" title="SWI-Prolog ODBC Interface" lang="en">interfaz <acronym title="Open DataBase Connectivity" lang="en">ODBC</acronym></a>
para consultar las tablas de la base de datos seleccionada, de las que
se obtienen los ejemplos necesarios para generar las reglas de producción.
Se adjunta además el archivo "<a href="http://gollem.swi.psy.uva.nl/twiki/pl/pub/Main/MaximilianoDelRio/clasif.pl">clasif.pl</a>",
programa de "Data Mining" que hace uso del algoritmo <acronym title="Iterative Dichotomizer (version) 3" lang="en">ID3</acronym>, dotado de interfaz
gráfica mediante la utilización de la librería nativa
<a href="http://www.swi-prolog.org/graphics.html" lang="en">XPCE</a>.</p>
<blockquote>
"[...] programa que utiliza la librería anterior [...]
Ayuda a generar las reglas y muestra las reglas obtenidas textual y gráficamente;
también muestra una traza de como trabaja el algoritmo."
<div class="cita"><a href="http://www.programacion.com/codigo/65/">Fuente</a></div>
</blockquote>
<p>Esta interfaz gráfica se abre lanzando el objetivo "?- main." en
la línea de órdenes de SWI-Prolog, una vez compilado el programa.
Finalmente, la librería "<a href="http://gollem.swi.psy.uva.nl/twiki/pl/pub/Main/MaximilianoDelRio/compilar.pl">compila.pl</a>"
contiene predicados que permiten <a href="http://www.swi.psy.uva.nl/projects/SWI-Prolog/Manual/runtime.html" title="SWI-Prolog Manual - Generating Runtime Applications" lang="en">generar
un ejecutable</a> para Windows de los resultados obtenidos, mediante SWI-Prolog.</p>
<p>Para obtener una visión bastante amplia sobre la implementación
en lenguaje Prolog de procesos de aprendizaje automático en general,
y aprendizaje inductivo mediante árboles de decisión en particular
(clasificación de datos), es muy recomendable la lectura del capítulo
18, "Machine Learning", de la (ya clásica) obra de Ivan Bratko "Prolog:
Programming for Artificial Intelligence" (2ª ed. Addison-Wesley, 1994;
ISBN: 0-201-41606-9). Sobre árboles de decisión trata concretamente
el punto 18.6, "Induction of decision trees".</p>
<p>Existe así mismo un repositorio de algoritmos de aprendizaje
automático escritos en lenguaje Prolog, <a href="ftp://ftp.gmd.de/gmd/mlt/ML-Program-Library/" lang="en">Prolog
library of machine learning algorithms</a>, un tanto desactualizado eso
sí, ya que la última actualización parece datar del
año 1994, mantenido por Thomas Hoppe (<a href="http://www.fraunhofer.de/english/" lang="en">Fraunhofer-Gesellschaft</a>,
<a href="http://www.tu-berlin.de/">Universidad
Técnica de Berlín</a>). Los programas están escritos
haciendo uso de la sintaxis y, en la mayor parte de las ocasiones, de los
predicados predefinidos (<em>built-in predicates</em>) contemplados en el
Prolog descrito por Clocksin y Mellish, conocido como "estándar
de Edimburgo", basado a su vez en el DECsystem-10 (D. Warren, F. Pereira
y L. Pereira), para de esta forma asegurar el mayor grado posible de compatibilidad
entre versiones de este lenguaje. Las implementaciones del algoritmo <acronym title="Iterative Dichotomizer (version) 3" lang="en">ID3</acronym>
se localizan en la carpeta "<a href="ftp://ftp.gmd.de/gmd/mlt/ML-Program-Library/idt">IDT</a>"
(ver en cualquier caso el archivo "<a href="ftp://ftp.gmd.de/gmd/mlt/ML-Program-Library/README" lang="en">Readme</a>" para más información).</p>
<p>Más información:</p>
<ul class="conmargeninf">
<li>
<a href="http://www.iued.uned.es/users/Enlaces/Apuntes/RaAp2.zip">Algoritmo
<acronym title="Iterative Dichotomizer (version) 3" lang="en">ID3</acronym> de J.R. Quinlan</a> (documento traducido por J.A. Fernández,
en <acronym title="Portable Document Format" lang="en">PDF</acronym>,
comprimido en un zip).</li>
<li>
<a href="http://www.ia.uned.es/~jgb/publica/index.html">Aspectos Básicos
del Aprendizaje Simbólico</a> (J.G. Boticario).</li>
<li>
<a href="http://elvex.ugr.es/etexts/spanish/PhD/as.pdf">Aprendizaje de
clasificadores</a> (F. Berzal Galiano; en PDF).</li>
<li>
<a href="http://elvex.ugr.es/etexts/spanish/PhD/art.pdf">ART: Un método
alternativo para la construcción de árboles de decisión</a>
(F. Berzal Galiano; en PDF).</li>
<li>
<a href="http://elvex.ugr.es/etexts/spanish/PhD/">ART: Un método
alternativo para la construcción de árboles de decisión</a>
(F. Berzal Galiano, 2002; tesis doctoral, en PDF).</li>
<li>
<a href="http://www-2.cs.cmu.edu/afs/cs/project/ai-repository/ai/areas/learning/systems/learn_pl/idt/">IDT:
Torgos ID3-like system based on the gain-ratio measure</a> (algoritmo <acronym title="Iterative Dichotomizer (version) 3" lang="en">ID3</acronym>
escrito en sintaxis del Prolog de Edimburgo). Este código se localiza
en el directorio sobre <a href="http://www-2.cs.cmu.edu/afs/cs/project/ai-repository/ai/areas/learning/" lang="en">Machine
Learning</a> del <acronym title="Carnegie Mellon University" lang="en"><a href="http://www-2.cs.cmu.edu/afs/cs/project/ai-repository/ai/" lang="en">CMU</acronym>
Artificial Intelligence Repository</a> (ver <a href="http://www-2.cs.cmu.edu/afs/cs/project/ai-repository/ai/0.html" lang="en">descripción</a>;
en cada uno de los directorios existen tres archivos, "0.html", "0.doc"
y "readme.txt", que contienen la descripción de su contenido). El
directorio dedicado al lenguaje Prolog en general se localiza <a href="http://www-2.cs.cmu.edu/afs/cs/project/ai-repository/ai/lang/prolog/" lang="en">en este enlace</a>.</li>
<li>
<a href="http://www.cse.unsw.edu.au/~billw/cs9414/notes/ml/06prop/id3/id3.html" lang="en">Induction
of Decision Trees</a>.</li>
<li>
<a href="http://www.algoritmia.net/articles.php?id=17">Árboles</a>,
<a href="http://www.algoritmia.net/articles.php?id=18">Grafos</a>
(en <a href="http://www.algoritmia.net/articles.php?folder=Estructuras%20de%20Datos">Estructuras
de Datos</a>, <a href="http://www.algoritmia.net/">algoritmia.net</a>).</li>
<li>
<a href="http://www.sc.ehu.es/ccwbayes/docencia/mmcc/docs/t11arboles.pdf">Árboles
de Clasificación</a> (<acronym title="Portable Document Format" lang="en">PDF</acronym>;
tema de los apuntes de la asignatura "<a href="http://www.sc.ehu.es/ccwbayes/docencia/mmcc/main0405.htm">Métodos
Matemáticos en Ciencias de la Computación</a>", <acronym title="Universidad del País Vasco">UPV</acronym>).</li>
<li>
<a href="http://ciberconta.unizar.es/Biblioteca/0007/arboles.html">Sistemas
de Inducción de árboles de decisión</a>.</li>
<li>
<a href="http://plato.la.asu.edu/guide.html" lang="en">Decision Tree for
Optimization Software</a>.</li>
<li>
En <a href="http://www.cse.unsw.edu.au/~billw/cs9414/notes.html" lang="en">Artificial
Intelligence Lecture Notes</a>: a) <a href="http://www.cse.unsw.edu.au/~billw/cs9414/notes/mandc/mandc.html" lang="en">Problem
Solving in Prolog</a>; b) <a href="http://www.cse.unsw.edu.au/~billw/cs9414/notes/ml/06prop/id3/id3.html" lang="en">Induction
of Decision Trees</a>.</li>
<li>
Algoritmo <acronym title="Iterative Dichotomizer (version) 3" lang="en">ID3</acronym> <a href="http://www.us.kanto-gakuen.ac.jp/indo/front_e.html" lang="en">escrito en Prolog</a>.</li>
<li>
"<a href="http://www.cse.unsw.edu.au/~billw/mldict.html#ID3" lang="en">ID3</a>"
en "<a href="http://www.cse.unsw.edu.au/~billw/mldict.html" lang="en">The
Machine Learning Dictionary</a>".</li>
<li>
"<a href="http://www-2.cs.cmu.edu/afs/cs/project/ai-repository/ai/areas/learning/systems/learn_pl/idt/0.html" lang="en">IDT:
Torgos ID3-like system based on the gain-ratio measure</a>" en <a href="http://www-2.cs.cmu.edu/afs/cs.cmu.edu/project/ai-repository/ai/0.html" lang="en">CMU
Artificial Intelligence Repository</a>. Forma parte del directorio de programas
"<a href="http://www-2.cs.cmu.edu/afs/cs/project/ai-repository/ai/areas/learning/systems/learn_pl/0.html" lang="en">Machine
Learning Algorithms Implemented in Prolog</a>".</li>
<li>
Tesis doctoral: <em><a href="http://www.gsi.dit.upm.es/~anto/tesis/html/">Inducción
de Conocimiento con Incertidumbre en Bases de Datos Relacionales Borrosas</a></em>
(A. J. Gómez Flechoso, 1998). En relación con los temas tratados
en este "post", ver el <a href="http://www.gsi.dit.upm.es/~anto/tesis/html/stateart.html">capítulo
2</a> en general, y en particular los apartados <a href="http://www.gsi.dit.upm.es/~anto/tesis/html/stateart.html#pgfId=157054">2.1</a>
(Introducción), <a href="http://www.gsi.dit.upm.es/~anto/tesis/html/stateart.html#pgfId=151149">2.2</a>
(Descubrimiento de conocimiento y minería de datos), <a href="http://www.gsi.dit.upm.es/~anto/tesis/html/stateart.html#pgfId=151014">2.3</a>
(Métodos aplicados de minería de datos), y <a href="http://www.gsi.dit.upm.es/~anto/tesis/html/stateart.html#pgfId=152999">2.4</a>
(Programación Lógica Inductiva).</li>
<li>
<a href="http://www.mlnet.org/" lang="en">MLnet (Machine Learning network)
Online Information Service</a>.</li>
</ul>
<h3><a name="arboles"></a>Anexo - Árboles de decisión</h3>
<p>Los árboles de decisión son una representación de
los procesos involucrados en las tareas de clasificación. Se componen de:</p>
<ul>
<li>
Nodos: nombres o identificadores de los atributos.</li>
<li>
Ramas: posibles valores del atributo asociado al nodo.</li>
<li>
Hojas: conjuntos ya clasificados de ejemplos y etiquetados con el nombre
de una clase.</li>
</ul>
<p>Los nodos reflejan propiedades de los objetos del dominio, los arcos o
ramas son los distintos valores de dichos atributos y las hojas son las
clasificaciones posibles.</p>
<p>[Los árboles de decisión] Se adaptan especialmente bien a aquellos casos en los que:</p>
<ul>
<li>
Los ejemplos pueden ser descritos como pares valor-atributo.</li>
<li>
La función objetivo toma valores discretos.</li>
<li>
Podemos tomar hipótesis con disyunciones.</li>
<li>
Posible existencia de ruido en el conjunto de entrenamiento.</li>
<li>
Los valores de algunos atributos en los ejemplos del conjunto de entrenamiento
pueden ser desconocidos.</li>
</ul>
<p>[Fuente: <a href="http://www.cs.us.es/~delia/sia/html98-99/pag-alumnos/web2/indice.html">Inducción
de Árboles de Decisión: extensiones del <acronym title="Iterative Dichotomizer (version) 3" lang="en">ID3</acronym></a>] [<a href="#ref_arboles">Volver
al texto</a>]</p>etxehttp://www.blogger.com/profile/10987668917577281087noreply@blogger.comtag:blogger.com,1999:blog-5454882.post-1131714593194114692005-11-11T14:09:00.000+01:002005-11-13T12:50:05.783+01:00Técnicas mnemotécnicas y acertijos de ingenio<p><strong>Nota:</strong> la primera parte de esta extensa anotación, la más
directamente relacionada con el enunciado del título, ya fue publicada
en mi bitácora hermana, <a href="http://vistoyleido.blogspot.com/">Visto
y Leído</a>, el <a href="http://vistoyleido.blogspot.com/2004_01_01_vistoyleido_archive.html#107421541775470787">16/01/2004</a>,
bajo el mismo título. Al apuntar posteriormente algún enlace
en el que se trata de la aplicación de la programación lógica
en general, y Prolog en particular, a los acertijos de ingenio y los juegos
lógicos, he ido añadiendo otras cuestiones estrictamente
relacionadas con dicho lenguaje de programación, particularmente
relativas a su origen, evolución y algunas de sus versiones desarrolladas
a lo largo del tiempo con más o menos fortuna y permanencia posterior.</p>
<p>En el libro "Ayudando a la memoria. Técnicas y trucos para recordar"
(Plaza & Janes, 2001; ISBN: 84-8450-527-8) su autor, Josep Mª
Albaigès, incluye, como complemento imprescindible a la excelente
descripción que se aborda en el libro respecto de los procesos de
retención, memoria, y técnicas de recuperación o recuerdo
de lo memorizado, un curioso "Diccionario de Mnemotecnias", en el que se
recogen, ordenados alfabéticamente en relación con la cuestión
a la que hacen referencia, toda clase de recursos mnemotécnicos
(de <em>mnemo</em> + <em>tecnia</em>, aquellos que sirven para auxiliar a la
memoria), algunos de cierta complejidad y otros más asequibles,
referidos a aspectos muy variados. En este mismo diccionario se encuentra
la siguiente definición:</p>
<blockquote>
<p>"Llamamos mnemotecnia a cualquier truco o procedimiento abreviado
que permite recordar, de forma más o menos provisional, una cosa
concreta y en general breve."</p>
<div class="cita">En "Ayudando a la memoria...", página 95</div>
</blockquote>
<p>Me quedo para esta ocasión con dos curiosidades referidas al universo
de las clasificaciones, entendidas éstas en sentido amplio (cito
textualmente):</p>
<blockquote>
<p><strong>Clasificación decimal en bibliotecas</strong><br />
Las temáticas de la clasificación decimal suelen ser:
0. Obras Generales - 1. Filosofía - 2. Religión - 3. Ciencias
Sociales - 4. Lengua - 5. Ciencias Puras - 6. Tecnología - 7. Arte
- 8. Literatura - 9. Historia. Que se recuerdan con la frase: "Generales:
¡filosofad religiosamente! Socios: ¡hablad puramente! Técnicos
y artistas: ¡escribid históricamente!".</p>
<p><strong>Taxonomía</strong><br />
La clasificación de las especies naturales comprende los siguientes
escalones: Reino - Tipo - Clase - Orden - Familia - Género - Especie.
Se recuerda esta secuencia, en orden inverso, con la frase: "Una especie
general de familias ordenadas clasifican los tipos del reino".</p>
</blockquote>
<p>Es también muy curiosa la descripción menotécnica
de los <a href="http://www.science.uva.nl/~seop/entries/aristotle-logic/" title="Aristotle's Logic" lang="en">silogismos</a>
(y la forma de recordar las figuras en que los escolásticos los
clasificaron), del número <em>pi</em>, y de varios principios o teoremas
fundamentales de la física y la estadística, entre otros,
pero dada la relativamente amplia extensión de los textos en cuestión,
me remito a la consulta y lectura del libro referenciado, caso de interesar
este tema.</p>
<p>La lógica silogística o <em>aristotélica</em> trata
de determinar la verdad o falsedad de determinado argumento filosófico,
mediante el contraste de proposiciones o <em>premisas</em>, y en cierto sentido
puede ser considerada como una formalización, basada en expresiones
del lenguaje natural, del sentido común. La utilización del
silogismo por parte de los <a href="http://www.webdianoia.com/his_fil/medieval.htm" title="Historia de la filosofía medieval">escolásticos</a>
se entiende dada la integración de la filosofía de Aristóteles
en la dogmática cristiana, característica de la tarea de
reflexión desarrollada por este grupo de pensadores de la Filosofía
occidental entre mediados del siglo XI y mediados del siglo XV, aproximadamente.</p>
<p>Josep Mª Albaigès es también editor de la revista
<a href="http://www.mensa.es/carrollia/">Carrollia</a>,</p>
<blockquote>
<p>"[...] órgano de comunicación [...] de <a href="http://www.mensa.es/">Mensa
España</a>, que se dedica a las Matemáticas recreativas,
la Lingüística, la Literatura Experimental, la Lógica,
la Ciencia y todo aquello que hubiera gustado a <a href="http://vistoyleido.blogspot.com/2005_10_01_vistoyleido_archive.html#112879815136038289">Lewis Carroll</a>."</p>
<div class="cita"><a href="http://www.mensa.es/carrollia/">Fuente</a></div>
</blockquote>
<p>Los <a href="http://www.mensa.es/carrollia/listacarr.htm">boletines</a>
de los últimos años están disponibles en formato <acronym title="Portable Document Format" lang="en">PDF</acronym>.
También es muy recomendable, si se está interesado por estos
temas, la "<a href="http://www.juegosmensa.com/">Colección de juegos
de ingenio</a>" (resueltos) del <a href="http://www.mensa.es/">Club Mensa</a>,
gran parte de ellos editados originalmente en las páginas de Carrollia.
En otro orden de "utilidad" práctica, el "<a href="http://www.mensa.es/carrollia/listabofci.htm">Boletín
Oficial de la Facultad de Ciencias Inútiles</a>" (BOFCI) es otra
publicación del Club Mensa cuya lectura conviene no perderse...</p>
<p>Y ya que hablamos, al menos tangencialmente, de juegos lógicos
y de ingenio, mencionar dos bitácoras en lengua castellana dedicadas
de forma monográfica a estos asuntos:
<a href="http://www.geocities.com/juegosdeingenio/">Juegos
de Ingenio & Acertijos</a> y <a href="http://www.markelo.f2o.org/">Pequeños
Enigmas</a>. En este último sitio se localizan un buen número
de enlaces que llevan a otras páginas de temática afín
(ver el apartado "Buenas páginas de ingenio").</p>
<p>Enlazando la cuestión planteada inicialmente con la utilización
de la programación lógica en general, y el lenguaje Prolog
en particular, en la resolución de acertijos y juegos lógicos,
podemos mencionar a modo de ejemplo el excelente trabajo "<a href="http://www.unlu.edu.ar/~gpfl/acertijo.ps">Resolviendo
acertijos con Prolog</a>" (<a href="http://www.unlu.edu.ar/~gpfl/JPhome.htm">J.
Peri</a>, <a href="http://www.unlu.edu.ar">Universidad Nacional de Luján</a>,
Argentina; en formato <a href="http://www.cs.wisc.edu/~ghost/" title="Ghostscript, Ghostview and GSview" lang="en">PostScript</a>),
en el que podemos leer:</p>
<blockquote>
<p>"[...] Prolog puede ser imaginado como un laboratorio de lógica.
Su capacidad para manejar expresiones simbólicas le permite codificar
fácilmente cierto tipo de información que en los lenguajes
procedurales es muy difícil de manejar. La programación lógica
permite traducir en líneas de código descripciones de hechos
e implicaciones, lo que en principio permite codificar líneas de
razonamiento completas."</p>
<div class="cita">En "<a href="http://www.unlu.edu.ar/~gpfl/acertijo.ps" title="Resolviendo acertijos con Prolog">Resolviendo acertijos con Prolog</a>"</div>
</blockquote>
<p>Los ejemplos están escritos en notación <a href="http://www.cs.nps.navy.mil/people/faculty/rowe/book/ae.html" lang="en">Micro-Prolog</a>,
que difiere sustancialmente de la difundida posteriormente como estándar
de facto por el denominado "Prolog de Edimburgo", tal y como se explica
en un apéndice al final del documento (Apéndice II - Diferencias
entre Micro-Prolog y la notación de Edimburgo), si bien la semántica
de ejecución es idéntica en ambos casos. La lógica
subyacente en los ejemplos expuestos es en cualquier caso plenamente válida,
independientemente de la notación con la que se representen.</p>
<p>El autor de este trabajo es coordinador del "<a href="http://www.unlu.edu.ar/~gpfl/">Grupo
de Programación Funcional y Lógica</a>" (<acronym title="Universidad Nacional de Luján">UNL</acronym>, <acronym title="Universidad Nacional de la Pampa">UNP</acronym>,
Argentina), cuyos miembros han publicado también otros interesantes
documentos y trabajos sobre diversos aspectos de la programación
lógica, localizables
<a href="http://www.unlu.edu.ar/~gpfl/wwwunlu.htm#Publicaciones">en
la página web</a> de dicho grupo (tengan paciencia con las descargas,
el servidor es bastante lento, y se demoran un cierto tiempo). La utilización
de la notación de Micro-Prolog en los trabajos de este grupo, se
explica en razón de que sus miembros han desarrollado un intérprete
para Prolog, <a href="http://www.unlu.edu.ar/~gpfl/edulog/wwwunlu.htm">Edulog</a>,
orientado hacia fines educativos y la utilización en sus cursos
y seminarios, que precisamente hace uso de la notación que venimos
comentando. El proyecto parece estar paralizado, al menos en su forma de
comunicación pública, ya que las páginas llevan bastante
tiempo sin ser actualizadas. El prototipo Edulog es accesible <a href="http://www.unlu.edu.ar/~gpfl/F&Lhome.htm#Software">desde
un enlace</a> ubicado en la página de la asignatura "<a href="http://www.unlu.edu.ar/~gpfl/F&Lhome.htm">Programación
Funcional y Lógica</a>", si bien el archivo de descarga está
protegido por contraseña. Supongo que poniéndose en contacto
con los responsables del proyecto, y exponiéndoles las razones por
las que se quiere acceder a su uso, no habrá ningún problema
en conseguir la clave correspondiente.</p>
<p>La notación implementada por Micro-Prolog es más limitada
y menos flexible que la propia del estándar de Edimburgo: así
por ejemplo, los posibles nombres de variables están muy restringidos,
y el intérprete se conformará con la primera solución
que satisfaga el objetivo planteado, en contraposición a lo habitual
en los intérpretes actuales basados en el Prolog estándar,
que es tratar de proporcionar todas las posibles soluciones hasta agotar
la base de conocimientos del programa y las posibilidades de unificación
de las variables en juego. Otras diferencias se refieren a la utilización,
por parte de Micro-Prolog, de predicados predefinidos de carácter particular.</p>
<p>Las diferencias básicas entre ambos tipos de notaciones están
perfectamente explicadas, con ejemplos, en el documento "<a href="http://www.unlu.edu.ar/~gpfl/F&Lhome.htm#Bibliografia">Diferencias
entre la notación de Micro Prolog y la de Edimburgo</a>" que encontramos
en la página de la asignatura mencionada, si bien el archivo comprimido
que sirve como medio de descarga al original en formato Word, está
también protegido por contraseña, por lo que de nuevo se
hace necesario ponerse en contacto con sus autores con el fin de obtener
la pertinente autorización.</p>
<p>Micro-Prolog fue un dialecto del lenguaje Prolog creado alrededor de
1980 para ser ejecutado originalmente en los primeros ordenadores personales,
equipos de poca capacidad de procesamiento y memoria en comparación
con los parámetros actuales, basados en el procesador Z-80 de Zilog <abbr title="Corporation" lang="en">Corp.</abbr>, sucesor del 8085 de Intel, y el <acronym title="Sistema Operativo">S.O.</acronym> <acronym title="Control Program/Monitor" lang="en"><a href="http://www.iacvt.com.ar/cpm.htm">CP/M</acronym></a>,
antecesor del <acronym title="Personal Computer/Microsoft-Disk Operating System" lang="en">PC/MS-DOS</acronym>
(<a href="http://www.nvg.ntnu.no/sinclair/computers/computers.htm" title="The Sinclair Computers" lang="en">ZX
Spectrum</a>, <a href="http://www.hut.fi/Misc/cbm/" lang="en">Commodore
64</a>, <a href="http://www.old-computers.com/" title="old-computers.com" lang="en">etc.</a>).
El compilador e intérprete <a href="http://www.lpa.co.uk/dow_fre.htm" lang="en">LPA
Prolog Professional</a> soporta la notación Micro-Prolog, aunque
hay que advertir que se trata de un "dialecto" completamente en desuso,
dadas sus evidentes limitaciones, siendo la notación del estándar
de Edimburgo (también conocida como sintaxis DECsystem-10) la más
extendida, y por tanto la empleada en la práctica totalidad de las
implementaciones actuales de intérpretes para el lenguaje Prolog.
Desde <a href="http://www.cs.buap.mx/~jpalacio/gimf/HectorJ/ai-verano/prolog.exe">este
otro enlace</a> se puede descargar el intérprete original para Micro-Prolog.</p>
<p><a href="http://clocksin.com/" lang="en">W.F. Clocksin</a> y C.S. Mellish,
en su libro "Programación en Prolog" (Gustavo Gili, 1993; ISBN:
84-252-1339-8), dedican un apartado completo, "Apéndice E - Micro-Prolog",
a la explicación de la sintaxis implementada por Micro-Prolog:</p>
<blockquote>
<p>"La sintaxis de Micro-Prolog es bastante diferente [...] La
idea básica es que sólo existe un tipo de término:
la lista. Si queremos construir el «término» con funtor
<strong>f</strong>
y cuatro argumentos, usamos de hecho una lista de cinco elementos, con
<strong>f</strong>
como la cabeza, y los cuatro argumentos apareciendo sucesivamente como
los elementos restantes. Así, lo que en la sintaxis de nuestro «núcleo»
se escribiría: <strong>f(a,g(2,3),c)</strong> se escribiría en Micro-Prolog:
<strong>(f
(g 2 3) c)</strong>. Aquí también vemos la sintaxis diferente
para listas, en donde las listas van entre paréntesis, con sus elementos
separados por espacios.</p>
<p>Las cláusulas se representan como listas de términos,
en los que el primero es la cabeza de la cláusula, y el resto son
objetivos, que tomados como una conjunción, forman el cuerpo. He
aquí una cláusula más complicada [...]:</p>
<p class="codigo">
((alterar (z1|z2) (x|y))
<br /> (cambiar z1 x)
<br /> (altera z2 y)
<br />)
</p>
<p>Esto es la segunda cláusula de [el predicado] <strong>alterar</strong> de
la sección 3.4. [...]</p>
<p class="codigo">
alterar([H|T],[X|Y]):- cambiar(H,X), alterar(T,Y).
</p>
<p>[...] Los nombres y propósitos de los predicados predefinidos varían
considerablemente de los que se han visto a lo largo de este libro [...]"</p>
<div class="cita">En <em>Programación en Prolog</em>, Apéndice E - Micro-Prolog</div>
</blockquote>
<p>Por otra parte, en Turbo Prolog los programas se dividen en secciones diferenciadas:
<em>dominios</em>, <em>cláusulas</em>, <em>predicados</em>, <em>base de
datos</em> y <em>objetivos</em>. La explicación, tanto sobre la sintaxis
de Micro-Prolog, como sobre otros aspectos generales de este dialecto (predicados
predefinidos particulares, facilidades para la depuración del código,
etc.), tiene cierta extensión, por lo que me remito a la obra referenciada
para obtener más información al respecto, y en particular,
además de al referido Apéndice E, a los apéndices
"C - Diferentes versiones de Prolog" (ofrece una breve visión general
sobre este particular), y "D - Prolog del DECsystem-10".</p>
<p><a href="http://www.info.ucl.ac.be/people/cvvanroy.html" lang="en">Peter
Van Roy</a> (<a href="http://www.ucl.ac.be/" lang="fr">Universidad Católica
de Lovaina</a>, Bélgica, <abbr title="Departamento"><a href="http://www.info.ucl.ac.be/" lang="en">Dpto.</abbr>
de Ingeniería Informática</a>), una de las figuras más
destacadas en el mundo de la programación lógica, es autor
de un artículo, de lectura más que recomendable, referido
a la evolución del lenguaje Prolog en la década que transcurre
a partir de la aparición de la arquitectura <acronym title="Warren Abstract Machine" lang="en">WAM</acronym>:
"<a href="http://www.info.ucl.ac.be/people/PVR/official_report.ps">1983-1993:
The Wonder Years of Sequential Prolog Implementation</a>" (en formato <acronym title="PostScript" lang="en">PS</acronym>):</p>
<blockquote>
<p>"This report surveys the major developments in sequential Prolog
implementation during the period 1983-1993. In this decade, implementation
technology has matured to such a degree that Prolog has left the university
and become useful in industry. The survey is divided into four parts. The
first part gives an overview of the important technical developments starting
with the Warren Abstract Machine (WAM). The second part presents the history
and the contributions of the major software and hardware systems. The third
part charts the evolution of Prolog performance since Warren?s DEC-10 compiler.
The fourth part extrapolates current trends regarding the evolution of
sequential logic languages, their implementation, and their role in the marketplace."</p>
<p>"By 1983 Warren had developed the WAM, a structure-copying execution
model for Prolog that has become the de facto standard implementation technique
[...]. The WAM defines a high-level instruction set that maps closely to
Prolog source code. [...]"</p>
<div class="cita">En "<a href="http://www.info.ucl.ac.be/people/PVR/official_report.ps">1983-1993:
The Wonder Years of Sequential Prolog Implementation</a>"</div>
</blockquote>
<p>La tesis doctoral de Peter Van Roy versaba precisamente sobre la implementación
de la <acronym title="Warren Abstract Machine" lang="en">WAM</acronym>:
"<a href="http://www2.info.ucl.ac.be/people/PVR/Peter.thesis/Peter.thesis.html" lang="en">Can Logic Programming Execute as Fast as Imperative Pro-gramming?</a>" (PhD
Thesis, Department of Computer Science, U.C. Berkeley, Report UCB/CSD 90/600, 1990).</p>
<p>La aparición de la Máquina Abstracta de Warren o <acronym title="Warren Abstract Machine" lang="en">WAM</acronym> (David H.D. Warren, 1983) supuso un punto de inflexión en la evolución
del lenguaje Prolog, por cuanto comportaba la definición de un conjunto
de instrucciones de alto nivel y un modelo de ejecución para este
lenguaje, y la materialización de la <a href="http://www.clip.dia.fi.upm.es/~vocal/public_info/">programación lógica
con restricciones</a> (Constraint Logic Programming, CLP). Supone la base, adoptada como estándar de facto, para la implementación
de intérpretes portables para el lenguaje Prolog, convirtiéndolo
en un lenguaje multipropósito con características similares
a las de los lenguajes compilados de carácter procedimental, en
lo que alos tiempos de ejecución se refiere. Así, en el sitio
web del intérprete SWI-Prolog leemos:</p>
<blockquote>
<p>"SWI-Prolog is a Prolog implementation based on a subset of the WAM (Warren Abstract Machine)."</p>
<p>"[...] is based on a very restricted form of the <acronym title="Warren Abstract Machine" lang="en">WAM</acronym> [...] described in <em><a href="http://www.swi.psy.uva.nl/projects/SWI-Prolog/Manual/Bibliography.html#Bowen:83" lang="en">Bowen
& Byrd, 1983</a></em> which defines only 7 instructions. Prolog can
easily be compiled into this language and the abstract machine code is
easily decompiled back into Prolog. As it is also possible to wire a standard
4-port debugger in the <acronym title="Warren Abstract Machine" lang="en">WAM</acronym> interpreter there is no need for a distinction between compiled and interpreted
code. Besides simplifying the design of the Prolog system itself this approach
has advantages for program development: the compiler is simple and fast,
the user does not have to decide in advance whether debugging is required
and the system only runs slightly slower when in debug mode. The price
we have to pay is some performance degradation (taking out the debugger
from the <acronym title="Warren Abstract Machine" lang="en">WAM</acronym>
interpreter improves performance by about 20%) and somewhat additional
memory usage to help the decompiler and debugger."</p>
<p>"SWI-Prolog extends the minimal set of instructions described in <em><a href="http://www.swi.psy.uva.nl/projects/SWI-Prolog/Manual/Bibliography.html#Bowen:83" lang="en">Bowen
& Byrd, 1983</a></em> to improve performance. While extending this set
care has been taken to maintain the advantages of decompilation and tracing
of compiled code. The extensions include specialised instructions for unification,
predicate invocation, some frequently used built-in predicates, arithmetic,
and control (<a href="http://www.swi.psy.uva.nl/projects/SWI-Prolog/Manual/control.html#;/2" lang="en">;/2</a>,
<a href="http://www.swi.psy.uva.nl/projects/SWI-Prolog/Manual/control.html#|/2" lang="en">|/2</a>),
if-then (<a href="http://www.swi.psy.uva.nl/projects/SWI-Prolog/Manual/control.html#send_arrow/2" lang="en">->/2</a>)
and negation-by-failure (<a href="http://www.swi.psy.uva.nl/projects/SWI-Prolog/Manual/control.html#\+/1" lang="en">\+/1</a>)."</p>
<div class="cita">En <a href="http://www.swi.psy.uva.nl/projects/SWI-Prolog/Manual/" lang="en">SWI-Prolog
Reference Manual</a> - <a href="http://www.swi.psy.uva.nl/projects/SWI-Prolog/Manual/swiprolog.html" lang="en">1.1 SWI-Prolog</a></div>
</blockquote>
<p>La función de esta máquina virtual, dentro del núcleo
del intérprete, es compilar las instrucciones escritas en lenguaje
de alto nivel a instrucciones en lenguaje máquina, de forma similar
a como lo hace la máquina virtual Java (<acronym title="Java Virtual Machine" lang="en">JVM</acronym>).
La arquitectura WAM ha permitido en consecuencia desarrollar versiones
de Prolog "compilado" a nivel de ejecución, aun cuando los programas
se sigan guardando y ejecutando desde archivos que contienen código
escrito en lenguaje de alto nivel. De manera general, una máquina
virtual es por tanto un procedimiento abstracto para ejecutar conjuntos
de instrucciones escritas en un lenguaje formal, como puede ser en este
caso Prolog.</p>
<blockquote>
<p>"[...] si utilizamos un entorno de programación interpretado
de Prolog [...] la eficiencia, en cuanto a velocidad de ejecución
se refiere, disminuye, al igual que en cualquier lenguaje interpretado,
frente a un lenguaje compilado.</p>
<p>El conjunto de instrucciones de las computadoras actuales resulta muy
pobre en relación con la semántica de Prolog, por lo que
la mayoría de los compiladores de Prolog [...] realizan una compilación
a un lenguaje intermedio en vez de hacerlo directamente a lenguaje máquina.
El lenguaje más popular es el Warren Abstract Machine (WAM) [...]
conjunto de instrucciones abstractas utilizable en Prolog y que se puede
interpretar o traducir a lenguaje máquina. Existen otros compiladores
que traducen Prolog a un lenguaje de alto nivel como Lisp o C, y utilizan
dicho compilador para traducir a lenguaje máquina.</p>
<p>Antes del trabajo de Warren sobre la compilación de la inferencia
en Prolog, la programación lógica resultaba excesivamente
lenta para su uso generalizado. Los compiladores diseñados por Warren
y otros permitieron a Prolog alcanzar velocidades adecuadas [...] En fechas
más recientes, la aplicación de la moderna tecnología
de compilación [...] ha permitido a Prolog alcanzar velocidades
tan óptimas que lo hace competir con C en cuanto a diversos aspectos
estándar [...]. [...] el hecho de poder escribir un planificador
o un analizador de lenguaje natural en unas cuantas decenas de líneas
de Prolog, hacen que éste sea más preferible que C en la
realización de los prototipos de gran parte de los proyectos de
investigación de <acronym title="Inteligencia Artificial">IA</acronym>
a escala reducida."</p>
<div class="cita"><a href="http://www.uhu.es/nieves.pavon/pprogramacion/temario/tema4/tema4.html#_Toc495058042">Fuente</a>
(<a href="http://www.uhu.es/nieves.pavon/pprogramacion/">estructura general de marcos</a> de
la página citada)</div>
</blockquote>
<p>Más información al respecto: "<a href="http://www.vanx.org/archive/wam/wambook.pdf" lang="en">Warrens's
Abstract Machine: A Tutorial Reconstruction</a>" (en <acronym title="Portable Document Format" lang="en">PDF</acronym>;
Hassan Aït-Kaci; The MIT Press, Cambridge, MA, 1991).</p>
<p>En el siguiente trabajo se describe el sistema y la notación
DECsystem-10 Prolog, en la que se basa el estándar de Edimburgo,
que recordemos es de facto el sistema Prolog estándar en la actualidad,
recogido la norma ISO vigente referida a este lenguaje (ISO/IEC 13211-1:1995
Part 1: General core):</p>
<blockquote>
<p>"<a href="http://www-2.cs.cmu.edu/afs/cs/project/ai-repository/ai/lang/prolog/doc/intro/prolog.doc">DECsystem-10
Prolog User's Manual</a>". D.L. Bowen (ed.), L. Byrd, F.C.N. Pereira, L.M.
Pereira, and D.H.D. Warren, Department of Artificial Intelligence, University
of Edinburgh, November 10, 1982.</p>
</blockquote>
<p>Si bien el formato del anterior documento es ".doc", se trata realmente
de un archivo de texto plano, por lo que se descoloca la disposición
del mismo si se abre con <acronym title="MicroSoft" lang="en">MS</acronym>
Word. También: <a href="http://www.cs.uah.edu/~thinke/Prolog/prolog.html">versión
en HTML</a>, y <a href="http://proton.ucting.udg.mx/tutorial/prolog/index.htm">traducción
al castellano</a> de este manual, limitada a los tres primeros capítulos.</p>
<p>El DECsystem-10 Prolog fue una implementación creada y desarrollada
(1977, 1980) por D. Warren y otros (F. Pereira, L. Byrd, L. Pereira) en
el Departamento de Inteligencia Artificial de la Universidad de Edimburgo,
para operar en sistemas informáticos DECsystem-10. Junto con el
Prolog descrito en la obra referenciada de Clocksin y Mellish, las versiones
del DEC-10 Prolog y sus posteriores desarrollos constituyen la base del
estándar o sintaxis de Edimburgo.</p>
<p>Las iniciales DECsystem-10 hacen referencia al sistema informático
sobre el que se basó la implementación Prolog de la Universidad
de Edimburgo que venimos comentando, fabricado por
<a href="http://www.research.microsoft.com/~gbell/Digital/DECMuseum.htm" title="CyberMuseum for Digital Equipment Corp (DEC)" lang="en">Digital
Equipment <abbr title="Corporation" lang="en">Corp.</abbr></a> Los
DECsystem-10/20 eran sistemas de <a href="http://www.research.microsoft.com/~gbell/Digital/timeline/36-bit.htm" lang="en">arquitectura
de 36-bit</a>, cuyas primeras versiones datan del año 1971. Cuando
hablamos de este tipo de sistemas no hay que pensar en los <acronym title="Personal Computer" lang="en">PC</acronym>s,
posteriores en el tiempo y orientados inicialmente hacia otro tipo de usuario
final, sino que se trataba de equipos situados, por potencia de procesamiento
y cálculo (y todo sea dicho, por dificultad de manejo y operación),
en la escala de los grandes equipos informáticos conocidos como
"mainframes". No es infrecuente encontrar, en guías y manuales antiguos
del lenguaje Prolog (por ejemplo los referidos a C-Prolog [<a href="http://kilo.ee.lsu.edu/koppel/ee4785/prolog.html" title="C-Prolog User's Manual" lang="en">en
HTML</a>] [<a href="ftp://ftp.ee.lsu.edu/pub/koppel/ee4785/prolog.ps">en <acronym title="PostScript" lang="en">PS</acronym></a>],
y en general a las implementaciones derivadas de la primera especificación
DECsystem-10 Prolog), referencias a TOPS-20, evolución de los DECsystem-10/20,
y a otros sistemas de <acronym title="Digital Equipment Corporation" lang="en">DEC</acronym>.</p>
<p>Sobre la base de este primer intérprete-compilador para Prolog
se creó, en 1983, uno de los primeros intérpretes puros para
dicho lenguaje, <a href="http://kilo.ee.lsu.edu/koppel/ee4785/prolog.html" title="C-Prolog User's Manual" lang="en">C-Prolog</a>
(F. Pereira, D. Bowen, L. Byrd), escrito en lenguaje C, que contribuyó
a consolidar el estándar de Edimburgo, como referencia para posteriores
implementaciones.</p>
<p>Para finalizar esta anotación, mencionar el ejemplo de aplicación
práctica del lenguaje Prolog a la resolución de juegos y
acertijos lógicos descrito en "<a href="http://www.sunyit.edu/~millerd1/RUBIK.HTM" lang="en">Solving
Rubik's Cube Using the Bestfast Algorithm and Profile tables - A Prolog
program and demonstration of an efficient heuristic search method</a>"
(por <a href="http://www.sunyit.edu/~millerd1/" lang="en">D.L. Winston
Miller</a>). Como el propio título indica, en este texto se explica
el fundamento teórico y el funcionamiento de un programa diseñado
para efectuar la búsqueda de los mejores métodos posibles
de resolución del problema planteado por el famoso <a href="http://www.microsiervos.com/rompecabezas.html">Cubo
de Rubik</a>. Los archivos que conforman el programa (ver al final del
documento) están escritos originalmente para ser ejecutados bajo
el intérprete <a href="http://www.arity.com/www.pl/products/ap.htm" lang="en">Arity
Prolog</a> (de uso libre) si bien, al soportar la notación y <a href="http://www.arity.com/www.pl/products/appreds.htm" lang="en">predicados</a>
del estándar de Edimburgo, el programa en principio debería
también poder ejecutarse correctamente bajo <a href="http://www.swi-prolog.org/" lang="en">SWI-Prolog</a>.</p>
<p>El programa hace uso de un algoritmo de búsqueda <a href="http://www.cogs.susx.ac.uk/local/books/ai-through-search/ch04/ch04-uh-6.html" title="Ordered search and the A* Algorithm" lang="en">A*</a>
(<a href="http://www.sju.edu/~jhodgson/ai/astar.html">ejemplo</a>), basado
en el tipo conocido como "best-first search", derivado a su vez del método
de búsqueda "breadth-first search" o "búsqueda primero en
anchura" (<a href="http://www.sju.edu/~jhodgson/ai/bfs.html" lang="en">ejemplo</a>),
que evalúa cada nodo del mismo nivel, dentro del árbol de
búsqueda (entendiendo por tal la representación en forma
de grafo dirigido -los nodos que lo forman están conectados mediante
flechas que indican la dirección del movimiento- de un determinado
problema de búsqueda), antes de continuar el proceso en el siguiente
nivel de profundidad. En contraposición a este método se
sitúa la búsqueda "depth-first" o "primero en profundidad"
(<a href="http://www.sju.edu/~jhodgson/ai/dfs.html" lang="en">ejemplo</a>),
en la que se explora cada "rama" del árbol hasta llegar al "nodo
terminal", antes de proceder a la búsqueda por otro camino. Este
es precisamente el tipo de búsqueda "interna" por defecto que lleva
a cabo el lenguaje Prolog (búsqueda en profundidad y de izquierda
a derecha en un árbol And-Or) dentro de la base de conocimientos
compilada, al tratar de satisfacer los objetivos.</p>
<blockquote>
<p>"The A* [...] is an efficient and widely used <a href="http://www.generation5.org/glossary/display.asp?uri=pathing.xml" lang="en">pathing</a>
algorithm. The A* keeps track of the cost of getting from point A to point
B and the overall cost of getting from the beginning point to the end point.
The algorithm follows the path of least cost to find a solution. The A*
uses up a lot of memory and can be very slow on rough terrain - therefore
it is not used for real-time robotics <a href="http://www.generation5.org/glossary/display.asp?uri=pathing.xml" lang="en">pathing</a> too often."</p>
<div class="cita"><a href="http://www.generation5.org/glossary/display.asp?uri=astar.xml" lang="en">Fuente</a></div>
</blockquote>
<p>A los dos tipos básicos de algoritmos de búsqueda mencionados
(existen otros muchos), se les pueden añadir eventualmente métodos
heurísticos de evaluación, consistentes en reglas capaces
de valorar si, en base a determinado tipo de información previa,
la búsqueda está siguiendo el camino correcto, para de esta
forma aumentar la probabilidad de dar con la solución correcta.
Los métodos heurísticos tratan de aplicar dos criterios de
búsqueda: a) elección de los caminos que es posible que fallen
con mayor probabilidad, para de esta forma "podar" el espacio de búsqueda
y así reducir su tamaño, o bien b) comprobación, en
primer lugar, de los caminos con mayor probabilidad de éxito. Las
búsquedas heurísticas son por tanto búsquedas basadas
en la experiencia. La adición de capacidades heurísticas
a los métodos de búsqueda "breadth-first", da lugar a los
algoritmos "best-first search", como el A* utilizado en el programa aplicado
a la resolución de los estados del Cubo de Rubik.</p>
<p>Estos tres tipos básicos de algoritmos de búsqueda, así
como los conceptos y teoremas básicos de la Teoría de Grafos
[<a href="http://emis.library.cornell.edu/monographs/Diestel/en/download.html" title="Graph Theory by Reinhard Diestel" lang="en">1</a>]
[<a href="http://es.wikipedia.org/wiki/Teor%EDa_de_grafos" title="En Wikipedia, la enciclopedia libre">2</a>]
[<a href="http://en2.wikipedia.org/wiki/Graph_theory" title="Graph theory. From Wikipedia, the free encyclopedia" lang="en">3</a>]
necesarios para la comprensión y conocimiento de sus mecanismos
de funcionamiento, se describen ampliamente en los capítulos 11.
"Basic Problem-Solving Strategies", 12. "Best First: A Heuristic Search
Principle", y 13. "Problem Reduction and AND/OR Graphs" de la obra de Ivan
Bratko "Prolog programming for Artificial Intelligence" (Addison-Wesley,
1994; ISBN: 0-201-41606-9).</p>
<p>Por otra parte "<a href="http://www.cogs.susx.ac.uk/local/books/ai-through-search/index.html" lang="en">Artificial
Intelligence Through Search</a>" (C.J. Thorton, B. du Boulay) es un libro
que aborda de forma especifica la cuestión de los métodos
y algoritmos utilizados en espacios de búsqueda (definidos éstos
por el conjunto de todos los nodos de un grafo dirigido). Desafortunadamente,
en la versión electrónica de este libro se pierden gran parte
de las figuras y esquemas del original impreso, lo cual dificulta la comprensión de estas cuestiones, que de por si tienen cierta complejidad.</p>
<p>Más información:</p>
<ul class="conmargeninf">
<li>
"<a href="http://www.dccia.ua.es/~faraon/docs/juegos.pdf">Los Juegos como
Herramienta Docente. Formalización de Juegos Lógicos en Prolog</a>"
(<a href="http://www.dccia.ua.es/~faraon/principal.htm">F. Llorens</a>,
M&ord