cours(edp,vendredi,16.5,18.5).
cours(edp_td,mardi,16.5,19.5).

cours(an_num, mercredi, 12.5, 14.5).
cours(an_num_td, mercredi, 16.5, 19.5).

cours(stat, mardi, 10.5, 12.5).
cours(stat, mercredi, 14.5, 16.5).
cours(stat_td, jeudi, 12.5, 15.5).
cours(stat_td, vendredi, 9.5, 12.5).
cours(stat_td, lundi, 11.5,14.5).
cours(stat_td, vendredi, 9.5, 12.5).

cours(proba, lundi, 17.5, 19.5).
cours(proba, vendredi, 14.5, 16.5).
cours(proba_td, lundi, 15.5, 17.5).
cours(proba_td, mardi, 8.5, 10.5).
cours(proba_td, jeudi, 8.5, 10.5).

cours(fourier, mardi, 14.5, 16.5).
cours(fourier, jeudi, 16.5, 18.5).
cours(fourier_td, lundi, 12.5, 14.5).
cours(fourier_td, mardi, 12.5, 14.5).
cours(fourier_td, mercredi, 10.5, 12.5).

cours(arith, mercredi, 12.5, 14.5).
cours(arith, vendredi, 12.5, 14.5).
cours(arith_td, lundi, 14.5, 16.5).
cours(arith_td, mercredi, 16.5, 18.5).
cours(arith_td, vendredi, 14.5, 16.5).

cours(mathd, vendredi, 8.5, 10.5).
cours(mathd, mercredi, 12.5, 14.5).
cours(mathd_td, jeudi, 14.5, 16.5).
cours(mathd_td, mercredi, 14.5, 16.5).

cours(alg, lundi, 9, 11).
cours(alg_td, mercredi, 9, 11).

cours(mecaq, lundi, 11, 13).
cours(mecaq_td, mercredi, 15, 16).

cours(calcu1, lundi, 9.5, 12.5).
cours(systemes, lundi, 14, 16.5).
cours(projet, lundi, 16.5, 18).
cours(anglais, mardi, 10, 12).
cours(logique_td, mardi, 13.5, 15.5).
cours(logique, mercredi, 9.5, 11.5).
cours(calcu2, mercredi, 14, 16).
cours(prog1, mercredi, 16, 18).
cours(algo1, jeudi, 9, 12.5).
cours(prog2, jeudi, 14, 17).
cours(reseaux, vendredi, 10, 12.5).
cours(algo2, vendredi, 14, 17).

lieu(edp,jussieu).
lieu(edp_td,jussieu).
lieu(an_num, jussieu).
lieu(an_num_td, jussieu).
lieu(stat, jussieu).
lieu(stat_td, jussieu).
lieu(proba, jussieu).
lieu(proba_td, jussieu).
lieu(fourier, jussieu).
lieu(fourier_td, jussieu).
lieu(arith, jussieu).
lieu(arith_td, jussieu).
lieu(mathd, jussieu).
lieu(mathd_td, jussieu).

lieu(alg, cachan).
lieu(alg_td, cachan).
lieu(mecaq, cachan).
lieu(mecaq_td, cachan).
lieu(calcu1, cachan).
lieu(systemes, cachan).
lieu(projet, cachan).
lieu(anglais, cachan).
lieu(logique_td, ulm).
lieu(logique, ulm).
lieu(calcu2, cachan).
lieu(prog1, cachan).
lieu(prog2, cachan).
lieu(algo1, cachan).
lieu(algo2, cachan).
lieu(reseaux, cachan).

distance(cachan, ulm, 1).
distance(ulm,cachan,1).
distance(ulm, jussieu, 0.5).
distance(jussieu, ulm, 0.5).
distance(cachan, jussieu, 1).
distance(jussieu, cachan, 1).
distance(X,X,0).

no_overlap(X, Y, Jour_X, Jour_Y) :-
    cours(X, Jour_X, Debut_X, Fin_X),
    cours(Y, Jour_Y, Debut_Y, Fin_Y),
    lieu(X,S), lieu(Y,T),
    distance(S,T,D),
    (Jour_X \== Jour_Y;
     Jour_X == Jour_Y, (Debut_X >= Fin_Y+D; Debut_Y >= Fin_X+D)).

compatible(X, Jour_X, []) :- cours(X, Jour_X,_,_).

compatible(X, Jour_X, [(A, Jour_A)|B]) :-
    no_overlap(X, A, Jour_X, Jour_A),
    compatible(X, Jour_X, B),
    compatible(A, Jour_A, B).

correct([],[]).
correct([A|B], [(A,Jour_A)|Reste]) :- 
    correct(B, Reste),
    compatible(A, Jour_A, Reste).


