He hecho MUCHA programación en Prolog, y si bien amo el lenguaje por su poder expresivo, tengo que estar de acuerdo con svenningsson en que tan pronto como intentes hacer algo no declarativo se convierta en un acertijo usar el ! operador (corte, descarta las opciones de retroceso) en los lugares correctos, que es extremadamente propenso a errores.
Aunque no es perfecto, un idioma que combina de forma elegante el código de retroceso y no declarativo (imperativo/efecto secundario) es Icon. Básicamente, aísla las expresiones que pueden retroceder de forma natural desde la estructura general del programa (por ejemplo, declaraciones) de manera que es relativamente fácil ver que retroceder no conducirá a resultados inesperados, como en Prolog. No estoy seguro de por qué no hay más idiomas basados en este modelo de ejecución, mi suposición es que la mayoría de los programadores están realmente atrapados en el pensamiento secuencial, y retroceder es confuso.
No estoy seguro de si el retroceso se compara directamente con el polimorfismo. Para mí, es más una alternativa a los cierres, ya que el uso n. ° 1 para cierres en la mayoría de los idiomas es la iteración personalizada (pensar mapa/filtro/plegar, etc.). Por ejemplo, en el icono puedo decir:
every write 10<(1..10)*2
que tiene una secuencia de números, los multiplica por dos, los filtros a aquellos> 10, e imprime el resultado ("todos" es algo así como un bucle de repetición quebrar en Prolog).En un lenguaje basado en la lista/cierre, tengo que escribir:
for (filter (map [1..10] \x.x*2) \x.x>10) \x.(write x)
sentado, esto es un poco contived como listas por comprensión & currificación puede simplificar esto, y no todo el código icono es el escueto, pero usted consigue la idea . La versión de Icon no solo es más expresiva obviamente, sino que también tiene la ventaja de que no usa listas intermedias y es "floja" en un sentido de co-rutina, es decir, escribirá el primer número antes de llegar a hacer * 2 en el segundo elemento. Esto significa que le permite escribir código que es igualmente eficiente incluso si termina no utilizando todos los resultados generados.
O pedido de cláusulas para que no se define accidentalmente una búsqueda infinita. –