Buenas gente,estoy con una duda con el ejercicio de Prolog del final del 03/12/2016 ... dice asi
Parte B
Tenemos el siguiente código Prolog para armar un programa que ayude a organizar la cursada:
% relaciona una materia con el año
% en el que se cursa
materia(troncal(ads), 2).
materia(electiva(tadp, 5), 3).
materia(electiva(rrhh, 3), 3).
materia(obligatoria(pdep), 2).
%relaciona dos nombres de materias tal que
% la segunda es correlativa de la primera
correlativa(tadp, pdep).
correlativa(NombreElectiva, NombreTroncal):-
materia(troncal(NombreTroncal), Anio),
Anio is Anio + 1,
materia(electiva(NombreElectiva, _), Anio).
1. La solución propuesta para el predicado correlativa/2 tiene un problema. Indicar cuál es justificando
conceptualmente por qué no es correcto.
2. Se agrega el siguiente predicado a nuestro programa:
habilitan(NombresMateriasAprobadas, NombreMateria):-
forall(correlativa(NombreMateria, NombreAprobada),
member(NombreAprobada,NombresMateriasAprobadas)).
Asumiendo que los problemas del predicado correlativa/2 son arreglados, indicar V/F para cada afirmación y
justificar.
a. habilitan/2 no es inversible respecto a su primer parámetro. Lo correcto sería armar una lista con
todas las materias para que pueda usarse de forma existencial.
b. habilitan/2 es inversible respecto a su segundo parámetro, porque correlativa/2 es inversible.
c. habilitan/2 no es inversible respecto a su segundo parámetro, y convendría tratar polimórficamente a
las materias para generar dicha variable.
Para el punto
1) respondo lo siguiente :
correlativa(tadp,pdep).
correlativa(NombreElectiva,NombreTroncal) :-
materia(troncal(NombreTroncal),Anio),
AnioSiguiente is Anio + 1 ,
materia(electiva(NombreElectiva,_),AnioSiguiente).
/* (1) */
/* La sentencia Anio is Anio + 1 nunca va a ser Verdadera , Anio nunca puede ser Anio + 1 .
Lo correcto seria : AnioSiguiente is Anio + 1 , materia(electiva(NombreElectiva,_),AnioSiguiente)*/
Y la duda la tengo con el punto 2.a :
Es VERDADERO que no es inversible el primer parametro. El tema es que no se soluciona el problema de la inversibilidad al armar la lista de todas las materias . ¿ Que sucede si le paso el parametro ya ligado ? NO se puede .
Me refiero a armar algo asi por ejemplo :
habilitan(NombresMateriasAprobadas, NombreMateria) :-
findall(NombreAprobada,correlativa(NombreMateria,NombreAprobada),ListaNombresMateriasAprobadas),
NombresMateriasAprobadas is ListaNombresMateriasAprobadas,
forall(correlativa(NombreMateria,NombreAprobada) , member(NombreAprobada,NombresMateriasAprobadas)).
Si
NombresMateriasAprobadas no esta ligada, entonces OK , se liga y devolvera esa lista con las materias aprobadas necesarias para hacer la
NombreMateria . Sin embargo, si le paso
NombresMateriasAprobadas ya ligada entonces estaria armando la lista sobre esa misma variable...
¿Como se soluciona este problema de inversibilidad ??