UTNianos

Versión completa: [PdeP] Consulta Ejercicio
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Hola compañeros, cómo están?

Tengo una duda con un ejercicio en el que debo aplicar recursividad y me está dando muchos dolores de cabeza.
El punto pide calcular el tiempo de un viaje (es decir, sumar el tiempo de las escalas y los tramos).
Me encuentro calculando el tiempo de las escalas pero el resultado que me devuelve es incorrecto. Este es el código.



%vuelo(Codigo de vuelo, capacidad en toneladas, [lista de destinos] ).
vuelo(arg845, 30, [escala(rosario,0), tramo(2), escala(buenosAires,0)]).
vuelo(mh101, 95, [escala(kualaLumpur,0), tramo(9), escala(capeTown,2), tramo(15), escala(buenosAires,0)]).

tiempoTotalVuelo(Vuelo,Destinos):- vuelo(Vuelo,_,Destinos).%, tiempoDeEscalas(Destinos,TiempoEscalas).
tiempoDeEscalas([],0).
tiempoDeEscalas([X|Xs],TiempoEscalas):- member(escala(Ciudad,Tiempo),[X|Xs]), tiempoDeEscalas(Xs,TiempoTail),
TiempoEscalas is Tiempo + TiempoTail.




Haciendo esta prueba, me devuelve estos resultados:

50 ?- tiempoDeEscalas([escala(kualaLumpur,0), tramo(9), escala(capeTown,2), tramo(15), escala(buenosAires,0)],T).
T = 4 ;
T = 4 ;
T = 2 ;
T = 2 ;
T = 2 ;
T = 2 ;
T = 0 ;
T = 0 ;
T = 6 ;
T = 6 ;
T = 4 ;
T = 4 ;
T = 4 ;
T = 4 ;
T = 2 ;
T = 2 ;
T = 4 ;
T = 4 ;
T = 2 ;
T = 2 ;
T = 2 ;
T = 2 ;
T = 0 ;
T = 0.

Lo que quiero aplicar es lo que vimos en clase: sumar la cabeza + la cola aplicando una definición recursiva, pero no sé muy bien dónde estoy fallando.

Muchas gracias!!
estas poniendo demas esto: member(escala(Ciudad,Tiempo),[X|Xs])
usas una variable no unificada que hace combinatoria cada vez que se invoca
lo que te conviene es usar un predicado auxiliar que reciba uno de los tramos/escalas y te devuelva su duracion
Hola que tal, en el enunciado no decía que tenía que ser con recursividad así que en mi TP lo resolví con un findall.
El paradigma Lógico yo lo pienso como que todo es pattern matching y nada mas y eso me ayudó a pensar casi todo, te paso la resolución.

tiempoTotalVuelo(Codigo,TiempoTotal) :- vuelo(Codigo,_,ListaDestinos), findall(Valor,(member(TramoEscala,ListaDestinos),valorTramoEscala(TramoEscala,Valor)),ListaValores),sumlist(ListaValores,TiempoTotal).

valorTramoEscala(escala(_,Valor),Valor).
valorTramoEscala(tramo(Valor),Valor).


Espero te haya ayudado.
Saludos!

Martín.
(25-08-2014 11:43)morterox escribió: [ -> ]Hola que tal, en el enunciado no decía que tenía que ser con recursividad así que en mi TP lo resolví con un findall.
El paradigma Lógico yo lo pienso como que todo es pattern matching y nada mas y eso me ayudó a pensar casi todo, te paso la resolución.

tiempoTotalVuelo(Codigo,TiempoTotal) :- vuelo(Codigo,_,ListaDestinos), findall(Valor,(member(TramoEscala,ListaDestinos),valorTramoEscala(TramoEscala,Valor)),ListaValores),sumlist(ListaValores,TiempoTotal).

valorTramoEscala(escala(_,Valor),Valor).
valorTramoEscala(tramo(Valor),Valor).


Espero te haya ayudado.
Saludos!

Martín.

Hola Martin, yo tambien tengo problemas con este ejercicio, probe tu resolucion del predicado y siempre da 2 en el tiempo.

Saludos,
Emilio.
URLs de referencia