viernes, 6 de febrero de 2009

Pensar y hablar con HAL

Para hablar una lengua es necesario aprender su gramática y su léxico, pero es igualmente imprescindible conocer la forma de pensamiento que, de un modo u otro, se revela en sus propias estructuras lingüísticas.

La lengua de HAL no es diferente. Como lengua artificial dirigida a la solución de problemas, nos fuerza a afrontar de un modo determinado la resolución de todo problema en general. A lo largo de los últimos días y mientras aprendíamos nuevos elementos de esa lengua hemos ido proponiendo algunas de las estrategias típicas de pensamiento que se deben seguir para lograr ese objetivo. Es conveniente recordarlas y ver de qué forma se aplicaron en el caso concreto que sirvió de ejemplo.

Primero presentaré estas estrategias una por una en forma de máximas. A cada máxima le asignaré una etiqueta en negrita. En segundo lugar, esquematizaré el proceso de pensamiento desarrollado hasta dar con la solución del problema, aunque sin seguir al pie de la letra el orden que adoptó en la exposición realizada en los artículos precedentes. Cuando en algún paso de ese proceso se aplicó una máxima determinada se indicará mediante la etiqueta correspondiente.

Se verá que con este resumen aparece en primer plano el monólogo interior que el usuario llevará a cabo más o menos explícitamente en la prosecución de su objetivo. Esto es habitual en tareas complejas: aunque la parte puramente gramatical de la historia se reduce a unas pocas líneas, el pensamiento desde el que ellas brotan adquiere un protagonismo y dimensión particularmente notables.

Máximas
  • Antes de resolver un problema hay que determinarlo explícitamente [M1].

  • Resolver un problema complejo exige dividirlo en los problemas o tareas elementales que lo componen [M2].

  • Conviene esquematizar la forma que adoptará la solución final del problema antes incluso de acometer la resolución de los problemas elementales de que está compuesto, así como enriquecer ese diseño a medida que se avanza en su solución [M3].

  • Los problemas intrínsecamente difíciles requieren de una aproximación progresiva, que frecuentemente parte de la construcción de soluciones a casos básicos de manifestación de dicho problema [M4].

  • Toda solución de un problema no trivial debe ponerse a prueba mediante verificaciones exhaustivas que contemplen todos los casos imaginables. Idealiter tales baterías de ejemplos deberían estar preparadas antes de emprender el trabajo de resolución propiamente dicho [M5].

  • Antes de buscar nuevas herramientas para tratar un problema, conviene revisar en las existentes las opciones poco comunes o desconocidas [M6].

  • Tras hallar una solución provisional a un problema es necesario replantearlo de nuevo a la luz de lo aprendido en el trabajo con él. Este replanteamiento conduce casi siempre a un refinamiento de la solución previamente obtenida [M7].

  • Una vez resuelto un problema para un caso básico, hay que proceder a generalizar la solución para todos los casos posibles [M8].


Esquema del procedimiento de resolución
  1. Planteamiento del problema [M1]: "producir una lista, con un formato convenido, de las referencias (escritas entre llaves) que constan en los artículos leídos del 'Jargon File' y guardarla en un fichero".

  2. Planteamiento de un caso básico del problema [M4]: "producir una lista, con un formato convenido, de las referencias (escritas entre llaves) que constan en el artículo 'hacker' del 'Jargon File' y guardarla en el fichero jargon_ref".

  3. Análisis del problema del caso básico [M2]:

    • Subproblema 1: obtener la definición de 'hacker'.

    • Subproblema 2: extraer las referencias (= las expresiones entre llaves.)

    • Subproblema 3: crear una lista con el formato convenido

    • Subproblema 4: guardar la lista en jargon_ref

  4. Esquema de la solución final [M3]:
      (1) | (2) | (3) | (4)

  5. Resolución de los subproblemas:

    (1) = dict -d jargon hacker
    (2) = ???
    (3) = ???
    (4) = >jargon_ref

  6. Esquema de la solución final (ampliado) [M3]
      dict -d jargon hacker | (2) | (3) >jargon_ref

  7. Resolución del subproblema 2, (incluido análisis previo [M2])

    • Herramienta para resolverlo [M6]: grep -o

    • Requisitos de la solución: expresiones regulares, preferentemente extendidas: Esquema de la solución [M3]: grep -o -E ¿RE?

    • Diseño de la expresión regular y verificación [M5]: [{][^[:punct:]]+}

    • Solución: grep -o -E '[{][^[:punct:]]+}'

  8. Esquema de la solución final (ampliado) [M3]:
      dict -d jargon hacker \
    | grep -o -E '[{][^[:punct:]]+}' \
    | (3) >jargon_ref

  9. Resolución del subproblema 3

    • Solución para un caso básico [M4]:
        awk '{print "hacker:"; print " " $1}'

    • Solución refinada [M7]:
        awk 'BEGIN {FS="\n"; print "hacker:"} { print " " $1 }'

  10. Solución final (provisional) [M3]:
      dict -d jargon hacker \
    | grep -o -E '[{][^[:punct:]]+}' \
    | awk 'BEGIN {FS="\n"; print "hacker:"} { print " " $1 }' \
    >jargon_ref

  11. Replanteamiento del problema del caso básico [M7]: "producir una lista ordenada, con el formato convenido, de las referencias (escritas entre llaves) que constan en los artículos consultados (ejemplo, 'hacker') del 'Jargon File' y añadirlas al fichero jargon_refs, a la vez que se muestran en pantalla."

  12. Análisis del problema replanteado [M2]:


    • Subproblema 1: obtener la definición de 'hacker' [Terminado]

    • Subproblema 2: extraer las referencias (= las expresiones entre llaves) [Terminado]

    • Subproblema 3: ordenar alfabéticamente las referencias

    • Subproblema 4: crear una lista con el formato convenido [Terminado]

    • Subproblema 5: añadir la lista a jargon_refs y mostrarla en pantalla

  13. Esquema de la solución final (incluye las soluciones parciales obtenidas previamente) [M3]:
      dict -d jargon hacker \
    | grep -o -E '[{][^[:punct:]]+}' \
    | (3)
    | awk 'BEGIN {FS="\n"; print "hacker:"} { print " " $1 }' \
    | (5)

  14. Resolución de los nuevos subproblemas:

    (3) = sort
    (5) = tee -a jargon_refs

  15. Solución final (provisional) [M3]:
      dict -d jargon "hacker" \
    | grep -E -o '[{][^[:punct:]]+}' \
    | sort \
    | awk 'BEGIN {FS="\n"; print "hacker ethic:"} { print " " $1 }' \
    | tee -a jargon_refs

  16. Generalización de la solución [M8]: Sin terminar



Con este peculiar resumen de la última fase de esta serie de "conversaciones" cerramos un ciclo dentro de ellas.

El lector que haya llegado hasta aquí habrá alcanzado un conocimiento bastante completo de las estructuras gramaticales y sintácticas de la lengua de HAL y habrá aprendido un conjunto representativo de su léxico, que, aunque no muy numeroso, es suficiente para el buen término de muchas posibles conversaciones. También se habrá hecho consciente del proceso pensamiento típico que implica proponer a HAL la resolución de problemas complejos.

No hay comentarios:

Publicar un comentario