Discrete math: How many solutions are there? I wrote a prolog program to print out all of the possible solutions for the following problem:
You have eight colored balls: 1 black, 2 white, 2 red and 3 green.
The balls in positions 2 and 3 are not green.
The balls in positions 4 and 8 are the same color.
The balls in positions 1 and 7 are of different colors.
There is a green ball to the left of every red ball.
A white ball is neither first nor last.
The balls in positions 6 and 7 are not red.
The program works fine, but I need to mathematically calculate how many solutions there are (with same colors being distinct, and same colors being indistinct.) 
Any ideas about how to go about this? At first, I tried to find all possible of solutions of each rule independently and then multiplying that together. But i realized this was not correct because there would be a lot of solutions overlapping that will be counted more than once. My second idea was to do 8! and subtract all not-allowed solutions from this by each rule. But this would also delete duplicates. Any ideas? Thanks in advance.
 A: I used the following SWI-Prolog program:
:- use_module(library(clpfd)).

balls(Bs) :-
        % You have eight colored balls:
        Bs = [One,Two,Three,Four,_Five,Six,Seven,Eight],
        % 1 black, 2 white, 2 red and 3 green.
        % (black = 0, white = 1, red = 2, green = 3)
        global_cardinality(Bs, [0-1,1-2,2-2,3-3]),
        % The balls in positions 2 and 3 are not green.
        Two #\= 3, Three #\= 3,
        % The balls in positions 4 and 8 are the same color.
        Four = Eight,
        % The balls in positions 1 and 7 are of different colors.
        One #\= Seven,
        % A white ball is neither first nor last.
        One #\= 1, Eight #\= 1,
        % The balls in positions 6 and 7 are not red.
        Six #\= 2, Seven #\= 2,
        % There is a green ball to the left of every red ball.
        green_left(Bs, -1).

green_left([], _).
green_left([B|Bs], Prev) :-
        B #= 2 #==> Prev #= 3,
        green_left(Bs, B).

num_col(0, black).
num_col(1, white).
num_col(2, red).
num_col(3, green).

and obtained exactly 3 solutions with same colours being indistinct:
?- balls(Bs), label(Bs), maplist(num_col, Bs, Cols), 
   writeln(Cols), false.
[green,red,black,green,red,white,white,green]
[green,red,white,green,red,black,white,green]
[green,red,white,green,red,white,black,green]
false.

It should be easy to obtain the number of solutions with same colours being distinct from this.
A: Here's my analysis (assuming balls are indistinguishable):
First, condition on where the first green ball appears, and note that it can only appear in the first position. This is because


*

*It cannot be 2 or 3 by constraint.

*It cannot be 4 because then 8 must be green as well, and the 2 reds can't be in 6 or 7.

*It cannot be 5 or later, because there are 3 greens and 2 reds to fit into fewer than 5 spots.


Now, we know the pattern is $g-------$. Then, 7 cannot be green, and so the remaining greens must either be in positions 4 and 8 or in positions 5 and 6.
So we are left with two patterns as cases:


*

*$g--g---g$

*$g---gg--$


We need to place the remaining 5 balls (1 black, 2 white, 2 red). 
In the first case, we only need to constrain 1 to be different from 7 and no reds in 6 or 7. This is a fairly straightforward counting problem.
In the second case, either the reds are in 2 and 3 or they are in 4 and 8. Again, we've reduced to another fairly simple counting situation.
The exact answer depends on what you meant by "There is a green ball to the left of every red ball."


*

*If you meant 'directly preceding', then case 2 never occurs, and case 1 implies a pattern of $gr-gr--g$, leaving us to count the number of ways to arrange 2 white balls and 1 black ball with no constraints. This comes out to $\frac{3!}{1!2!} = 3$.

*If you meant 'somewhere before', then simple counting arguments give a total of $13$ ways for both cases.

