rendered paste bodymales([adam, bertil, cesar, david ,erik]).
females([victoria, cecilia, rut, siv, tyra]).
preflist(adam, [cecilia, tyra, victoria, rut, siv]).
preflist(bertil, [victoria, cecilia, rut, siv, tyra]).
preflist(cesar, [cecilia, rut, tyra, siv, victoria]).
preflist(david, [victoria, rut, cecilia, siv, tyra]).
preflist(erik, [tyra, rut, cecilia, victoria, siv]).
preflist(victoria, [erik, adam, david, bertil, cesar]).
preflist(cecilia, [david, erik, bertil, adam, cesar]).
preflist(rut, [adam, david, bertil, cesar, erik]).
preflist(siv, [cesar, bertil, david, adam, erik]).
preflist(tyra, [david, bertil, cesar, erik, adam]).
% p(Hs) :- Hs = [m(adam,_),m(bertil,_),m(cesar,_),m(david,_),m(erik,_)].
% Ge mig en stabil tuple-lista!
stablelist(Z):-
males(X), females(Y),
generate(X, Y, Z),
list(Z).
list([]).
list([T|H]):-
sublist(H, T),
list(H).
sublist([], _).
sublist([T|H], X):-
\+ (unstablepair(T, X)),
sublist(H, X).
% Are the relations unstable
unstablepair(m(A, B), m(C, D)):-
prefers(A, D, B),
prefers(D, A, C).
unstablepair(m(A, B), m(C, D)):-
prefers(B, C, A),
prefers(C, A, D).
% A prefers B over C?
prefers(A, B, C):-
preflist(A,X),
isbefore(X, B, C).
% is A before B in the list
isbefore([A|_], A, _).
isbefore([T|H], A, B):-
\+ (T = B),
isbefore(H, A, B).
% nedanför Lab3 ===============================
% Avgör om ett element finns i en lista.
member(X, [X|_]).
member(X, [_|Y]) :-
member(X, Y).
% Plockar bort ett element ur en lista.
select(X, [X|Tail], Tail).
select(X, [Head|Tail], MindreX) :-
select(X,Tail, EttMindreX),
MindreX = [Head|EttMindreX].
% Ger alla permutationer av en list
permutation([], []).
permutation(Xs, Ys) :-
select(S, Xs, P),
permutation(P,Y),
Ys = [S|Y].
% Parar ihop alla element i två listor.
pair([], [], []).
pair([X|Xs],[Y|Ys],XYs) :-
pair(Xs,Ys, Rest),
XYs = [m(X,Y) | Rest ].
% Generar alla ihopparningar av element i två listor.
generate(Xs,Ys,XYs) :-
permutation(Ys, Res),
pair(Xs, Res, XYs).