tag:blogger.com,1999:blog-54548822008-03-28T20:50:40.407+01:00Programaci&oacute;n L&oacute;gica y Recuperaci&oacute;n de Informaci&oacute;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&oacute;n de reglas gramaticales DCG (Definite Clause Grammar, en castellano <em>gram&aacute;tica de cl&aacute;usulas definidas</em>) es una variante o extensi&oacute;n sint&aacute;ctica de la sintaxis ordinaria del lenguaje Prolog, cuyo objeto es implementar gram&aacute;ticas formales de forma abreviada, y en consecuencia simplificar y hacer m&aacute;s legibles los analizadores sint&aacute;cticos escritos en este lenguaje, ya que permite manejar informaci&oacute;n (enti&eacute;ndase por &eacute;sta "variables") impl&iacute;cita. Su expresi&oacute;n es una notaci&oacute;n abreviada de la sintaxis del lenguaje Prolog, recogida por la pr&aacute;ctica totalidad de los <em>parsers</em> e int&eacute;rpretes actuales para este lenguaje, que la transforman autom&aacute;ticamente y de forma interna en cl&aacute;usulas normales. En la notaci&oacute;n <acronym title="Definite Clause Grammar" lang="en">DCG</acronym> el operador infijo ":-" es sustituido por el operador del mismo car&aacute;cter "-->", y se puede establecer, a modo de ejemplo, la siguiente correspondencia entre notaciones, siendo la primera la cl&aacute;usula Prolog en sintaxis ordinaria, y la segunda la notaci&oacute;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&aacute;usula Prolog se expresa en palabras como sigue:</p> <blockquote>"Existe una oraci&oacute;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&oacute;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&aacute;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&aacute;rquica que indica las relaciones de las construcciones del lenguaje, descritas mediante notaci&oacute;n BNF (<em>Backus Normal Form</em> &oacute; <em>Backus-Naur form</em>), creada originalmente para definir la estructura sint&aacute;ctica del lenguaje ALGOL60 (1960, John Backus), y muy utilizada tanto para definir la estructura sint&aacute;ctica de los lenguajes de programaci&oacute;n, como para definir estructuras sint&aacute;cticas de los lenguajes en general. Por tanto, mediante notaci&oacute;n <acronym title="Definite Clause Grammar" lang="en">DCG</acronym>, es posible manejar directamente en lenguaje Prolog gram&aacute;ticas libres de contexto. Las gram&aacute;ticas libres de contexto vienen a ser una simplificaci&oacute;n de la gram&aacute;tica ordinaria, que, por ejemplo, y referida al idioma castellano, podr&iacute;a adoptar la siguiente expresi&oacute;n en notaci&oacute;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&aacute;ticamente al siguiente conjunto de cl&aacute;usulas:</p> <div class="codigo"> <p>oracion(A,B):- sintagma_nominal(A,C), <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sintagma_verbal(C,B).</p> <p>sintagma_nominal(A,B):- determinante(A,C), <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nombre(C,B).</p> <p>sintagma_verbal(A,B):- verbo(A,C), <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 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&aacute;cilmente deducible, el programa basado en esta peque&ntilde;a y muy limitada gram&aacute;tica, solo aceptar&aacute; 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&eacute;ndonos una lista vac&iacute;a, pero no aceptar&aacute; 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&aacute;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&iacute;cil de implementar. En el ejemplo expuesto, se pueden obtener todas las oraciones aceptadas como gramaticalmente correctas por la gram&aacute;tica del programa, lanzando en el int&eacute;rprete el siguiente objetivo:</p> <p class="codigo">?- oracion(X,[]).</p> <p>Por su parte, un ejemplo muy sencillo de gram&aacute;tica para el idioma ingl&eacute;s, escrita mediante notaci&oacute;n <acronym title="Definite Clause Grammar" lang="en">DCG</acronym>, adopta la siguiente expresi&oacute;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&oacute;n <acronym title="Definite Clause Grammar" lang="en">DCG</acronym> se suprimen dos par&aacute;metros, una lista de entrada, y una lista de salida. La primera puede estar representada, por ejemplo, por la oraci&oacute;n [el,perro,muerde] y la segunda por una lista vac&iacute;a [] que es el resultado de comprobar la estructura sint&aacute;ctica de dicha oraci&oacute;n en funci&oacute;n del <em>parser</em> utilizado. Adicionalmente, es posible agregar variables a las gram&aacute;ticas representadas mediante notaci&oacute;n <acronym title="Definite Clause Grammar" lang="en">DCG</acronym>, por ejemplo para especificar el g&eacute;nero y el n&uacute;mero.</p> <p>Como se ha dicho anteriormente, la notaci&oacute;n <acronym title="Definite Clause Grammar" lang="en">DCG</acronym> permite a&ntilde;adir argumentos adicionales, y tambi&eacute;n incorporar objetivos Prolog en el cuerpo de las reglas, estos &uacute;ltimos encerrados entre llaves {}. Los argumentos adicionales nos permitir&iacute;an por ejemplo introducir las reglas gramaticales correctas en funci&oacute;n de las convenciones adoptadas por la lengua objeto de representaci&oacute;n, y as&iacute; evitar incorrecciones en la concordancia g&eacute;nero / n&uacute;mero, etc. Tambi&eacute;n, mediante notaci&oacute;n <acronym title="Definite Clause Grammar" lang="en">DCG</acronym> tambi&eacute;n es posible construir programas capaces de representar &aacute;rboles de an&aacute;lisis de una oraci&oacute;n (que representan las categor&iacute;as gramaticales implicadas en la descomposici&oacute;n de sus partes), y <a href="http://www.nyu.edu/pages/linguistics/ling.html#tree" lang="en">&aacute;rboles sint&aacute;cticos</a> (<em>parse trees</em>) que de una forma gr&aacute;fica muestran la estructura en forma de &aacute;rbol descendente de determinada construcci&oacute;n gramatical. Como explicamos en la anterior anotaci&oacute;n, los analizadores sint&aacute;cticos o <em>parsers</em> se encargan de la construcci&oacute;n de &aacute;rboles de an&aacute;lisis de las oraciones de una lengua, capaces de representar la estructura sintagm&aacute;tica de las mismas. Siguiendo con el ejemplo de la sencilla gram&aacute;tica en castellano, expuesto m&aacute;s arriba, la representaci&oacute;n gr&aacute;fica del &aacute;rbol de an&aacute;lisis de la oraci&oacute;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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; o <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +--------------------+ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sn&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sv <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | <br />&nbsp;&nbsp; +-------+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +------------+ <br />&nbsp;&nbsp; d&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; v&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sn <br />&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | <br />&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +--------+ <br />&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; n <br />&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | <br />&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | <br />&nbsp;&nbsp; el&nbsp;&nbsp;&nbsp; hombre&nbsp;&nbsp;&nbsp; come&nbsp;&nbsp;&nbsp; la&nbsp;&nbsp;&nbsp; manzana</p> </div> <p>Donde "o" = oraci&oacute;n, "sn" = Sintagma Nominal, "d" = Determinante, "n" = Nombre, "sv" = Sintagma Verbal, y "v" = Verbo. Hay que advertir que este programa no realiza el &aacute;rbol de an&aacute;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&oacute;n gr&aacute;fica en forma de diagrama de caracteres <acronym title="American Standard Code for Information Interchange" lang="en">ASCII</acronym>. El c&oacute;digo fuente del programa en cuesti&oacute;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&oacute;n ".pl" para poder ser ejecutado por el int&eacute;rprete <a href="http://www.swi-prolog.org/" lang="en">SWI-Prolog</a>, aunque otra opci&oacute;n es asociar los archivos con extensi&oacute;n ".swi" con el ejecutable de dicho int&eacute;rprete. Su autor es <a href="http://users.sdsc.edu/~ludaesch/" lang="en">Bertram Lud&auml;scher</a>, de la "University of California Davis".</p> <p>Los ejemplos de notaci&oacute;n <acronym title="Definite Clause Grammar" lang="en">DCG</acronym> y Prolog en castellano se han tomado del cap&iacute;tulo 9, "Uso de reglas gramaticales en Prolog", apartado 9.1, "El problema del an&aacute;lisis sint&aacute;ctico", de la obra de W.F. Clocksin y C.S. Mellish "Programaci&oacute;n en Prolog" (2&ordf; ed.; Barcelona: Gustavo Gili, 1993; ISBN: 84-252-1339-8), traducci&oacute;n del original en ingl&eacute;s "Programming in Prolog", a la que me remito para obtener una explicaci&oacute;n detallada sobre reglas gramaticales, an&aacute;lisis sint&aacute;ctico, y notaci&oacute;n <acronym title="Definite Clause Grammar" lang="en">DCG</acronym> en Prolog, habida cuenta de que los autores rese&ntilde;ados hacen una exposici&oacute;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&aacute;tica en ingl&eacute;s se ha obtenido del cap&iacute;tulo 17, "Languague Processing with Grammar Rules", de la obra "Prolog - Programming for Artificial Intelligence" (Ivan Bratko, 2&ordf; ed.; Addison-Wesley, 1990; ISBN: 0-201-41606-9). Se trata de un libro muy recomendable, de nivel m&aacute;s avanzado y completo que el de Clocksin y Mellish, claramente m&aacute;s introductorio, y como su propio nombre indica cubre por un lado las generalidades del lenguaje Prolog, y por otro lado su aplicaci&oacute;n a las principales t&eacute;cnicas del campo de la <acronym title="Inteligencia Artificial">IA</acronym> (b&uacute;squeda y clasificaci&oacute;n, sistemas expertos y representaci&oacute;n del conocimiento, <acronym title="Procesamiento del Lenguaje Natural">PLN</acronym>, Machine Learning, etc.).</p> <p>Por &uacute;ltimo, mencionar otro ejemplo de utilizaci&oacute;n pr&aacute;ctica de la notaci&oacute;n <acronym title="Definite Clause Grammar" lang="en">DCG</acronym> y el lenguaje de programaci&oacute;n l&oacute;gica Prolog, la librer&iacute;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&eacute;rprete y entorno de desarrollo <a href="http://www.swi-prolog.org/" lang="en">SWI-Prolog</a>, que traslada t&eacute;rminos Prolog en <acronym title="HyperText Markup Language" lang="en">HTML</acronym>, generando salidas en este &uacute;ltimo lenguaje, para lo cual hace uso precisamente de estructuras escritas en notaci&oacute;n <acronym title="Definite Clause Grammar" lang="en">DCG</acronym>.</p> <p>M&aacute;s informaci&oacute;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&iacute;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&oacute;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&iacute;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&iacute;a, formato ".doc"; Klaus von Bremen).</li> <li> <a href="http://www.mtome.com/">Prolog and Natural-Language Analysis</a> (monograf&iacute;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&oacute;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&iacute;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&oacute;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&oacute;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&oacute;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&oacute;n: Notaci&oacute;n BNF y otras gram&aacute;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 &aacute;mbito de dominio del Procesamiento del Lenguaje Natural (PLN), una de las funciones esenciales de los analizadores sint&aacute;cticos o <em>parsers</em> es el an&aacute;lisis de cadenas de <em>tokens</em> en busca de posibles errores sint&aacute;cticos (recordemos que la sintaxis, entendida en sentido amplio, es aquella parte de la gram&aacute;tica que se ocupa de las normas que rigen la formalizaci&oacute;n de las <em>palabras</em> en estructuras mayores tales como las <em>oraciones</em>, as&iacute; como de las relaciones que establecen entre si dichas palabras). Un <em>token</em> se puede definir como la unidad m&iacute;nima de informaci&oacute;n con significado propio dentro de una secuencia de caracteres alfanum&eacute;ricos. Estas cadenas de unidades m&iacute;nimas de informaci&oacute;n o <em>unidades l&eacute;xicas</em>, son generadas previamente por el m&oacute;dulo lexicogr&aacute;fico integrado en el parser, encargado de identificarlas dentro de un texto o secuencia ordenada de caracteres alfanum&eacute;ricos. Por su parte, la <em>tokenizaci&oacute;n</em> es un proceso consistente en la descomposici&oacute;n, en forma de lista, de esas cadenas de <em>tokens</em> en sus unidades m&iacute;nimas. As&iacute;, un programa de este tipo podr&iacute;a generar la siguiente lista de <em>tokens</em> a partir de la frase "&iexcl;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&uacute;meros de la lista se corresponde con el car&aacute;cter ASCII (American Standard Code for Information Interchange) correspondiente a cada una de las unidades m&iacute;nimas de significaci&oacute;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&oacute;n. La <em>tokenizaci&oacute;n</em> es por tanto el proceso b&aacute;sico que permite manejar el lenguaje natural escrito para su posterior procesamiento, en base a su descomposici&oacute;n en unidades m&iacute;nimas de informaci&oacute;n con significado propio.</p> <p>La mayor parte de los lenguaje de programaci&oacute;n contemplan instrucciones espec&iacute;ficas para llevar a cabo el proceso de <em>tokenizaci&oacute;n</em> de cadenas ordenadas de caracteres alfanum&eacute;ricos, si bien es posible implementar alternativamente esta operaci&oacute;n mediante otros procedimientos proporcionados por esos lenguajes.</p> <p>As&iacute;, un programa que pretenda "leer" un texto, deber&aacute; en primer lugar "tokenizarlo", generando una lista de los <em>tokens</em>, o unidades l&eacute;xicas m&iacute;nimas con significado propio, identificados en ese texto. A continuaci&oacute;n, proceder&aacute; a identificar unidades mayores de significado propio (contemplando por ejemplo la presencia, como elemento separador, del car&aacute;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&iacute;amos asimilar como "palabras", para, finalmente, acabar identificando otras unidades de significaci&oacute;n de orden superior, frases u oraciones. Diferenciadas las oraciones del texto "le&iacute;do", el parser procede a realizar el an&aacute;lisis sint&aacute;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&aacute;n de la lengua de escritura del texto, y del nivel de complejidad de an&aacute;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&oacute;n de las variaciones de posici&oacute;n admitidas en cada lengua, en relaci&oacute;n con el orden de las palabras, o an&aacute;lisis de las transformaciones, se realiza mediante procesos de an&aacute;lisis estructural que tratan de identificar la estructura profunda de una oraci&oacute;n en relaci&oacute;n con su estructura superficial. El an&aacute;lisis estructural, en base a la estructura superficial (2) de una oraci&oacute;n y, cambiando el orden de determinadas palabras, trata de determinar su posible transformaci&oacute;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&oacute;n del proceso de <em>tokenizaci&oacute;n</em>, al margen de la utilizaci&oacute;n de instrucciones espec&iacute;ficas que transforman directamente una cadena de caracteres alfanum&eacute;ricos en una cadena de <em>tokens</em>, implica la utilizaci&oacute;n de otro tipo de instrucciones cuya funci&oacute;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&aacute; 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&iacute;, 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&eacute;ricos o "&aacute;tomo" que se desea <em>tokenizar</em>, mientras que el argumento <strong>String</strong> es la variable que representa la lista resultante. El s&iacute;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('&iexcl;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&oacute;n <strong>[write]</strong> simplemente expresa que, una vez que el int&eacute;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 &eacute;sta se muestre en toda su extensi&oacute;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&oacute;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&aacute;gina</a>).</p> <p>Por supuesto, existen m&aacute;s predicados para la manipulaci&oacute;n de &aacute;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 &aacute;tomos en Prolog es utilizar el predicado <strong>get0/1</strong> y <strong>get0/2</strong> y alg&uacute;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 &aacute;tomo <strong>end_of_file</strong>, que se corresponde con el final de texto). Este predicado realmente lee el byte correspondiente a cada car&aacute;cter alfanum&eacute;rico individual, asoci&aacute;ndolo con su correspondiente c&oacute;digo ASCII.</p> <p>El analizador sint&aacute;ctico, en base a los constituyentes de una oraci&oacute;n (v&eacute;anse los principios de la <a href="http://es.wikipedia.org/wiki/Generativismo">gram&aacute;tica generativa</a> de Noam Chomsky), y mediante un n&uacute;mero finito de reglas, trata de determinar la gramaticalidad o no de un n&uacute;mero infinito de construcciones. Un analizador sint&aacute;ctico trata de ver hasta que punto puede someterse un grupo de palabras a una estructura de reglas. As&iacute; por ejemplo, si tenemos la oraci&oacute;n:</p> <blockquote>Pedro come una manzana</blockquote> <p>en primer lugar, y mediante un proceso de <em>tokenizaci&oacute;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&oacute;n, y si &eacute;sta puede concatenarse con otras sublistas que seg&uacute;n determinadas reglas se verifica como Sintagma Verbal (SV), la oraci&oacute;n se concluye que es gramatical. Lo que importa en los constituyentes es el orden de las palabras de la oraci&oacute;n.</p> <p>El analizador sint&aacute;ctico realiza el an&aacute;lisis secuencialmente, palabra por palabra, partiendo de una lista inicial que, siguiendo con el ejemplo de la oraci&oacute;n expuesta, ser&iacute;a:</p> <p class="codigo">[pedro,come,una,manzana]</p> <p>El proceso de computaci&oacute;n de las reglas del analizador sint&aacute;ctico debe dar como resultado otra lista, que ser&aacute; una lista vac&iacute;a <strong>[]</strong> si la oraci&oacute;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&aacute;ctico comprueba si &eacute;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&oacute;n.</p> <p>M&aacute;s informaci&oacute;n: <a href="http://elies.rediris.es/elies9/3-1-2.htm">El an&aacute;lisis sint&aacute;ctico y el an&aacute;lisis sem&aacute;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&iacute;do</a>), me permito hacerlo en esta ocasi&oacute;n dado el indudable inter&eacute;s que tiene el que reproduzco a continuaci&oacute;n, en funci&oacute;n de las ideas que plantea, las experiencias pr&aacute;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&eacute; Ram&oacute;n P&eacute;rez Ag&uuml;era</a> (Departamento de Sistemas Inform&aacute;ticos y Programaci&oacute;n, Facultad de Inform&aacute;tica, Universidad Complutense de Madrid) a la lista de distribuci&oacute;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&oacute;n para profesionales del &aacute;mbito de las bibliotecas y los centros de documentaci&oacute;n).</p> <p>[Comienza el texto de P&eacute;rez Ag&uuml;era]</p> <p>"Aunque no me toca publicar nota en <a href="http://www.thinkepi.net/">Thinkepi</a>, llevo unos meses (de hecho alg&uacute;n a&ntilde;o que otro) d&aacute;ndole vueltas a este asunto y me gustar&iacute;a contar con la opini&oacute;n de la comunidad de documentalistas, m&aacute;s all&aacute; 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&aacute;n teniendo voz, al desarrollarse dentro del campo de la inform&aacute;tica.</p> <p>Trabajo en generaci&oacute;n autom&aacute;tica de tesauros, lo cual me ha llevado a realizar experimentos de indizaci&oacute;n autom&aacute;tica y expansi&oacute;n de consultas a partir de tesauros realizados a mano. Concretamente he utilizado tres tesauros: ISOC-Econom&iacute;a, EUROVOC y SPINES, todos ellos conocidos de sobra. La colecci&oacute;n sobre la que he realizado las pruebas ha sido el sub-conjunto de noticias de econom&iacute;a y pol&iacute;tica generadas por la Agencia EFE en 1994 (efe94 es una colecci&oacute;n t&iacute;pica en experimentos de recuperaci&oacute;n de informaci&oacute;n que consta de un total de 215.738 documentos. Yo he utilizado 23.390 en mis experimentos para centrarme en el &aacute;rea de pol&iacute;tica y econom&iacute;a, las cuales son cubiertas en buena medida por los tesauros anteriormente mencionados).</p> <p>A parte tambi&eacute;n he contado con un conjunto 22 de consultas con sus respectivos juicios de relevancia para el dominio mencionado de cara a la realizaci&oacute;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&ntilde;os y que se centra en temas de recuperaci&oacute;n de informaci&oacute;n mono y multiling&uuml;e.</p> <p>Como motor de b&uacute;squeda he usado <a href="http://lucene.apache.org/" lang="en">Lucene</a>, adaptado al espa&ntilde;ol con <em>stemming</em> sobre los t&eacute;rminos de indizaci&oacute;n, el cual est&aacute; basado en el <a href="http://www.ub.es/bid/04figue2.htm#ModeloVectorial">modelo tradicional de espacio vectorial</a> de Salton (un cl&aacute;sico, vamos).</p> <p>El objetivo de mis primeros experimentos ha sido el de comprobar de que forma afectaba a la recuperaci&oacute;n de informaci&oacute;n automatizada el uso de tesauros documentales como los que se usan todos los d&iacute;as en centros de documentaci&oacute;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&oacute;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&aacute;cticamente nada la recuperaci&oacute;n en la colecci&oacute;n, ni en precisi&oacute;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&oacute;n de Informaci&oacute;n">RI</acronym> que tiene un programita bastante completillo llamado trec_eval para evaluar la recuperaci&oacute;n), es m&aacute;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&oacute;n ha sido trabajar con tesauros generados autom&aacute;ticamente a partir de tres metodolog&iacute;as b&aacute;sicas:</p> <ul class="conmargeninf"> <li> Procesamiento ling&uuml;&iacute;stico de la colecci&oacute;n (<em>POS-Tagging</em>, an&aacute;lisis sint&aacute;ctico, an&aacute;lisis de &aacute;rboles de dependencia entre t&eacute;rminos).</li> <li> An&aacute;lisis de co-ocurrencias para la generaci&oacute;n de las relaciones entre t&eacute;rminos (<em>Latent Semantic analysis</em>, Qui y Frei (y su versi&oacute;n espa&ntilde;ola implementada por Zazo, Berrocal y Cia de Salamanca), Jing y Croft, etc.).</li> <li> Utilizaci&oacute;n de otros recursos ling&uuml;&iacute;sticos (l&eacute;ase <a href="http://www.illc.uva.nl/EuroWordNet/" lang="en">eurowordnet</a> en su versi&oacute;n espa&ntilde;ola, y diccio).</li> </ul> <p>Los tesauros generados autom&aacute;ticamente a partir de estas metodolog&iacute;as s&iacute; han proporcionado mejoras significativas en la recuperaci&oacute;n. No me quiero poner aqu&iacute; m&aacute;s pesado de la cuenta sobre los detalles t&eacute;cnicos y las cifras pero para el que las quiera se las puedo pasar.</p> <p>El caso es que coment&eacute; el hecho con Antonio Garc&iacute;a Jim&eacute;nez, que de esto de tesauros documentales sabe un rato, y me coment&oacute; ciertas ideas muy valiosas que explicaban en parte los resultados, y que se podr&iacute;an resumir (Antonio, si andas por ah&iacute;, corr&iacute;geme si me equivoco) en que los tesauros no se adaptaban perfectamente a la colecci&oacute;n sobre la que yo los aplicaba y que por tanto se necesitar&iacute;a un tesauro hecho a mano para la colecci&oacute;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&oacute;n para adaptarla terminol&oacute;gicamente a los tesauros con los que yo contaba, para hacer confluir ambos conjuntos de datos en lo posible y as&iacute; comprobar si mejoraba algo la capacidad de recuperaci&oacute;n de los tesauros, pero por desgracia los datos han seguido siendo bastante descorazonadores.</p> <p>Despu&eacute;s de todas estas pruebas me surgi&oacute; la siguiente pregunta &iquest;realmente tienen lugar los tesauros hechos a mano, y basados en la metodolog&iacute;a y normativas tradicionales en el panorama de recuperaci&oacute;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&iacute;a de elaboraci&oacute;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&oacute;n de Informaci&oacute;n Automatizada son:</p> <ul class="conmargeninf"> <li> Dispersi&oacute;n de datos: Es decir en la colecci&oacute;n aparecen constantemente palabras que el tesauro no es capaz de normalizar (este problema no se soluciona con una actualizaci&oacute;n peri&oacute;dica hecha a mano en funci&oacute;n del crecimiento de la colecci&oacute;n).</li> <li> Ambig&uuml;edad Sem&aacute;ntica excesiva a&uacute;n en tesauros de dominio espec&iacute;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&uacute;n mecanismo m&aacute;s o menos autom&aacute;tico de control de consistencia (de hecho la mera importaci&oacute;n de los tesauros a <acronym title="Structured Query Language" lang="en">SQL</acronym> a permitido la detecci&oacute;n de estas inconsistencias estructurales) m&aacute;s all&aacute; de programas tipo multites y dem&aacute;s.</p> <p>A esto se suma que tal y como se hacen los tesauros hoy en d&iacute;a, y en contra de lo que muchos opinan, tampoco sirve para la transici&oacute;n a las ontolog&iacute;as, debido a cuestiones b&aacute;sicas de dise&ntilde;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&iacute;a.</p> <p>En vista a estos hechos y a que yo no doy m&aacute;s de mi por el momento en este asunto, me gustar&iacute;a conocer vuestra opini&oacute;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&eacute;is ir haciendo ser&iacute;an:</p> <ul class="conmargeninf"> <li> &iquest;Cual es el papel de los tesauros documentales en el contexto de la recuperaci&oacute;n de informaci&oacute;n automatizada en centros de documentaci&oacute;n?</li> <li> &iquest;Cual es el papel de los tesauros documentales en la recuperaci&oacute;n de informaci&oacute;n en Internet?</li> <li> &iquest;Es necesario modificar el paradigma de elaboraci&oacute;n de tesauros actualmente imperante? &iquest;en que sentido?</li> </ul> <p>Yo, aunque no soy un experto tesaurista tengo mis opiniones que ir&eacute; poniendo aqu&iacute; si el debate tiene &eacute;xito, pero las que me interesan son las vuestras.</p> <p>Espero haber sido claro, si ten&eacute;is cualquier duda sobre lo que he escrito o algo no se entiendo no dud&eacute;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&eacute;rez Ag&uuml;era]</p> <p>Pues ya saben, cualquier comentario, rectificaci&oacute;n, aportaci&oacute;n etc., en relaci&oacute;n con las cuestiones planteadas en el texto anterior, pueden enviarlo a la referida lista IWETEL, y as&iacute; enriquecer el debate que sin duda merece el conjunto de asuntos planteados por P&eacute;rez Ag&uuml;era en relaci&oacute;n con la recuperaci&oacute;n de informaci&oacute;n, la indizaci&oacute;n automatizada, y el papel que los tesauros como instrumento de descripci&oacute;n normalizada juegan en todo ello...</p> <p>De P&eacute;rez Ag&uuml;era, y sobre los temas que aborda en su comunicaci&oacute;n a la lista IWETEL, ver tambi&eacute;n: "<a href="http://www.w3.org/2001/sw/Europe/events/200406-esp/trabajo-final-extratesauros/trabajo-final-extratesauros.html">Automatizaci&oacute;n de Tesauros y su utilizaci&oacute;n en la Web Sem&aacute;ntica</a>" (<a href="http://www.w3.org/2001/sw/Europe/" lang="en">SWAD-Europe</a>, taller <em>Introducci&oacute;n al uso de la Web Sem&aacute;ntica</em>, 13 de junio 2004). V&eacute;anse tambi&eacute;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&eacute;n me parece pertinente rese&ntilde;ar, de la revista <em><a href="http://www.um.es/fccd/anales/">Anales de Documentaci&oacute;n</a></em> (n&ordm; 7, 2004, p&aacute;gs. 79-95), el art&iacute;culo de Antonio Garc&iacute;a Jim&eacute;nez "<a href="http://www.um.es/fccd/anales/ad07/ad0706.pdf">Instrumentos de Representaci&oacute;n del Conocimiento: Tesauros versus Ontolog&iacute;as</a>" (en <acronym title="Portable Document Format" lang="en">PDF</acronym>).</p> <p>En otro orden de cosas, aprovecho la ocasi&oacute;n para relacionar a continuaci&oacute;n una serie de enlaces, referencias y textos que han ido mereciendo mi atenci&oacute;n en los &uacute;ltimos meses (los entrecomillados son citas textuales tomadas de los sitios referenciados):</p> <h3>Art&iacute;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&oacute;n del autor) utilizar el lenguaje de programaci&oacute;n l&oacute;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&oacute;n utilizando Visual Prolog 6.0</a> (R. Fuentes Covarrubias, Universidad de Colima, Facultad de Ingenier&iacute;a Mec&aacute;nica y El&eacute;ctrica, M&eacute;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&aacute;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&oacute;gica, Matem&aacute;tica, Deducci&oacute;n Autom&aacute;tica</a> (Manuel Ojeda Aciego, Dept. Matem&aacute;tica Aplicada, Universidad de M&aacute;laga; en <acronym title="Portable Document Format" lang="en">PDF</acronym>): "Presentamos una breve perspectiva hist&oacute;rica del desarrollo en paralelo y, a veces, entrelazado, de la L&oacute;gica y las Matem&aacute;ticas, con el objetivo final de presentar la L&oacute;gica Computacional y, en particular, la Deducci&oacute;n Autom&aacute;tica, como un &aacute;rea de investigaci&oacute;n matem&aacute;tica de extraordinario potencial pr&aacute;ctico, no en balde distintos autores de conocido prestigio afirman que la L&oacute;gica es a la Computaci&oacute;n como el C&aacute;lculo Infinitesimal es a la F&iacute;sica.".</li> </ul> <h3>P&aacute;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&oacute;dulos concebidos para ayudar a los estudiantes de L&oacute;gica, implementados en lenguaje Prolog. Actualmente son los siguientes: TT: construcci&oacute;n de tablas de verdad para L&oacute;gica proposicional. Incluye adem&aacute;s dos predicados para determinar una f&oacute;rmula como v&aacute;lida, satisfactible, o insatisfactible, y un razonamiento como correcto o incorrecto; ND: construcci&oacute;n de demostraciones de deducci&oacute;n natural; CNF: convierte f&oacute;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&oacute;n de Informaci&oacute;n Web</a> (Adriana Colino Tom&eacute;; v&iacute;a <a href="http://irsweb.blogspot.com/">Recuperaci&oacute;n de Informaci&oacute;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&aacute;cticas de las Redes Neuronales Artificiales (RNA), es la clasificaci&oacute;n de datos, entendida &eacute;sta como un proceso de b&uacute;squeda de propiedades comunes a una serie de objetos de un dominio del conocimiento, en funci&oacute;n de los valores de determinados atributos. Dentro de la cuesti&oacute;n de la clasificaci&oacute;n autom&aacute;tica, en tanto que proceso subsidiario de procesos m&aacute;s generales englobados dentro de lo que se conoce como "machine learning", uno de los algoritmos de aprendizaje autom&aacute;tico m&aacute;s conocidos, basado en "ejemplos", es el denominado ID3, o "Iterative Dichotomizer (version) 3" (J.R. Quinlan, 1979). Trabaja con datos simb&oacute;licos, en contraposici&oacute;n a los datos num&eacute;ricos, y se basa en la obtenci&oacute;n de un &aacute;rbol de decisi&oacute;n <a name="ref_arboles"></a>(<a href="#arboles">ver anexo</a>), a partir del cual se obtienen una serie de reglas de producci&oacute;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&oacute;n a dicho dominio). El &aacute;rbol de decisi&oacute;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&iacute;a las clasificaciones de datos basadas en &aacute;rboles de decisi&oacute;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&iacute;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&oacute;n conceptual superior, en el denominado "machine learning" o aprendizaje de m&aacute;quina, es posible diferenciar dos tipos de aprendizaje: <em>aprendizaje memor&iacute;stico</em> (o aprendizaje de memoria) y <em>aprendizaje cognoscitivo</em>. El primero hace referencia a procesos de memorizaci&oacute;n de a) hechos y b) secuencias o procedimientos de acciones, siendo el tipo de aprendizaje m&aacute;s f&aacute;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&aacute;sico, de forma que sea posible la obtenci&oacute;n de "descripciones de clase", generalizaciones que se obtienen de la observaci&oacute;n de ejemplos concretos. Es por tanto un tipo de aprendizaje basado en un razonamiento de car&aacute;cter inductivo, aquel que permite la formulaci&oacute;n de principios generales, a partir de casos espec&iacute;ficos individuales, a diferencia del razonamiento deductivo, que a partir de generalizaciones, y por medio de la l&oacute;gica (silogismos), infiere conclusiones de car&aacute;cter particular y concreto. En el razonamiento inductivo, es la acumulaci&oacute;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&aacute;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&aacute;n posteriormente para la obtenci&oacute;n de conclusiones particulares a trav&eacute;s de un proceso de razonamiento deductivo.</p> <p>Los &aacute;rboles de decisi&oacute;n o clasificaci&oacute;n consisten en una t&eacute;cnica de car&aacute;cter inductivo muy utilizada en el &aacute;mbito del aprendizaje autom&aacute;tico. Gr&aacute;ficamente, est&aacute;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&eacute;s de una rama que parte del nodo en cuesti&oacute;n. Los casos son dirigidos hacia una u otra rama en funci&oacute;n de los valores de sus atributos. Los &aacute;rboles de clasificaci&oacute;n son un m&eacute;todo de aprendizaje v&aacute;lido en aquellas situaciones en las cuales los ejemplos de partida se pueden representar mediante un conjunto finito de atributos y valores. Los &aacute;rboles de clasificaci&oacute;n tambi&eacute;n se pueden concebir, desde un punto de vista algor&iacute;tmico, como un conjunto de reglas <em>if-then</em>.</p> <p>El car&aacute;cter de los &aacute;rboles de decisi&oacute;n es jer&aacute;rquico, por lo que solo son capaces de representar conocimiento jer&aacute;rquico, la mayor parte del mismo. Por otro lado, su construcci&oacute;n tienen un car&aacute;cter recursivo y descendente, de los conceptos generales a los particulares, raz&oacute;n por la cual el acr&oacute;nimo TDIDT (Top-Down Induction on Decision Trees) es utilizado para referirse a los algoritmos de construcci&oacute;n de &aacute;rboles de decisi&oacute;n, como es el caso del algoritmo <acronym title="Iterative Dichotomizer (version) 3" lang="en">ID3</acronym> de Quinlan.</p> <p>La mayor&iacute;a de las heur&iacute;sticas utilizadas para la determinaci&oacute;n de &aacute;rboles de decisi&oacute;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&iacute;a matem&aacute;tica de la informaci&oacute;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&iacute;sticas son criterios, m&eacute;todos o principios, que permiten decidir, de entre varias alternativas de acci&oacute;n, cu&aacute;l ser&aacute; la m&aacute;s efectiva para cumplir determinada meta. Permiten restringir el n&uacute;mero de evaluaciones, y en consecuencia repercuten en una mejora de los tiempos de b&uacute;squeda de soluciones. Entrop&iacute;a y cantidad de informaci&oacute;n son dos conceptos que se dan la mano en el campo de las heur&iacute;sticas. Sobre Entrop&iacute;a y cantidad de informaci&oacute;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&aacute;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&oacute;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 />&nbsp;&nbsp; arbol1 &lt;-- nodo etiquetado con C <br />SiNo <br />&nbsp;&nbsp; Si a = f, entonces <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C &lt;-- clase mayoritaria de los ejemplos de E <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arbol1 &lt;-- nodo etiquetado con C <br />&nbsp;&nbsp; SiNo <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A &lt;-- mejor atributo de a <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arbol1 &lt;-- nodo etiquetado con A <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Para cada v perteneciente a los valores de A, hacer <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EAv &lt;-- los ejemplos de E que tienen el valor v para el atributo A <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Si EAv = f, entonces <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arbol2 &lt;-- nodo etiquetado con la clase mayoritaria en E <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SiNo <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arbol2 &lt;-- ID3(EAv , a-{A}) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arbol1 &lt;-- a&ntilde;adir a arbol1 el arbol2, a trav&eacute;s de una rama etiquetada con v <br />Devolver arbol1</p> <p>Otra representaci&oacute;n en pseudoc&oacute;digo del algoritmo <acronym title="Iterative Dichotomizer (version) 3" lang="en">ID3</acronym>:</p> <p class="codigo">Aprendizaje-&Aacute;rbol-Decisi&oacute;n(<em>Ejemplos</em>, <em>Atributos</em>, <em>Default</em>) <br />&nbsp;&nbsp; retorna un &aacute;rbol de decisi&oacute;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&oacute;n, <br />&nbsp;&nbsp; <strong>retornar</strong> la clasificaci&oacute;n, <br /><strong>ELSE IF</strong> <em>Atributo</em>s = vac&iacute;o, <strong>retornar</strong> Mayor&iacute;a(<em>Ejemplos</em>) <br /><strong>ELSE</strong> <br />&nbsp;&nbsp; mejor-atr &lt;-- elegir-atributo(<em>Atributos</em>, <em>Ejemplos</em>) <br />&nbsp;&nbsp; &aacute;rbol &lt;-- nuevo &aacute;rbol de decisi&oacute;n con ra&iacute;z en mejor-atr <br />&nbsp;&nbsp; <strong>FOR EACH</strong> valor v[i] de mejor-atr <strong>DO</strong> <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <em>Ejemplos</em>[i] &lt;-- {elementos de <em>Ejemplos</em> con mejor-atr = v[i]} <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; subar &lt;-- Aprendizaje-&Aacute;rbol-Decisi&oacute;n(ejemplos[i], <em>Atributos</em> - mejor-atr, Mayor&iacute;a(<em>Ejemplos</em>)) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; agregar rama al &aacute;rbol con etiqueta v[i] y sub&aacute;rbol subar <br />&nbsp;&nbsp; <strong>OD</strong> <br /><strong>retornar</strong> &aacute;rbol</p> <p>Los procesos de aprendizaje, que hacen uso de la clasificaci&oacute;n de datos, mediante el descubrimiento de patrones, se utilizan con profusi&oacute;n dentro de lo que se conoce como "Data Mining", en castellano miner&iacute;a de datos, explotaci&oacute;n de datos, o descubrimiento de conocimiento en bases de datos, diversidad terminol&oacute;gica en torno a la cual existe una cierta pol&eacute;mica.</p> <p>Maximiliano del Rio es autor de una versi&oacute;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&oacute;n (<a href="http://www.programacion.com/codigo/65/">librer&iacute;a Clasif</a>) se pueden localizar bien en la secci&oacute;n de <a href="http://www.programacion.com/codigo/">c&oacute;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&oacute;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&oacute;n. Se adjunta adem&aacute;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&aacute;fica mediante la utilizaci&oacute;n de la librer&iacute;a nativa <a href="http://www.swi-prolog.org/graphics.html" lang="en">XPCE</a>.</p> <blockquote> "[...] programa que utiliza la librer&iacute;a anterior [...] Ayuda a generar las reglas y muestra las reglas obtenidas textual y gr&aacute;ficamente; tambi&eacute;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&aacute;fica se abre lanzando el objetivo "?- main." en la l&iacute;nea de &oacute;rdenes de SWI-Prolog, una vez compilado el programa. Finalmente, la librer&iacute;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&oacute;n bastante amplia sobre la implementaci&oacute;n en lenguaje Prolog de procesos de aprendizaje autom&aacute;tico en general, y aprendizaje inductivo mediante &aacute;rboles de decisi&oacute;n en particular (clasificaci&oacute;n de datos), es muy recomendable la lectura del cap&iacute;tulo 18, "Machine Learning", de la (ya cl&aacute;sica) obra de Ivan Bratko "Prolog: Programming for Artificial Intelligence" (2&ordf; ed. Addison-Wesley, 1994; ISBN: 0-201-41606-9). Sobre &aacute;rboles de decisi&oacute;n trata concretamente el punto 18.6, "Induction of decision trees".</p> <p>Existe as&iacute; mismo un repositorio de algoritmos de aprendizaje autom&aacute;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&iacute;, ya que la &uacute;ltima actualizaci&oacute;n parece datar del a&ntilde;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&eacute;cnica de Berl&iacute;n</a>). Los programas est&aacute;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&aacute;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&aacute;s informaci&oacute;n).</p> <p>M&aacute;s informaci&oacute;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&aacute;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&aacute;sicos del Aprendizaje Simb&oacute;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&eacute;todo alternativo para la construcci&oacute;n de &aacute;rboles de decisi&oacute;n</a> (F. Berzal Galiano; en PDF).</li> <li> <a href="http://elvex.ugr.es/etexts/spanish/PhD/">ART: Un m&eacute;todo alternativo para la construcci&oacute;n de &aacute;rboles de decisi&oacute;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&oacute;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&oacute;n</a>; en cada uno de los directorios existen tres archivos, "0.html", "0.doc" y "readme.txt", que contienen la descripci&oacute;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">&Aacute;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">&Aacute;rboles de Clasificaci&oacute;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&eacute;todos Matem&aacute;ticos en Ciencias de la Computaci&oacute;n</a>", <acronym title="Universidad del Pa&iacute;s Vasco">UPV</acronym>).</li> <li> <a href="http://ciberconta.unizar.es/Biblioteca/0007/arboles.html">Sistemas de Inducci&oacute;n de &aacute;rboles de decisi&oacute;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&oacute;n de Conocimiento con Incertidumbre en Bases de Datos Relacionales Borrosas</a></em> (A. J. G&oacute;mez Flechoso, 1998). En relaci&oacute;n con los temas tratados en este "post", ver el <a href="http://www.gsi.dit.upm.es/~anto/tesis/html/stateart.html">cap&iacute;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&oacute;n), <a href="http://www.gsi.dit.upm.es/~anto/tesis/html/stateart.html#pgfId=151149">2.2</a> (Descubrimiento de conocimiento y miner&iacute;a de datos), <a href="http://www.gsi.dit.upm.es/~anto/tesis/html/stateart.html#pgfId=151014">2.3</a> (M&eacute;todos aplicados de miner&iacute;a de datos), y <a href="http://www.gsi.dit.upm.es/~anto/tesis/html/stateart.html#pgfId=152999">2.4</a> (Programaci&oacute;n L&oacute;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 - &Aacute;rboles de decisi&oacute;n</h3> <p>Los &aacute;rboles de decisi&oacute;n son una representaci&oacute;n de los procesos involucrados en las tareas de clasificaci&oacute;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 &aacute;rboles de decisi&oacute;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&oacute;n objetivo toma valores discretos.</li> <li> Podemos tomar hip&oacute;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&oacute;n de &Aacute;rboles de Decisi&oacute;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&oacute;n, la m&aacute;s directamente relacionada con el enunciado del t&iacute;tulo, ya fue publicada en mi bit&aacute;cora hermana, <a href="http://vistoyleido.blogspot.com/">Visto y Le&iacute;do</a>, el <a href="http://vistoyleido.blogspot.com/2004_01_01_vistoyleido_archive.html#107421541775470787">16/01/2004</a>, bajo el mismo t&iacute;tulo. Al apuntar posteriormente alg&uacute;n enlace en el que se trata de la aplicaci&oacute;n de la programaci&oacute;n l&oacute;gica en general, y Prolog en particular, a los acertijos de ingenio y los juegos l&oacute;gicos, he ido a&ntilde;adiendo otras cuestiones estrictamente relacionadas con dicho lenguaje de programaci&oacute;n, particularmente relativas a su origen, evoluci&oacute;n y algunas de sus versiones desarrolladas a lo largo del tiempo con m&aacute;s o menos fortuna y permanencia posterior.</p> <p>En el libro "Ayudando a la memoria. T&eacute;cnicas y trucos para recordar" (Plaza &amp; Janes, 2001; ISBN: 84-8450-527-8) su autor, Josep M&ordf; Albaig&egrave;s, incluye, como complemento imprescindible a la excelente descripci&oacute;n que se aborda en el libro respecto de los procesos de retenci&oacute;n, memoria, y t&eacute;cnicas de recuperaci&oacute;n o recuerdo de lo memorizado, un curioso "Diccionario de Mnemotecnias", en el que se recogen, ordenados alfab&eacute;ticamente en relaci&oacute;n con la cuesti&oacute;n a la que hacen referencia, toda clase de recursos mnemot&eacute;cnicos (de <em>mnemo</em> + <em>tecnia</em>, aquellos que sirven para auxiliar a la memoria), algunos de cierta complejidad y otros m&aacute;s asequibles, referidos a aspectos muy variados. En este mismo diccionario se encuentra la siguiente definici&oacute;n:</p> <blockquote> <p>"Llamamos mnemotecnia a cualquier truco o procedimiento abreviado que permite recordar, de forma m&aacute;s o menos provisional, una cosa concreta y en general breve."</p> <div class="cita">En "Ayudando a la memoria...", p&aacute;gina 95</div> </blockquote> <p>Me quedo para esta ocasi&oacute;n con dos curiosidades referidas al universo de las clasificaciones, entendidas &eacute;stas en sentido amplio (cito textualmente):</p> <blockquote> <p><strong>Clasificaci&oacute;n decimal en bibliotecas</strong><br /> Las tem&aacute;ticas de la clasificaci&oacute;n decimal suelen ser: 0. Obras Generales - 1. Filosof&iacute;a - 2. Religi&oacute;n - 3. Ciencias Sociales - 4. Lengua - 5. Ciencias Puras - 6. Tecnolog&iacute;a - 7. Arte - 8. Literatura - 9. Historia. Que se recuerdan con la frase: "Generales: &iexcl;filosofad religiosamente! Socios: &iexcl;hablad puramente! T&eacute;cnicos y artistas: &iexcl;escribid hist&oacute;ricamente!".</p> <p><strong>Taxonom&iacute;a</strong><br /> La clasificaci&oacute;n de las especies naturales comprende los siguientes escalones: Reino - Tipo - Clase - Orden - Familia - G&eacute;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&eacute;n muy curiosa la descripci&oacute;n menot&eacute;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&aacute;sticos los clasificaron), del n&uacute;mero <em>pi</em>, y de varios principios o teoremas fundamentales de la f&iacute;sica y la estad&iacute;stica, entre otros, pero dada la relativamente amplia extensi&oacute;n de los textos en cuesti&oacute;n, me remito a la consulta y lectura del libro referenciado, caso de interesar este tema.</p> <p>La l&oacute;gica silog&iacute;stica o <em>aristot&eacute;lica</em> trata de determinar la verdad o falsedad de determinado argumento filos&oacute;fico, mediante el contraste de proposiciones o <em>premisas</em>, y en cierto sentido puede ser considerada como una formalizaci&oacute;n, basada en expresiones del lenguaje natural, del sentido com&uacute;n. La utilizaci&oacute;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&aacute;sticos</a> se entiende dada la integraci&oacute;n de la filosof&iacute;a de Arist&oacute;teles en la dogm&aacute;tica cristiana, caracter&iacute;stica de la tarea de reflexi&oacute;n desarrollada por este grupo de pensadores de la Filosof&iacute;a occidental entre mediados del siglo XI y mediados del siglo XV, aproximadamente.</p> <p>Josep M&ordf; Albaig&egrave;s es tambi&eacute;n editor de la revista <a href="http://www.mensa.es/carrollia/">Carrollia</a>,</p> <blockquote> <p>"[...] &oacute;rgano de comunicaci&oacute;n [...] de <a href="http://www.mensa.es/">Mensa Espa&ntilde;a</a>, que se dedica a las Matem&aacute;ticas recreativas, la Ling&uuml;&iacute;stica, la Literatura Experimental, la L&oacute;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 &uacute;ltimos a&ntilde;os est&aacute;n disponibles en formato <acronym title="Portable Document Format" lang="en">PDF</acronym>. Tambi&eacute;n es muy recomendable, si se est&aacute; interesado por estos temas, la "<a href="http://www.juegosmensa.com/">Colecci&oacute;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&aacute;ginas de Carrollia. En otro orden de "utilidad" pr&aacute;ctica, el "<a href="http://www.mensa.es/carrollia/listabofci.htm">Bolet&iacute;n Oficial de la Facultad de Ciencias In&uacute;tiles</a>" (BOFCI) es otra publicaci&oacute;n del Club Mensa cuya lectura conviene no perderse...</p> <p>Y ya que hablamos, al menos tangencialmente, de juegos l&oacute;gicos y de ingenio, mencionar dos bit&aacute;coras en lengua castellana dedicadas de forma monogr&aacute;fica a estos asuntos: <a href="http://www.geocities.com/juegosdeingenio/">Juegos de Ingenio &amp; Acertijos</a> y <a href="http://www.markelo.f2o.org/">Peque&ntilde;os Enigmas</a>. En este &uacute;ltimo sitio se localizan un buen n&uacute;mero de enlaces que llevan a otras p&aacute;ginas de tem&aacute;tica af&iacute;n (ver el apartado "Buenas p&aacute;ginas de ingenio").</p> <p>Enlazando la cuesti&oacute;n planteada inicialmente con la utilizaci&oacute;n de la programaci&oacute;n l&oacute;gica en general, y el lenguaje Prolog en particular, en la resoluci&oacute;n de acertijos y juegos l&oacute;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&aacute;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&oacute;gica. Su capacidad para manejar expresiones simb&oacute;licas le permite codificar f&aacute;cilmente cierto tipo de informaci&oacute;n que en los lenguajes procedurales es muy dif&iacute;cil de manejar. La programaci&oacute;n l&oacute;gica permite traducir en l&iacute;neas de c&oacute;digo descripciones de hechos e implicaciones, lo que en principio permite codificar l&iacute;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&aacute;n escritos en notaci&oacute;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&aacute;ndar de facto por el denominado "Prolog de Edimburgo", tal y como se explica en un ap&eacute;ndice al final del documento (Ap&eacute;ndice II - Diferencias entre Micro-Prolog y la notaci&oacute;n de Edimburgo), si bien la sem&aacute;ntica de ejecuci&oacute;n es id&eacute;ntica en ambos casos. La l&oacute;gica subyacente en los ejemplos expuestos es en cualquier caso plenamente v&aacute;lida, independientemente de la notaci&oacute;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&oacute;n Funcional y L&oacute;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&eacute;n otros interesantes documentos y trabajos sobre diversos aspectos de la programaci&oacute;n l&oacute;gica, localizables <a href="http://www.unlu.edu.ar/~gpfl/wwwunlu.htm#Publicaciones">en la p&aacute;gina web</a> de dicho grupo (tengan paciencia con las descargas, el servidor es bastante lento, y se demoran un cierto tiempo). La utilizaci&oacute;n de la notaci&oacute;n de Micro-Prolog en los trabajos de este grupo, se explica en raz&oacute;n de que sus miembros han desarrollado un int&eacute;rprete para Prolog, <a href="http://www.unlu.edu.ar/~gpfl/edulog/wwwunlu.htm">Edulog</a>, orientado hacia fines educativos y la utilizaci&oacute;n en sus cursos y seminarios, que precisamente hace uso de la notaci&oacute;n que venimos comentando. El proyecto parece estar paralizado, al menos en su forma de comunicaci&oacute;n p&uacute;blica, ya que las p&aacute;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&aacute;gina de la asignatura "<a href="http://www.unlu.edu.ar/~gpfl/F&Lhome.htm">Programaci&oacute;n Funcional y L&oacute;gica</a>", si bien el archivo de descarga est&aacute; protegido por contrase&ntilde;a. Supongo que poni&eacute;ndose en contacto con los responsables del proyecto, y exponi&eacute;ndoles las razones por las que se quiere acceder a su uso, no habr&aacute; ning&uacute;n problema en conseguir la clave correspondiente.</p> <p>La notaci&oacute;n implementada por Micro-Prolog es m&aacute;s limitada y menos flexible que la propia del est&aacute;ndar de Edimburgo: as&iacute; por ejemplo, los posibles nombres de variables est&aacute;n muy restringidos, y el int&eacute;rprete se conformar&aacute; con la primera soluci&oacute;n que satisfaga el objetivo planteado, en contraposici&oacute;n a lo habitual en los int&eacute;rpretes actuales basados en el Prolog est&aacute;ndar, que es tratar de proporcionar todas las posibles soluciones hasta agotar la base de conocimientos del programa y las posibilidades de unificaci&oacute;n de las variables en juego. Otras diferencias se refieren a la utilizaci&oacute;n, por parte de Micro-Prolog, de predicados predefinidos de car&aacute;cter particular.</p> <p>Las diferencias b&aacute;sicas entre ambos tipos de notaciones est&aacute;n perfectamente explicadas, con ejemplos, en el documento "<a href="http://www.unlu.edu.ar/~gpfl/F&Lhome.htm#Bibliografia">Diferencias entre la notaci&oacute;n de Micro Prolog y la de Edimburgo</a>" que encontramos en la p&aacute;gina de la asignatura mencionada, si bien el archivo comprimido que sirve como medio de descarga al original en formato Word, est&aacute; tambi&eacute;n protegido por contrase&ntilde;a, por lo que de nuevo se hace necesario ponerse en contacto con sus autores con el fin de obtener la pertinente autorizaci&oacute;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&oacute;n con los par&aacute;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&eacute;rprete <a href="http://www.lpa.co.uk/dow_fre.htm" lang="en">LPA Prolog Professional</a> soporta la notaci&oacute;n Micro-Prolog, aunque hay que advertir que se trata de un "dialecto" completamente en desuso, dadas sus evidentes limitaciones, siendo la notaci&oacute;n del est&aacute;ndar de Edimburgo (tambi&eacute;n conocida como sintaxis DECsystem-10) la m&aacute;s extendida, y por tanto la empleada en la pr&aacute;ctica totalidad de las implementaciones actuales de int&eacute;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&eacute;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&oacute;n en Prolog" (Gustavo Gili, 1993; ISBN: 84-252-1339-8), dedican un apartado completo, "Ap&eacute;ndice E - Micro-Prolog", a la explicaci&oacute;n de la sintaxis implementada por Micro-Prolog:</p> <blockquote> <p>"La sintaxis de Micro-Prolog es bastante diferente [...] La idea b&aacute;sica es que s&oacute;lo existe un tipo de t&eacute;rmino: la lista. Si queremos construir el &laquo;t&eacute;rmino&raquo; 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&iacute;, lo que en la sintaxis de nuestro &laquo;n&uacute;cleo&raquo; se escribir&iacute;a: <strong>f(a,g(2,3),c)</strong> se escribir&iacute;a en Micro-Prolog: <strong>(f (g 2 3) c)</strong>. Aqu&iacute; tambi&eacute;n vemos la sintaxis diferente para listas, en donde las listas van entre par&eacute;ntesis, con sus elementos separados por espacios.</p> <p>Las cl&aacute;usulas se representan como listas de t&eacute;rminos, en los que el primero es la cabeza de la cl&aacute;usula, y el resto son objetivos, que tomados como una conjunci&oacute;n, forman el cuerpo. He aqu&iacute; una cl&aacute;usula m&aacute;s complicada [...]:</p> <p class="codigo"> ((alterar (z1|z2) (x|y)) <br />&nbsp;&nbsp;&nbsp;&nbsp; (cambiar z1 x) <br />&nbsp;&nbsp;&nbsp;&nbsp; (altera z2 y) <br />) </p> <p>Esto es la segunda cl&aacute;usula de [el predicado] <strong>alterar</strong> de la secci&oacute;n 3.4. [...]</p> <p class="codigo"> alterar([H|T],[X|Y]):- cambiar(H,X), alterar(T,Y). </p> <p>[...] Los nombres y prop&oacute;sitos de los predicados predefinidos var&iacute;an considerablemente de los que se han visto a lo largo de este libro [...]"</p> <div class="cita">En <em>Programaci&oacute;n en Prolog</em>, Ap&eacute;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&aacute;usulas</em>, <em>predicados</em>, <em>base de datos</em> y <em>objetivos</em>. La explicaci&oacute;n, tanto sobre la sintaxis de Micro-Prolog, como sobre otros aspectos generales de este dialecto (predicados predefinidos particulares, facilidades para la depuraci&oacute;n del c&oacute;digo, etc.), tiene cierta extensi&oacute;n, por lo que me remito a la obra referenciada para obtener m&aacute;s informaci&oacute;n al respecto, y en particular, adem&aacute;s de al referido Ap&eacute;ndice E, a los ap&eacute;ndices "C - Diferentes versiones de Prolog" (ofrece una breve visi&oacute;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&oacute;lica de Lovaina</a>, B&eacute;lgica, <abbr title="Departamento"><a href="http://www.info.ucl.ac.be/" lang="en">Dpto.</abbr> de Ingenier&iacute;a Inform&aacute;tica</a>), una de las figuras m&aacute;s destacadas en el mundo de la programaci&oacute;n l&oacute;gica, es autor de un art&iacute;culo, de lectura m&aacute;s que recomendable, referido a la evoluci&oacute;n del lenguaje Prolog en la d&eacute;cada que transcurre a partir de la aparici&oacute;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&oacute;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&oacute;n de la M&aacute;quina Abstracta de Warren o <acronym title="Warren Abstract Machine" lang="en">WAM</acronym> (David H.D. Warren, 1983) supuso un punto de inflexi&oacute;n en la evoluci&oacute;n del lenguaje Prolog, por cuanto comportaba la definici&oacute;n de un conjunto de instrucciones de alto nivel y un modelo de ejecuci&oacute;n para este lenguaje, y la materializaci&oacute;n de la <a href="http://www.clip.dia.fi.upm.es/~vocal/public_info/">programaci&oacute;n l&oacute;gica con restricciones</a> (Constraint Logic Programming, CLP). Supone la base, adoptada como est&aacute;ndar de facto, para la implementaci&oacute;n de int&eacute;rpretes portables para el lenguaje Prolog, convirti&eacute;ndolo en un lenguaje multiprop&oacute;sito con caracter&iacute;sticas similares a las de los lenguajes compilados de car&aacute;cter procedimental, en lo que alos tiempos de ejecuci&oacute;n se refiere. As&iacute;, en el sitio web del int&eacute;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 &amp; 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 &amp; 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&oacute;n de esta m&aacute;quina virtual, dentro del n&uacute;cleo del int&eacute;rprete, es compilar las instrucciones escritas en lenguaje de alto nivel a instrucciones en lenguaje m&aacute;quina, de forma similar a como lo hace la m&aacute;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&oacute;n, aun cuando los programas se sigan guardando y ejecutando desde archivos que contienen c&oacute;digo escrito en lenguaje de alto nivel. De manera general, una m&aacute;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&oacute;n interpretado de Prolog [...] la eficiencia, en cuanto a velocidad de ejecuci&oacute;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&oacute;n con la sem&aacute;ntica de Prolog, por lo que la mayor&iacute;a de los compiladores de Prolog [...] realizan una compilaci&oacute;n a un lenguaje intermedio en vez de hacerlo directamente a lenguaje m&aacute;quina. El lenguaje m&aacute;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&aacute;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&aacute;quina.</p> <p>Antes del trabajo de Warren sobre la compilaci&oacute;n de la inferencia en Prolog, la programaci&oacute;n l&oacute;gica resultaba excesivamente lenta para su uso generalizado. Los compiladores dise&ntilde;ados por Warren y otros permitieron a Prolog alcanzar velocidades adecuadas [...] En fechas m&aacute;s recientes, la aplicaci&oacute;n de la moderna tecnolog&iacute;a de compilaci&oacute;n [...] ha permitido a Prolog alcanzar velocidades tan &oacute;ptimas que lo hace competir con C en cuanto a diversos aspectos est&aacute;ndar [...]. [...] el hecho de poder escribir un planificador o un analizador de lenguaje natural en unas cuantas decenas de l&iacute;neas de Prolog, hacen que &eacute;ste sea m&aacute;s preferible que C en la realizaci&oacute;n de los prototipos de gran parte de los proyectos de investigaci&oacute;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&aacute;gina citada)</div> </blockquote> <p>M&aacute;s informaci&oacute;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&iuml;t-Kaci; The MIT Press, Cambridge, MA, 1991).</p> <p>En el siguiente trabajo se describe el sistema y la notaci&oacute;n DECsystem-10 Prolog, en la que se basa el est&aacute;ndar de Edimburgo, que recordemos es de facto el sistema Prolog est&aacute;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&oacute;n del mismo si se abre con <acronym title="MicroSoft" lang="en">MS</acronym> Word. Tambi&eacute;n: <a href="http://www.cs.uah.edu/~thinke/Prolog/prolog.html">versi&oacute;n en HTML</a>, y <a href="http://proton.ucting.udg.mx/tutorial/prolog/index.htm">traducci&oacute;n al castellano</a> de este manual, limitada a los tres primeros cap&iacute;tulos.</p> <p>El DECsystem-10 Prolog fue una implementaci&oacute;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&aacute;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&aacute;ndar o sintaxis de Edimburgo.</p> <p>Las iniciales DECsystem-10 hacen referencia al sistema inform&aacute;tico sobre el que se bas&oacute; la implementaci&oacute;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&ntilde;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&aacute;lculo (y todo sea dicho, por dificultad de manejo y operaci&oacute;n), en la escala de los grandes equipos inform&aacute;ticos conocidos como "mainframes". No es infrecuente encontrar, en gu&iacute;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&oacute;n DECsystem-10 Prolog), referencias a TOPS-20, evoluci&oacute;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&eacute;rprete-compilador para Prolog se cre&oacute;, en 1983, uno de los primeros int&eacute;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&oacute; a consolidar el est&aacute;ndar de Edimburgo, como referencia para posteriores implementaciones.</p> <p>Para finalizar esta anotaci&oacute;n, mencionar el ejemplo de aplicaci&oacute;n pr&aacute;ctica del lenguaje Prolog a la resoluci&oacute;n de juegos y acertijos l&oacute;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&iacute;tulo indica, en este texto se explica el fundamento te&oacute;rico y el funcionamiento de un programa dise&ntilde;ado para efectuar la b&uacute;squeda de los mejores m&eacute;todos posibles de resoluci&oacute;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&aacute;n escritos originalmente para ser ejecutados bajo el int&eacute;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&oacute;n y <a href="http://www.arity.com/www.pl/products/appreds.htm" lang="en">predicados</a> del est&aacute;ndar de Edimburgo, el programa en principio deber&iacute;a tambi&eacute;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&uacute;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&eacute;todo de b&uacute;squeda "breadth-first search" o "b&uacute;squeda primero en anchura" (<a href="http://www.sju.edu/~jhodgson/ai/bfs.html" lang="en">ejemplo</a>), que eval&uacute;a cada nodo del mismo nivel, dentro del &aacute;rbol de b&uacute;squeda (entendiendo por tal la representaci&oacute;n en forma de grafo dirigido -los nodos que lo forman est&aacute;n conectados mediante flechas que indican la direcci&oacute;n del movimiento- de un determinado problema de b&uacute;squeda), antes de continuar el proceso en el siguiente nivel de profundidad. En contraposici&oacute;n a este m&eacute;todo se sit&uacute;a la b&uacute;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 &aacute;rbol hasta llegar al "nodo terminal", antes de proceder a la b&uacute;squeda por otro camino. Este es precisamente el tipo de b&uacute;squeda "interna" por defecto que lleva a cabo el lenguaje Prolog (b&uacute;squeda en profundidad y de izquierda a derecha en un &aacute;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&aacute;sicos de algoritmos de b&uacute;squeda mencionados (existen otros muchos), se les pueden a&ntilde;adir eventualmente m&eacute;todos heur&iacute;sticos de evaluaci&oacute;n, consistentes en reglas capaces de valorar si, en base a determinado tipo de informaci&oacute;n previa, la b&uacute;squeda est&aacute; siguiendo el camino correcto, para de esta forma aumentar la probabilidad de dar con la soluci&oacute;n correcta. Los m&eacute;todos heur&iacute;sticos tratan de aplicar dos criterios de b&uacute;squeda: a) elecci&oacute;n de los caminos que es posible que fallen con mayor probabilidad, para de esta forma "podar" el espacio de b&uacute;squeda y as&iacute; reducir su tama&ntilde;o, o bien b) comprobaci&oacute;n, en primer lugar, de los caminos con mayor probabilidad de &eacute;xito. Las b&uacute;squedas heur&iacute;sticas son por tanto b&uacute;squedas basadas en la experiencia. La adici&oacute;n de capacidades heur&iacute;sticas a los m&eacute;todos de b&uacute;squeda "breadth-first", da lugar a los algoritmos "best-first search", como el A* utilizado en el programa aplicado a la resoluci&oacute;n de los estados del Cubo de Rubik.</p> <p>Estos tres tipos b&aacute;sicos de algoritmos de b&uacute;squeda, as&iacute; como los conceptos y teoremas b&aacute;sicos de la Teor&iacute;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&oacute;n y conocimiento de sus mecanismos de funcionamiento, se describen ampliamente en los cap&iacute;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&oacute;n de los m&eacute;todos y algoritmos utilizados en espacios de b&uacute;squeda (definidos &eacute;stos por el conjunto de todos los nodos de un grafo dirigido). Desafortunadamente, en la versi&oacute;n electr&oacute;nica de este libro se pierden gran parte de las figuras y esquemas del original impreso, lo cual dificulta la comprensi&oacute;n de estas cuestiones, que de por si tienen cierta complejidad.</p> <p>M&aacute;s informaci&oacute;n:</p> <ul class="conmargeninf"> <li> "<a href="http://www.dccia.ua.es/~faraon/docs/juegos.pdf">Los Juegos como Herramienta Docente. Formalizaci&oacute;n de Juegos L&oacute;gicos en Prolog</a>" (<a href="http://www.dccia.ua.es/~faraon/principal.htm">F. Llorens</a>, M&ord