Mostrando las entradas con la etiqueta teoría. Mostrar todas las entradas
Mostrando las entradas con la etiqueta teoría. Mostrar todas las entradas

domingo, mayo 24, 2009

Más no siempre es mejor

Si hay algo que podemos aprender del control de plagas es que tener más no siempre es mejor. Tenemos que tener "más" de buena calidad; de otra forma, es como si en verdad tuviéramos menos.
Para controlar una plaga, una opción que es muchas veces aplicada es la de agregar a la población nuevos individuos que son incapaces de reproducirse. Así, la población total comienza a reducir su tamaño.
¿Cómo? Supongamos que tenemos moscas que se aparean sólo dos veces antes de morir, y que cada apareamiento produce dos moscas. Si tenemos una hembra y un macho, entonces esta hembra producirá 4 moscas antes de morir, y así sucesivamente.
Ahora, si introducimos tres moscas macho que son estériles, lo que sucede es que cada vez que se aparea la hembra, tiene 25% de probabilidad de hacerlo con un macho que no es estéril. Para cuando muere, el número esperado de descendientes que tiene es 2. Entre más machos estériles metamos a la cadena, más se reduce el índice de reproducción.
Así, aunque la población es más grande por un momento, no es necesariamente más fuerte.

martes, mayo 12, 2009

La repetición que atonta

Permítanme comenzar este texto con un pequeño ejercicio, bajo la promesa de que después se revelará la importancia del mismo. Si el ejercicio los aburre, les invito a saltárselo e ir directo a la carne del final.

El ejercicio consiste en realizar operaciones aritméticas simples. Olvidemos todo lo que sabemos de aritmética por un momento, y comencemos por lo más básico. Primero tenemos que aprender a contar: aprendemos los números naturales 0,1,2,... con su órden específico (que es lo que nos permite contar).
¿Listo? Pefecto, pasemos entonces a algo un poco más interesante y difícil: la suma. Para realizar una suma es suficiente con saber contar. Por ejemplo, si queremos sumar 5+4 lo que tenemos que hacer es empezar en 5 y contar hasta 4 moviéndonos cada vez una posición sobre los números reales.
Pero una vez que sabemos sumar, podemos entonces multiplicar, simplemente contando. Usando de nuevo un ejemplo, si queremos multiplicar 6*3, entonces comenzamos en 0 y contamos hasta 3, haciendo en cada ocasión una suma de 6. Es decir, comenzamos en 0, contamos "1" y sumamos, 0+6=6; contamos "2" y sumamos 6+6=12; contamos "3" y sumamos 12+6=18, y terminamos.
Obviamente, contando podemos también calcular potencias y, tal vez más interesante, hacer restas, divisiones, etc.

La pregunta que surge entonces es, ¿por qué se nos enseña entonces a multiplicar en formas tan complejas, cuando todo lo que necesitamos saber es contar? La respuesta creo que es obvia: aunque el algoritmo aquí descrito es muy sencillo en cuanto a su descripción, en realidad sería muy difícil para nosotros como humanos aplicarlo, simplemente porque muy fácilmente podemos equivocarnos mientras contamos. Si quisieramos hacer 2^10, por ejemplo, tendríamos que repetir 10 veces un producto por 2; cada uno de esos productos significa sumar 2 veces el número hasta entonces calculado y cada una de esas sumas consiste en contar hasta el mismo número. Es decir, tenemos tres contadores anidados, y el proceso nos llevaría desde el número 1 hasta el 1024; un tanto tedioso, ¿no lo creen?

En realidad resulta más sencillo y mucho más eficiente realizar las operaciones como nos enseñan en la escuela. Y es esta razón, la eficiencia, lo que hace que en las computadoras se implementen algoritmos más inteligentes para realizar operaciones aritméticas que el simple uso de contadores. De hecho, las máquinas son muy buenas haciendo repeticiones y los contadores son mucho muy fáciles de implementar, pero los diseñadores de hardware y software dedican mucho tiempo (o tal vez en la actualidad ya no tanto, pero en un principio lo hacían) a implementar las operaciones aritméticas más veloces.

Y ahora viene la pregunta que ronda mi cabeza desde hace unas semanas. Si esto es así, ¿cómo es posible que ahora la gente promueva el uso de algoritmos que únicamente se dedican a repetir métodos más simples, sin pensar en que puede haber métodos más eficientes de hacer lo mismo si nos dedicamos a construir un algoritmo especializado? No hace mucho leí un comentario que decía que no valía la pena dedicar tiempo a desarrollar algoritmos especializados si los métodos repetitivos eran suficientemente rápidos (en ese caso, rápido significaba que acababa en menos de una hora con datos medianamente grandes).

La única posible respuesta a ese comentario que me viene a la mente es: la repetición que nos dan las máquinas, ese poder que nos permite simplemente iterar sin pensar, y hacerlo velozmente y sin aburrirnos nosotros, nos está haciendo no sólo tontos, sino flojos para pensar en un mejor método.

¿Algún comentario?

miércoles, septiembre 24, 2008

Generalizando

Me voy a poner un poco técnico, pero es una historia que puede ser útil para algún otro investigador allá afuera; y si no le sirve a nadie, al menos es una anécdota interesante.
Tengo que explicar primero en qué he estado trabajando. En pocas palabras, supongan que tienen un complejo sistema de información de negocios, así como una serie de permisos que se le asignan a la gente que dicen qué información pueden ver. Como un ejemplo, un empleado no debe poder ver el salario de su jefe, pero sí su propio salario. Dualmente, el jefe debe poder ver su propio salario y el de su empleado.
Ahora, para simplificar la asignación de permisos, estos están estructurados, formando un órden de tal forma que alguien que tiene un permiso "arriba" de otro permiso, puede ver todo lo que autoriza el permiso inferior (y posiblemente, algunas cosas adicionales). Por supuesto, este órden no tiene por qué ser total en general. Como ejemplo, el jefe de desarrollo no tendría por qué estar arriba o abajo del jefe de ventas. En ese sentido, los permisos que ellos tienen son incomparables.
Básicamente, esta estructura de permisos forma una lattice. Si empezamos con eso, es muy simple demostrar que podemos diseñar algoritmos basados en reglas que digan qué cosas puede ver alguien y qué no. Una propiedad interesante de estos algoritmos es que dan el mismo resultado (correcto) independientemente del órden en que se apliquen las reglas.
La pregunta es, ¿podemos generalizar esto?
Bueno, pues empezamos a analizar y vemos que, debido a ciertas operaciones que necesitamos en nuestro algoritmo, lo mínimo que necesitamos es un semianillo. Listo. Ahora, nos gustaría tener la misma propiedad en que no importa el órden en que las reglas se apliquen, para eso necesitamos un semianillo distributivo. ¿Algo más? Parece que no. Empezamos a demostrar cosas y vemos que todo parece funcionar. Las demostraciones son un poco más complicadas, pero eso no es un impedimento para la veracidad de la teoría. Y seguimos demostrando.
Habiendo visto que todo parece funcionar, lo único que nos falta es definir un orden adecuado. Y aquí nos topamos con algo extraño y útil: ¡en todo seminaillo distributivo, el producto es idempotente! Esto es útil porque nos da una forma de definir el órden que queremos, es extraño porque los axiomas de semianillos, junto con la distributividad hacen que el producto y la adición se comporten más o menos de la misma forma. Y la pregunta obvia es ¿es la adición también idempotente?
Pues sí, lo es. Y esto significa que todo semianillo distributivo es de hecho una lattice. Y regresamos a donde empezamos.

jueves, julio 03, 2008

Autopublicación - resultados falsos

Todos los que hemos trabajado para la academia sabemos que los métodos para aceptar algo para ser publicado distan de ser perfectos. En algunos casos son demasiado estrictos, y dejan fuera cosas que podrían tener gran relevancia; en otros son demasiado laxos y aceptan cosas sin fundamento. Si este segundo punto se lleva al extremo, llegamos a la auto-publicación: si quiero, lo publico, sin ninguna revisión o corrección de por medio.
Sin querer hablar en contra de los beneficios que eso puede traer, quiero hablar de los problemas que eso conlleva, en particular en campos muy especializados y donde aquellos que no son expertos en el tema pueden ser engañados.
Hoy me desperté con la noticia en Microsiervos: Demostrada la Hipótesis de Riemann. Mi primera reacción fue ¿Qué es esto? ¡Estoy viviendo un momento histórico!
Pero analizando más abajo noto que el artículo al que hacen referencia está publicado en arXiv.org, una página donde uno puede publicar lo que quiera; o sea, prácticamente como un blog que cualquiera puede editar.
Tengo que admitir que no leí el artículo en detalle, y es probable que la demostración que ponen ahí sea correcta, pero en verdad lo dudo mucho.
El artículo tiene varias fórmulas matemáticas y definiciones correctas, que pueden fácilmente engañar a alguien que no sea docto en el tema, pero el hecho de que no ha sido revisado por otros expertos para su aceptación para publicación es lo que me hace dudar mucho.
Para poner un ejemplo sencillo, en mis poco más de dos años de doctorado, yo he demostrado en cuatro ocasiones distintas que P=NP o resultados similares (PSpace=ExpTime, etc). Mis demostraciones eran bastante sólidas: se basaban en varios resultados que han sido ampliamente verificados y todo se veía adecuado; ¿en dónde fallaban? Simplemente un pequeño supuesto en algún teorema que no era satisfecho por el algoritmo que daba, o algún otro detalle así de pequeño.
Lo mismo le sucedió hace años a mi asesor, en que un abuso de notación le hizo creer que la Jerarquía Polinomial se colapsaba.
Sinceramente, aunque he visto que la noticia está generando algo de expectación, esto me suena a cuando anuncian que tienen una computadora cuántica funcionando, o que alguien ha violado las leyes de la termodinámica.

viernes, marzo 14, 2008

Incertidumbre y reglas universales

En la vida diaria, muchas veces utilizamos como universales algunas reglas que no necesariamente lo son. De allí surge una incertidumbre sobre nuestras deducciones. Esta incertidumbre puede ser de dos tipos: puede ser que estemos usando una regla que sabemos que no es universal (de la que conocemos excepciones), o simplemente es posible que no estemos seguros que la regla que usamos es correcta.
Por ejemplo, podemos tomar las dos siguientes reglas:
(i) todas las aves vuelan;
(ii) todo número par mayor a 2 puede escribirse como la suma de dos números primos.
Si yo sé que Kiwi es un ave, entonces puedo decir que vuela [regla (i)], pero eso me trae cierta incertidumbre, pues que hay aves que no vuelan (como las gallinas, o los pingüinos).
Por el otro lado, si me dan un número par, digamos 2^543, aplicando la regla (ii) puedo decir que se puede escribir como la suma de dos números primos (cuáles, no sé). Aquí tenemos una incertidumbre que viene del hecho de que no estamos seguros de que la regla es cierta en general [esta regla es la conocida como Conjetura de Goldbach].
Pero debemos notar que los dos tipos de incertidumbre son distintos. En el primer caso, sabemos que hay casos que violan la regla, aunque la regla funciona lo "suficientemente bien" para la vida diaria; en el segundo caso, simplemente no confiamos plenamente en la regla.
Curiosamente, si leemos la literatura sobre manejo de incertidumbre, ningún artículo (con una incertidumbre del tipo (i)) trata estas incertidumbres de forma separada. Algunos utilizan el primer tipo, y otros utilizan el segundo tipo, pero no dan ninguna solución que pueda usarse cuando tenemos ambos en nuestro conocimiento, que es lo habitual.
Ese es mi nuevo proyecto. Tratar ambos simultáneamente. Lo más extraño es que está resultando bastante fácil e intuitivo, lo que me hace preguntarme por qué nadie lo ha hecho antes; en fin, tanto mejor para mí.

viernes, octubre 26, 2007

Achatando la navaja de Occam

La ciencia se rige en general por la navaja de Occam que dice, en pocas palabras, que la explicación más sencilla es comúnmente la correcta. En la ciencia podemos tener por lo general varias teorías simultáneas que explican un fenómeno, pero comúnmente aceptamos la más sencilla, bella, o elegante. Así somos los seres humanos, tenemos un sesgo hacia las explicaciones que son a la vez visualmente atractivas. Pero este proceso de aceptación de la sencillez nos conduce muy fácilmente a teorías innecesariamente complejas. ¿Cómo es esto posible?
Una característica esencial de la ciencia es la forma estructurada en que se desarrolla: a partir de fenómenos sencillos se explican otros más complejos, y así se continúa creciendo paulatinamente. Al avanzar en este proceso, vamos seleccionando la explicación más sencilla de cada uno de los fenómenos que nos vamos encontrando. Y es ahí donde surge el problema: la sencillez no se propaga a través de este proceso constructivo.
Quiero mostrar esto con un ejemplo. Con mucha maña me he tomado la libertad de no especificar a qué me refiero con el término sencillo; ¿qué tipo de explicación es más sencilla que otra? En el ejemplo voy a usar teoría de conjuntos. Supongamos que tenemos una lista fija de conocimiento (axiomas) sobre algunos conjuntos:

latex to png at http://math.b3co.com

nuestros fenómenos son simplemente relaciones (posiblemente complejas) entre conjuntos: latex to png at http://math.b3co.com, y una explicación es simplemente una sub-lista de nuestros axiomas que implica el fenómeno dado. Voy a decir que una explicación es más sencilla que otra si utiliza menos axiomas.
Así, para explicar el fenómeno latex to png at http://math.b3co.com podemos utilizar ya sea la lista que tiene los axiomas 1, 3 y 5 o la lista que tiene los axiomas 2 y 4. Esta última será la que preferimos según la noción de la navaja de Occam: nuestra teoría dice que latex to png at http://math.b3co.com porque 2 y 4 están presentes.
Si sustituimos C por D, hay únicamente una explicación posible: la lista con los axiomas 1, 3 y 6.
Pero ahora, ¿qué pasa si queremos explicar que latex to png at http://math.b3co.com? En ese caso, tenemos que explicar latex to png at http://math.b3co.com para lo que usamos 2 y 4, y explicar latex to png at http://math.b3co.com para lo que usamos 1, 3 y 6. En total, ¡nuestra explicación del fenómeno utiliza 1,2,3,4 y 6! Pero, de haber seleccionado la otra explicación - en principio menos sencilla - para latex to png at http://math.b3co.com, en conjunto tendríamos la explicación - más sencilla - que utiliza únicamente los axiomas 1,3,5 y 6.
Así, como ven, si las explicaciones más sencillas son deseadas en el resultado final, muchas veces es necesario complicar las explicaciones de los elementos intermedios. De otra forma, podríamos encontrarnos con teorías innecesariamente complicadas.
Este ejemplo depende completamente de definir sencillo como lo hice, pero es posible adaptarlo para arruinar otras definiciones.

jueves, agosto 02, 2007

¡Malditos infinitos!

Lo acepto, tratar con infinitos por recreación me encanta; pero ¡cómo odio tener que hacerlo por investigación! Un ejemplo de las cosas raras que hacen estos seres sin fin que resultan contraintuitivas al por mayor.
Voy a describir el problema usando sumas y máximos, aunque en realidad es más general (utilizando cualquier semianillo totalmente completo).
Mi problema es el siguiente: tengo un conjunto de sumas infinitas, de las que tengo que calcular el máximo, es decir

latex to png at http://math.b3co.com

Ahora, tengo otro proceso que no calcula directamente las sumas infinitas primero, sino que iterativamente va calculando los máximos de sumas parciales. Quiero demostrar que lo que obtengo al final es lo mismo. Facil, ¿no?
Por inducción demuestro que en el n-ésimo paso, mi algoritmo ha calculado el máximo de todas las sumas parciales de tamaño n; en simbolitos:
latex to png at http://math.b3co.com

Esta demostración está hecha. Pero esto no demuestra nada cercano a lo que quiero. El problema es que demostrar algo para todos los números enteros no hace que sea válido para el infinito, a menos que demuestre algún tipo de convergencia y esa convergencia no existe.
Nuevamente, ¡maldito infinito!

sábado, octubre 07, 2006

Generalizaciones

Como comenté ayer, Torsten se graduó de la maestría con una tesis titulada Decomposition of Weighted Multi-operator Tree Automata. Aparte de ser una de las pocas pláticas técnicas que realmente he entendido en mi vida, la presentación de este trabajo me trajo unas ideas sobre las generalizaciones, que quiero compartir.
Por favor, no se espanten con los nombres, que los detalles de qué son o para qué sirven no son importantes para el punto que quiero mostrar.
La teoría de autómatas surge para reconocer un tipo de lenguajes. En este caso, un lenguaje es un conjunto de palabras. Pero, ¿por qué quedarse ahí? Hay aplicaciones para las que conjuntos de palabras no son interesantes, sino que se quieren distinguir conjuntos de árboles. Para esto, la teoría de autómatas fue generalizada, dando lugar a los autómatas de árboles.
En este caso, para un árbol dado, el autómata contesta "si" o "no"; o para los computólogos, 0 o 1. Pero, ¿es esto suficiente? Digamos que no solo queremos saber si el árbol tiene cierta propiedad, sino además asociar un costo al mismo; así surgen los autómatas de árboles con pesos. En ellos, dado un árbol, el autómata regresa un número, perteneciente a una estructura algebráica previamente definida.
Ahora generalicemos un poco más. En lugar de simplemente aceptar un árbol con un costo, creamos un mecanismo, que actúa de la misma forma que los autómatas, que dado un árbol da como resultado un conjunto de árboles junto con unos pesos. Estos son transformadores de árboles con pesos.
Un punto importante aquí, es que los transformadores pueden hacer estrictamente más cosas que los autómatas.
Pero, regresando por un momento a los autómatas, ¿qué pasa si en lugar de números usamos como pesos operadores? Bueno, pues eso es lo que en la tesis de Torsten se llama autómata multi-operador de árboles con pesos. Ahora, durante su plática, mientras estaba mostrando resultados de descomposición, Torsten muestra, casi sin notarlo, que un transformador de árboles es un caso particular de uno de estos autómatas. ¿A alguien le suena una campanita aquí?
Tenemos que los autómatas con pesos usando operadores son más generales que los transformadores que son estrictamente más generales que los autómatas con pesos. ¡Aquí hay un problema!
Obviamente, no existía tal problema, sino que yo estaba dejando de lado un hecho muy importante: el conjunto de operadores no es un semianillo, y por tanto, los autómatas multi-operador son también estrictamente más generales que los autómatas de pesos originales. Es decir que, lo que parecía un caso particular (usar la estructura de los operadores cuando puedes usar cualquier otra) era realmente una generalización.
La pregunta viene ahora: ¿se puede generalizar más?; ¿hay algo más que quisiéramos hacer con autómatas que no se pueda hacer ya? Bueno, pues la respuesta es: si la Tesis de Church es correcta, entonces no.
Torsten demostró que sus autómatas son capaces de simular una máquina de Turing. Y esto me regresa al punto que quería tomar: se comienza con la máquina de Turing, y se hace un caso particular para resolver un problemita: los autómatas. Poco a poco se va generalizando, agregando propiedades deseables y, de pronto, estamos de regreso en la máquina de Turing.
Yo siempre he sido adepto de las generalizaciones (vean mi tesis de maestría, o mis reportes técnicos como prueba de ello), pero cuando las generalizaciones se van de las manos, ¿sirven de algo?

martes, octubre 03, 2006

Problema de parado

Ya había hablado antes de los problemas de decisión. Ahora voy a hablar de un "caso particular" de estos: el de decidir si una palabra pertenece a un lenguaje específico. Puse entrecomillado lo de caso particular porque en realidad cualquier problema de decisión se puede escribir de esta forma, pero eso es cosa aparte.
Veamos, una palabra es eso, una secuencia de símbolos de un alfabeto dado; un lenguaje es un conjunto de palabras. Por ejemplo la palabra palabra pertenece al lenguaje palabras en español, pero aerdssmensfeas no pertenece a ese lenguaje. Sin embargo, aerdssmensfeas pertenece al lenguaje palabras que comienzan en 'a', pero palabra no.
Entonces, si me yo tengo un lenguaje, y me dan una palabra, ¿cómo decido si pertenece a ese lenguaje? Una forma es usar una máquina de Turing. No se dejen asustar; una máquina de Turing es simplemente un mecanismo que tiene 4 cosas: una memoria física (cinta), una memoria virtual (estado), un apuntador en la cinta, y una lista de instrucciones.
La máquina únicamente ve el símbolo que está escrito en la celda de la cinta que marca el apuntador, y el estado que contiene, y sigue la instrucción adecuada. Una instrucción dice básicamente "si el símbolo es 'a' y el estado es 'q', escribe 'b' y muévete hacia adelante/atrás". Entonces, si el apuntador señala al símbolo 'a' y la memoria contiene el estado 'q', la máquina va a borrar esa 'a' y escribir 'b' en su lugar, y luego mover el apuntador a la siguiente o anterior celda de memoria, dependiendo de lo que diga la instrucción.
Ahora, para decidir si una palabra pertenece o no al lenguaje, se incluyen también dos estados particulares: acepta y rechaza. Si la máquina encuentra alguno de estos estados, entonces se detiene y hace lo que el estado le indica. Existe otro caso adicional, que es cuando la máquina jamás encuentra uno de esos estados; en ese caso, la máquina debe rechazar la palabra.
Aqui nos topamos con un problema, porque si queremos implementar la máquina, nos gustaría saber si esta se va a detener cuando le demos la palabra, para poder rechazarla sin tener que dejar la máquina corriendo por siempre. ¿Es posible hacer esto?, es decir, ¿podemos saber de antemano si una máquina se va a detener?
Primero veamos que, utilizando únicamente máquinas de Turing, esto no es posible. Para esto vamos a usar una variación de la paradoja de Russell (¡qué maravillosas son las paradojas!).
Supongamos que existe una máquina de Turing, llamémosla T (de Todopoderosa), que puede decir en tiempo finito, dada otra máquina y una palabra, si esa otra máquina se va a detener o no cuando se ejecute con la palabra dada. Entonces, dada la máquina y la palabra, podemos saber si esta se acepta o no: primero ejecutamos la T, sabemos que se va a detener, y nos va a decir si la otra máquina se detendrá o no. Si dice que no, entonces simplemente decimos que la máquina rechaza la palabra; si dice que sí, entonces la ejecutamos y damos el resultado que da la máquina.
Ahora podemos crear la máquina D (de Demoniaca) que acepta a todas las máquinas de no se aceptan a sí mismas, es decir, que si se da una codificación de la máquina y ella misma, esta va a rechazar.
La pregunta ahora es ¿D se acepta a sí misma?. Ahí tenemos una contradicción por donde lo veamos, pues si se acepta, entonces se tiene que rechazar, y viceversa.

jueves, septiembre 07, 2006

Validez y completud

Nota:quería titular este texto correctud y completud pero, al no encontrar ninguna referencia a que la palabra correctud es correcta [;)], decidí cambiarlo por el actual.
Permítanme comenzar con unas definiciones. Un problema de decisión es aquel donde las únicas respuestas posibles, para cualquier entrada, son SI o NO. Un problema de decisión es decidible si existe un algoritmo que da la respuesta a cualquier entrada en tiempo finito. Es semi-decidible si existe un algoritmo que, siempre que la respuesta es positiva, contesta acertadamente en tiempo finito, pero que puede no contestar en caso de respuestas negativas.
Por ejemplo, decidir si un algoritmo concluye sus operaciones dada una entrada para el mismo, es semidecidible pues simplemente podemos correr el algoritmo sobre esa entrada y, si termina, contestar SI, pero si no termina, no podremos contestar nada.
Ahora, un mismo problema se puede resolver con distintos algoritmos. Un algoritmo es correcto si siempre que contesta SI lo hace acertadamente, y es completo si siempre que la respuesta es SI este la contesta adecuadamente. Obviamente, el algoritmo ideal sería aquel que es a la vez correcto y completo, pues eso significa que jamás comete errores (cuando contesta).
Un ejemplo trivial de un algoritmo completo es el que siempre, ante cualquier entrada, contesta SI. Sobre algoritmos correctos hay dos ejemplos triviales: uno, el que siempre contesta NO, y otro el que siempre se cicla y no da nunca una solución. [Recuerdo haber leído un ejemplo similar hace poco en Planeta Linux, pero no puedo encontrar la referencia adecuada].
En algunos casos, en especial cuando se quiere implementar algo eficientemente, no se puede tener un algoritmo correcto y completo, pues este demoraría demasiado tiempo. En esos casos hay que hacer una elección: completo e incorrecto, o correcto e incompleto. Históricamente, esta cuestión se ha resuelto fácilmente y con poca controversia: que sea correcto, aunque resulte incompleto.
Hace poco, ante una implementación de Lógica Descriptiva Difusa, un computólogo expresó su duda al respecto entre sus colegas. Muchos de ellos se mostraron incluso sorprendidos ante la pregunta, y contestaron como lo dije antes: "es mejor que sea correcto". Yo por mi parte, me puse a buscar problemas y me resultó dificil encontrar casos en que prefiriera que fuera correcto sobre la completud; de hecho, los únicos tales casos que hallé pertenecían a lógica: satisfacibilidad, subsuma, inclusión. Todos los problemas de "la vida real" que pude pensar era mejor que fueran completos a correctos. Por supuesto, el mismo algoritmo cambia de completo a correcto, y viceversa, si se resuelve el dual del problema inicial, pero los humanos tenemos una forma de expresar esos problemas (generalmente en forma negativa, como: ¿la planta nuclear va a estallar?) que hace que los problemas duales suenen muy irreales (¿es la planta nuclear segura?).
Para entender esto, volví la mirada a la estadística. Ahí, cuando se hacen pruebas de hipótesis, siempre (o generalmente) se elije como hipótesis inicial aquella que está del lado seguro, pues de acuerdo con estas pruebas, sólo vas a rechazar tu hipótesis si tienes evidencia suficiente para ello.
Así, siempre voy a asumir que la planta va a estallar, que el acusado es culpable (aunque esto contradiga las iniciativas judiciales de muchos países), que el león va a atacar, y un muy largo etcétera. Bajo esta perspectiva, si asumimos que nuestro problema de decisión está relacionado con una hipótesis inicial de una prueba de hipótesis como esta, en el caso general preferiríamos errar contestando SI cuando era NO, pues no había evidencia suficiente para refutar la hipótesis inicial, pero que siempre que la respuesta sea SI sea esa la respuesta. En otras palabras, a pesar de lo que digan los lógicos y computólogos, en general, y siempre y cuando el problema esté planteado en forma segura, es preferible un algoritmo completo sobre uno correcto.