score(_, [], 0). score(Wins, [X|Nums], N) :- member(X, Wins), score(Wins, Nums, N1), N is N1 + 1. score(Wins, [X|Nums], N) :- \+ member(X, Wins), score(Wins, Nums, N). exponent(N, 0) :- N =< 0. exponent(N, M) :- N > 0, M is 2**(N-1). all_scores([], 0). all_scores([[Wins1|Card1]|RestOfCards], N) :- score(Wins1, Card1, N1), all_scores(RestOfCards, RestOfScore), exponent(N1, N2), N is N2 + RestOfScore.