Salta ai contenuti. | Salta alla navigazione

Strumenti personali

CLP 25 gen 2010

Applicazioni di Intelligenza Artificiale - CLP

Prof. Marco Gavanelli

25 Gennaio 2010

Esercizio (6 punti)

Si deve stabilire l'orario delle discussioni di laurea. Nello stesso giorno, si discutono due corsi di laurea diversi, in due aule diverse.

Il file laureandi.pl contiene i dati sui laureandi; per ogni laureando si ha un fatto Prolog

laureando(Nome,Docente,CdL).

in cui

  • Nome è un identificativo del laureando
  • Docente è un identificativo del relatore di tesi
  • CdL è l'identificativo del Corso di Laurea

Per ogni laureando si deve stabilire l'orario di inizio, partendo dall'istante 1, considerando durata 1 per la discussione di ogni tesi.

Naturalmente, i laureandi nella stessa aula (ovvero, stesso CdL), non possono sovrapporsi. Inoltre, ciascun relatore deve essere presente alla discussione dei laureandi che ha seguito, quindi laureandi con lo stesso relatore non possono essere allo stesso orario.

 

 


 

 

Soluzione


:- lib(fd).
:- [laureandi].

schedule(Stud1,Stud2):-
    findall([Laureando,Docente],laureando(Laureando,Docente,1),Lcdl1),
    length(Lcdl1,NumStud),
    findall([Laureando,Docente],laureando(Laureando,Docente,2),Lcdl2),
    length(Stud1,NumStud), % Lista degli start time degli studenti del CdL 1
    Stud1 :: 1..NumStud,
    alldifferent(Stud1), % Gli studenti del CdL 1 non si sovrappongono
    length(Stud2,NumStud), % Lista degli start time degli studenti del CdL 2
    Stud2 :: 1..NumStud,
    alldifferent(Stud2), % Gli studenti del CdL 2 non si sovrappongono
    append(Lcdl1,Lcdl2,CdlTot),
    append(Stud1,Stud2,StudTot),
    diff_docente(CdlTot,StudTot),
    labeling(StudTot).

diff_docente([],[]).
diff_docente([[_,Doc]|Dati],[Start|LStart]):-
    diff_docente_loop(Doc,Dati,Start,LStart),
    diff_docente(Dati,LStart).

diff_docente_loop(_,[],_,[]).
diff_docente_loop(Doc,[[_,Doc]|Dati],Start1,[Start2|LStart]):- !,
    % Stesso docente -> diverso start
    Start1 #\= Start2,
    diff_docente_loop(Doc,Dati,Start1,LStart).
diff_docente_loop(Doc1,[[_,Doc2]|Dati],Start1,[_|LStart]):-
    Doc1 \= Doc2,
    diff_docente_loop(Doc1,Dati,Start1,LStart).