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).