
prec([],_).
prec([(X,Y)|L1],L) :- nth(X,L,A), nth(Y,L,B), A #< B, prec(L1,L).

parallel([],_).
parallel([(X,L2)|L1],L) :- nth(X,L,A), para(A,L2,L), parallel(L1,L).

para(_,[],_).
para(A,[Y|L1],L) :- nth(Y,L,B), A #\= B, para(A,L1,L).

nombrecours(_,0,_) :- !.
nombrecours(L1,Nbcreneaux,Maxcours) :- 
    cours(L1,Nbcreneaux,Maxcours), 
    N1 is Nbcreneaux-1, 
    nombrecours(L1,N1,Maxcours).

cours(L1,Nbcreneaux,Maxcours) :- listecontrainte(L1,Nbcreneaux,Maxcours,L),
                                 fd_cardinality(0,L,Maxcours).

listecontrainte([],_,_,[]).
listecontrainte([X|L1],Nbcreneaux,Maxcours,[X #= Nbcreneaux|L]) :-
			 listecontrainte(L1,Nbcreneaux,Maxcours,L).

emploi(Nbcreneaux,Nbcours,Maxcours,Prec,Parallel,L1) :- 
    length(L1,Nbcours),
    fd_domain(L1,1,Nbcreneaux),
    prec(Prec,L1),
    parallel(Parallel,L1),
    nombrecours(L1,Nbcreneaux,Maxcours),
    fd_labeling(L1).

% emploi(4,11,3,[(4,11),(5,10),(6,11)],[(1,[2,3,5,7,8,10]),(2,[3,4,7,8,9,11]),(3,[5,6,8]),(4,[6,8,10]),(6,[7,10]),(7,[8,9]),(8,[10])],L1).

% emploi(4,7,2,[(4,6),(5,7),(6,2)],[(1,[2,3,4,7]),(2,[3,6]),(3,[4,5,6]),(4,[5,6]),(5,[7])],L1).
