UTNianos

Versión completa: Ayuda!. Como generar los numeros naturales en PROLOG.
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Hola a todos.
Vi un ejercicio una vez ( y ahora no lo puedo encontrar ) que pedia generar los numeros naturales en forma infinita en PROLOG.


Yo se que en haskell puedo hacer:

generarNaturalesAPartirDe numero = numero : naturalesDesde (numero+1)

Pero en prolog como seria.? Ojo entiendo lo de las listas infinitas en PROLOG, no es esa la duda. Quiero poder generar los naturales en forma infinita por mas que se cuelgue.
Cualquier pista es bienvenida.

Salu2.
Yo tambien vi ese enunciado, pregunte en fb y mande un mail a mi profesora y ninguna respuesta me gustó demasiado....

La mejor solución que encontre a ese problema fue hacer esMenor(X,Y):- between(0,Y,X).
¿Qué es un número natural?

¿Cuál es la definición de natural?
(20-02-2015 16:35)Desert69 escribió: [ -> ]¿Qué es un número natural?

¿Cuál es la definición de natural?

De dar una respuesta util ni hablamos, no?
Digo, no estamos en clase ni en un parcial donde no te pueden dar la respuesta. Si el chabón pregunta es porque lo pensó y no le salió.
Ya lo hice.

natural(N) :- N is 1.
natural(N) :- natural(M), N is M + 1.

Pero hay algo que no entiendo, cuando hago la consulta natural(N) anda perfecto, genera 1 por 1 cada natural.
Pero cuando hago natural(2) o natural(3), no termina mas.

Porque ?
Pasa que cuando hacés natural(2), por ejemplo, N se liga al valor 2, busca qué otros números M hay que sean naturales, y se fija que N sea ese número más 1. Con natural(M) estás entrando en una recursividad infinita, porque estás diciendo que un número es natural si existe otro número natural y blah. Primero buscás todos los naturales antes de decir que alguno lo es.

Fijate así:

natural(1).
natural(N):- M is N -1, M > 0, natural(M).

El 1 es natural because fuck you, that's why. Y además es natural todo número cuyo anterior sea un natural mayor a cero.

Creo que este predicado no es inversible, porque faltaría generar los valores de N (ya no recuerdo si había forma de decir "N es un número"). No recuerdo si "N > 0" es generador, se me ocurre que no. Si lo fuera, con eso lo sacás andando.
(20-02-2015 18:51)cuchodelosdecadentes escribió: [ -> ]Ya lo hice.

natural(N) :- N is 1.
natural(N) :- natural(M), N is M + 1.

Pero hay algo que no entiendo, cuando hago la consulta natural(N) anda perfecto, genera 1 por 1 cada natural.
Pero cuando hago natural(2) o natural(3), no termina mas.

Porque ?

Ojo que esto natural(N) :- N is 1. conceptualmente está mal.
El is no se usa para hacer comparaciones, para eso usamos el pattern matching, el is es para operaciones aritméticas.


(20-02-2015 19:25)Desert69 escribió: [ -> ]Pasa que cuando hacés natural(2), por ejemplo, N se liga al valor 2, busca qué otros números M hay que sean naturales, y se fija que N sea ese número más 1. Con natural(M) estás entrando en una recursividad infinita, porque estás diciendo que un número es natural si existe otro número natural y blah. Primero buscás todos los naturales antes de decir que alguno lo es.

Fijate así:

natural(1).
natural(N):- M is N -1, M > 0, natural(M).

El 1 es natural because fuck you, that's why. Y además es natural todo número cuyo anterior sea un natural mayor a cero.

Creo que este predicado no es inversible, porque faltaría generar los valores de N (ya no recuerdo si había forma de decir "N es un número"). No recuerdo si "N > 0" es generador, se me ocurre que no. Si lo fuera, con eso lo sacás andando.

Claro, eso no es inversible, en el final era necesario que lo sea...N tiene que estar ligada.
(20-02-2015 22:47).-Fede-. escribió: [ -> ]
(20-02-2015 18:51)cuchodelosdecadentes escribió: [ -> ]Ya lo hice.

natural(N) :- N is 1.
natural(N) :- natural(M), N is M + 1.

Pero hay algo que no entiendo, cuando hago la consulta natural(N) anda perfecto, genera 1 por 1 cada natural.
Pero cuando hago natural(2) o natural(3), no termina mas.

Porque ?

Ojo que esto natural(N) :- N is 1. conceptualmente está mal.
El is no se usa para hacer comparaciones, para eso usamos el pattern matching, el is es para operaciones aritméticas.


(20-02-2015 19:25)Desert69 escribió: [ -> ]Pasa que cuando hacés natural(2), por ejemplo, N se liga al valor 2, busca qué otros números M hay que sean naturales, y se fija que N sea ese número más 1. Con natural(M) estás entrando en una recursividad infinita, porque estás diciendo que un número es natural si existe otro número natural y blah. Primero buscás todos los naturales antes de decir que alguno lo es.

Fijate así:

natural(1).
natural(N):- M is N -1, M > 0, natural(M).

El 1 es natural because fuck you, that's why. Y además es natural todo número cuyo anterior sea un natural mayor a cero.

Creo que este predicado no es inversible, porque faltaría generar los valores de N (ya no recuerdo si había forma de decir "N es un número"). No recuerdo si "N > 0" es generador, se me ocurre que no. Si lo fuera, con eso lo sacás andando.

Claro, eso no es inversible, en el final era necesario que lo sea...N tiene que estar ligada.

Tenes razon, y no la puedo terminar de hacer inversible. Debe ser una boludez pero no me sale.
Me parece que no hay una mejor solución que la que di con el between...pero bueno, hoy aprobe el final así que ya estaaa =D
URLs de referencia