/* Problem der stabilen Paare 
   Autor JCl, 01/2001
*/

maenner([adam,boris,claus,daniel,emil]).
frauen([elvira,anna,berta,clara,doris]).
%frauen([anna,berta,clara,doris,elvira]).

wunsch(adam,[anna,berta,clara,doris,elvira]).
wunsch(boris,[berta,clara,anna,doris,elvira]).
wunsch(claus,[elvira,berta,clara,doris,anna]).
wunsch(daniel,[anna,doris,berta,clara,elvira]).
wunsch(emil,[clara,anna,berta,doris,elvira]).

wunsch(anna,[adam,boris,claus,daniel,emil]).
wunsch(berta,[boris,claus,adam,daniel,emil]).
wunsch(clara,[daniel,adam,boris,claus,emil]).
wunsch(doris,[boris,claus,daniel,emil,adam]).
wunsch(elvira,[emil,adam,boris,claus,daniel]).

paare(Liste) :-
	generiere_zuordnung(Liste),
    write(Liste),nl,
	not(konflikt(Liste)).

konflikt(Liste) :-
	frauen(Frauen),	
	maenner(Maenner),
	member(Frau,Frauen),
	member([Partner1,Frau],Liste),
	member(Mann,Maenner),
	member([Mann,Partner2],Liste),
	bevorzugt(Frau,Partner1,Mann),
	bevorzugt(Mann,Partner2,Frau).

bevorzugt(Person,Partner,Kandidat) :-
	wunsch(Person,Vorzugsliste),
	append(L1,[Partner|_],Vorzugsliste),
	member(Kandidat,L1),!.	

generiere_zuordnung(Liste) :-
	frauen(Frauen),
	loesche(F1,Frauen,Frauen1),	loesche(F2,Frauen1,Frauen2),
	loesche(F3,Frauen2,Frauen3),	loesche(F4,Frauen3,Frauen4),
	loesche(F5,Frauen4,_),
	Liste=[[adam,F1],[boris,F2],[claus,F3],[daniel,F4],[emil,F5]].

loesche(X,[X|Rest],Rest).
loesche(X,[Y|Rest],[Y|Rest1]) :- loesche(X,Rest,Rest1).

