Articulo orginal por https://nautilus.cs.miyazaki-u.ac.jp/~skata/MagicHaskeller.html
Susumu Katayama, Universidad de Miyazaki
(El alumno de refuerzo galardonado que utiliza MagicHaskeller se encuentra al final de esta página).
¡Úsalo ahora!
Especifique una función f escribiendo un predicado como una expresión con valor booleano. Obtendrá funciones que generalizan la especificación.
Ejemplos
f "abcde" 2 == "aabbccddee" | |
f [(+3), (4-)] 5 == [8, -1] | |
f ["ABCDE", "DF","1234", ""] == ["", "DF","1234","ABCDE"] | |
f [3, 4, 5.6] ~= 4.2 | |
f [1/2, 1/3] ~= [1, sqrt 3 / 2] |
Consejos
- Puede usar cualquier expresión de Haskell que devuelva un valor booleano, siempre que no use expresiones let ni cláusulas while. Puede usar funciones de Prelude y algunas otras funciones. También puede usar el operador (~=), que funciona como "casi igual" para Doubles y contenedores que contienen Doubles, y como (==) para otros tipos.
- Todas las funciones impresas son semánticamente diferentes entre sí: en otras palabras, cada función recién generada no se imprimirá hasta que su diferencia con todas las funciones existentes se pruebe mediante pruebas aleatorias. Hasta entonces, se suministran cada vez más números aleatorios. (Tenga en cuenta que la diferencia se puede 'probar' mediante pruebas aleatorias, mientras que la equivalencia solo se puede 'adivinar'. Consulte el artículo de PRICAI 2008 en mi página principal.)
- Si envía una expresión que no incluye f, verá los resultados de aplicar algunos argumentos aleatorios. Se supone que esto es útil para comprender la expresión. Además, esto significa que si envía una expresión nula, simplemente se evaluará.
- Se puede obtener un efecto similar haciendo clic en el botón EXEMPLIFY a la izquierda de las expresiones resultantes, pero luego, los valores de retorno se encuentran en cuadros de texto. Si cree que algún valor de retorno es diferente de su expectativa, puede corregirlo y volver a buscar haciendo clic NARROW SEARCH en el botón.
(Por lo tanto, una forma sencilla de utilizar esta herramienta web es comenzar con un solo predicado de ejemplo, verificar los valores de retorno de algunos argumentos y luego refinar la búsqueda hasta que esté satisfecho con el resultado).
- La autocorrección funciona hasta cierto punto. Al sintetizar expresiones, "=" y "&" se reemplazan con "~=" y "&&" respectivamente. Al generar ejemplos de entrada-salida, los paréntesis se balancean y las variables no vinculadas se vinculan.
- Las funciones con argumentos no utilizados están ocultas de forma predeterminada y se imprimen en gris si marca la casilla de verificación correspondiente antes de la búsqueda.
- Si envía solo una palabra, saltará a la página de documentación de la biblioteca que explica la palabra (o saltará a Hoogle si este sistema no la conoce:).
- Puede acceder a esta herramienta web instantáneamente mientras usa su escritorio si está usando KDE/TDE. Coloque este archivo en ~/.kde/share/kde4/services/searchproviders/ (para KDE4) y/o ~/.trinity/share/services/searchproviders/ (para TDE). (Es posible que deba cerrar la sesión y volver a iniciarla). Luego, puede realizar una búsqueda abriendo el cuadro de diálogo "Ejecutar comando..." (presionando Alt+F2 o Win+r según sus combinaciones de teclas) y llenando el cuadro de texto con su consulta comenzando con "magh:", como "magh: f 3 == [1,2,3]" o "magh: \a -> a*a". (Avísame si sabes cómo hacer lo mismo con Gnome, Windows, etc.)
Limitaciones, tareas pendientes y planes futuros
- MagicHaskeller no funciona bien al lidiar con funciones parciales. Las expresiones sintetizadas usan drop 1 en lugar de tail, y foldr const (algo) en lugar de head. Además, el botón EXEMPLIFY no se muestra si la expresión correspondiente puede ser parcial, porque el CGI no puede manejar las funciones parciales correctamente.
- Las expresiones se sintetizan utilizando un subconjunto limitado de la biblioteca estándar base. Actualmente, se utilizan principalmente valores de Standard Prelude y el módulo Data.List. Además, Float e Integer no se reconocen por ahora. (Aún puede usar Int, Char, Bool, listas, tuplas, Maybe, Double, etc.)
- La mayoría de las expresiones, incluidos los literales de Char o String, no se pueden sintetizar. Tengo la idea de permitir su uso extrayendo literales de las expresiones de consulta, pero eso aún no está implementado.
- Para preservar la estabilidad del sistema del servidor, la búsqueda de programas se detiene en algún punto y, como resultado, el servidor que se está ejecutando actualmente no sintetiza expresiones con más de (aproximadamente) 6 aplicaciones de funciones en la forma normal eta-larga. (Digo "aproximadamente" 6 porque internamente una función primitiva puede consistir en algunas funciones y otras pueden tener menor prioridad. Además, el postprocesamiento puede cambiar el número de aplicaciones).
- Hay algunos casos en los que la función de evaluar expresiones (con / sin argumentos aleatorios) no muestra un HTML correcto.Actualmente, es frágil para funciones parciales, como init y enumFromThenTo.(init [] causa un error, y enumFromThenTo 1 1 2 es infinito).
- Si experimenta un problema, presione el botón Atrás de su navegador.
- Sería útil si la interfaz CGI tuviera la capacidad de mostrar una lista de argumentos de ejemplo con la que difieren dos funciones. Si está usando Konqueror o algún navegador web similar, esto se puede lograr de alguna manera dividiendo la ventana verticalmente y haciendo click EXEMPLIFY en sus botones.
- Los mensajes de error (como los de errores de tipo cometidos por el usuario) podrían imprimirse de mejores maneras, tal vez como la funcionalidad "¿Te refieres a...?" proporcionada por Google.
- Tal vez se deberían introducir algunos BTS en lugar de usar este tipo de lista de tareas pendientes. De hecho, hay muchas más tareas pendientes que no se enumeran aquí.
Cómo instalar la biblioteca y el servidor
Si está realmente interesado, puede instalar la biblioteca y los programas del servidor en su computadora.
1.Elige tu sistema operativo
- Linux ... Bien
- Windows ... Limitado, pero suficiente para jugar
- MacOS, etc. ... Desconocido, debería funcionar
2.Instalar Haskell Platform
Instale la versión 2014 o 2015. (2015 es ligeramente mejor).
3.Configura la variable PATH.
Unix:
Agrega export PATH=$HOME/.cabal/bin/:$PATH a .bashrc o similar.
Windows:
Agrega %APPDATA%\cabal\bin a la variable Path. (Pero esto puede ser innecesario cuando se usa la versión 2015 de Haskell Platform).
4.Instalar MagicHaskeller escribiendo
- cabal update
- cabal install -j MagicHaskeller
(Ignore $ que solo denota el indicador).
En Windows + Haskell Platform 2014, es posible que deba usar
- cabal install -j MagicHaskeller --flags="-NETWORKURI"
en su lugar. El punto es forzar el uso de la versión ya instalada del paquete de red.
Es posible que deba anular el registro de algún paquete temporalmente y reiniciar la instalación nuevamente.
En mi caso, tuve que anular el registro del paquete HTTP, entonces
- ghc-pkg unregister HTTP
- cabal install -j MagicHaskeller
Al realizar la instalación, obtendrá la biblioteca, el ejecutable MagicHaskeller que funciona como un REPL sintetizador independiente y un servidor backend, y el ejecutable MagicHaskeller.cgi que es el programa frontend CGI. Su uso se explicó de alguna manera en AAIP 2015.
Para aquellos interesados en usar la biblioteca, la página de Hackage para MagicHaskeller proporciona documentación sobre cada uno de los módulos expuestos. Además, aquí está la página web antigua para las versiones de su biblioteca. Sin embargo, si desea reproducir los mismos resultados que MagicHaskeller en la web utilizando la biblioteca en lugar de usar el ejecutable MagicHaskeller, debe leer el código fuente de MagicHaskeller/SimpleServer.hs, MagicHaskeller/Minimal.hs y MagicHaskeller/LibTH.hs, o contactarme.
Agente MagicHaskeller
MagicHaskeller se puede usar para implementar un agente de IA general! Aquí se encuentran el agente de aprendizaje por refuerzo incremental galardonado y su breve documentación presentada para la Ronda 1 del Desafío de IA General organizado por GoodAI.
Otros Materiales
resumen extendido y el archivo de presentación utilizado para la presentación en el Simposio de Haskell 2013. (Algunos enlaces se actualizan para que sean utilizables en este entorno, para aquellos de ustedes que estén interesados).