UTNianos

Versión completa: [Duda] Ejercicio Prolog Final 03/12/2016
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
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 ??
Yo di ese final y tampoco se como resolver ese punto, se necesitaría como vos decís, que si no viene ligada se arme una lista con las correlatividades necesarias para la materia dada, pero si ya te pasan una lista de materias, solamente se debería chequear que las correlativas sean miembro de esa lista, no que sea exactamente la misma lista.
Se que hay que usar un findall en algun lado pero no se donde ni como usarlo.
URLs de referencia