Duda relacionada a clase 4

Duda relacionada a clase 4

de Matteo Germán Cardozo Gómez -
Número de respuestas: 2

Buenas! Estaba siguiendo la clase 4, en la parte del practico 2 ejercicio 2, donde se define la función largo(L,N). 

El profesor para testear la funcion definida realiza la siguiente llamada:

  • findall(X,between(1,100,X),L), largo(L,N).

La cual devuelve, correctamente, una lista de los números del 1 al 100 y luego calcula su largo.

Sin embargo, sin querer ingresé la siguiente llamada:

  • findall(X,between(1,100,X),N), largo(L,N). (Donde me equivoco y guardo la lista en N, en vez de en L).

Esta llamada pareciera no terminar nunca, entrando en un loop infinito. Mi consulta es: a que se puede deber ese loop? Se debe a que a la hora de intentar unificar la operación aritmética 'X + 1' con N, lo intenta verificar para cada elemento? Si fuese el caso, no deberia terminar con un error ya que N es una lista finita (y no muy larga como para que el orden de ejecución sea muy grande), o por otro lado con X = 100, que es elemento de N? O simplemente se debe a que espera algún otro input que capaz me faltaría ingresar para que termine correctamente?
Muchas gracias y saludos!

En respuesta a Matteo Germán Cardozo Gómez

Re: Duda relacionada a clase 4

de Luis Chiruzzo -
Hola,

No vimos todavía formalmente el predicado findall, que lo vamos a ver dentro de algunas clases, pero igual para ver cuál es el error que está pasando acá no lo necesitamos. Lo que está pasando es:
- En el primer ejemplo estás obteniendo la lista en la variable L, y calculando el largo de L (eso anda bien).
- En el segundo ejemplo estás obteniendo la lista en la variable N, y luego pidiendo que esa N sea el largo de un lista L no instanciada. Es un error en el uso de los argumentos, porque se espera que el primero sea la lista y el segundo el valor numérico del largo. Como le mandás la lista en el segundo se cae por una rama infinita porque ningún número unifica con ese valor que le pasaste (que es una lista).

Saludos,
Luis