males([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).