/* * Obligatorisk Opgave Nummer 2 2002 * * Prolog-opgave * * Af: svalle@imada.sdu.dk */ /* Tæl antallet af muligheder */ count(_, _) :- asserta(blob(0)), fail. count(P, _) :- call(P), retract(blob(N)), N1 is N + 1, asserta(blob(N1)), fail. count(_, N) :- blob(N), retract(blob(_)). /* Hent et liste-element på et bestemt index */ get(1,[X|_],X). get(N,[_|XS],X) :- N > 0, N1 is N-1, get(N1,XS,X). gets([], _, []). gets([X|XS], In, [Y|YS]) :- get(X,In,Y), gets(XS,In,YS). getss([], _, []). getss([X|XS], In, [Y|YS]) :- gets(X,In,Y), getss(XS,In,YS). choose([X|XS], X,XS). choose([X|XS], Y,[X|YS]) :- choose(XS,Y,YS). /* * Lister over konflikt-kort af type 1, 2 og 3 */ /* Angiver om A er et konfliktkort for B */ con1(A,B) :- A < B, M is (B-A) mod 4, member(M,[0,4]), !. con1(A,B) :- A < B, M is ((B-1)//4) * 4, M < A, !. con2(A,B) :- con1(A,B), !. con2(A,B) :- 1 is B mod 5, A is B - 5. con2(A,B) :- 1 is B mod 3, A is B - 3. con3(A,B) :- con2(A,B), !. con3(A,B) :- M is B mod 4, M \= 1, % B er ikke i kolonnen helt til venstre A is B - 5. con3(A,B) :- M is B mod 4, M \= 0, % B er ikke i kolonnen helt til højre A is B - 3. /* De 16 kort-numre */ nos(A) :- member(A,[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]). /* Lav lister over numre på konflikt-kort */ conflict(Con, L) :- /* Con kan være con1, con2 el. con3 */ findall(LB, ( nos(B), findall(A, ( nos(A), Q =.. [Con, A, B], call(Q) ), LB) ), L). /* * De forskellige kort-typer */ card(c(T,V)) :- member(T,[s,k,h,r]), member(V,[j,q,k,a]). cards(Cards) :- findall(Card, card(Card), Cards). /* * Tjek om kort er forskellige */ eq(c(T,_), c(T,_)). eq(c(_,C), c(_,C)). eql(C1, [C2|Cards]) :- eq(C1,C2) ; eql(C1,Cards). checkList(C,Cards) :- eql(C,Cards), !, fail. checkList(_,_). /* * Den endelige løsning */ solution(Con, Solution) :- cards(Cards), conflict(Con, ConflictNos), getss(ConflictNos, Solution, Conflicts), solve(Cards, Conflicts, Solution). solve([], _, []). solve(Cards, [Conflict|Conflicts], [Card|Solution]) :- choose(Cards, Card, Rest), checkList(Card, Conflict), solve(Rest, Conflicts, Solution). /* * Antal løsninger: * con1 : 6912 * con2 : 1152 * con3 : 0 */