We can encode each property (number, color, shape, shading} as a 1, 2, or 3.  There are four properties. So we have vectors of 4 numbers describing each card
	{(Subscript[n, 1]),(Subscript[s, 1]),(Subscript[c, 1]),(Subscript[f, 1])} 
We have decided the order is
	number	n
	shape		s 
	color		c
	fill		f

For three cards
	{(Subscript[n, 1]),(Subscript[s, 1]),(Subscript[c, 1]),(Subscript[f, 1])} , {(Subscript[n, 2]),(Subscript[s, 2]),(Subscript[c, 2]),(Subscript[f, 2])} , {(Subscript[n, 3]),(Subscript[s, 3]),(Subscript[c, 3]),(Subscript[f, 3])}
we want to tell if all the ns are the same or are all different
	({{1+1+1, =, 3}, {1+1+2, =, 4}, {1+2+2, =, 5}, {1+1+3, =, 5}, {1+2+3, =, 6}, {1+3+3, =, 7}, {2+1+1, =, 4}, { , ⋮,  }, {3+2+3, =, 8}, {3+3+3, =, 9}}) 
The ones we want are divisible by three!

Pics for cards

I am going to make the 81 images I need for the display.  Should be no big deal.

Colors are easy

I need the shapes.

InPics=Join[
Table[
FileName=ToString[StringForm["http://www.setgame.com/images/setcards/small/0``.gif",i]
];
Import[FileName],
{i,1,9}],
Table[
FileName=ToString[StringForm["http://www.setgame.com/images/setcards/small/``.gif",i]
];
Import[FileName],
{i,10,81}]
];
PicData=Nest[Partition[#,3]&, InPics,3];
Dimensions[PicData]
PicData[[1,1,All,1]]

The order of the attributes is:
	Fill: 	Solid, Shaded, Empty
	Shape: 	Squiggle, Diamond, Pill
	Color:		Red, Purple, Green
	Number:	1, 2, 3

CardPic[{f_,s_,c_,n_}]:= Show[
Part[Pics, {f,s,c,n}],
Frame->True,
FrameTicks->None]
CardPic[{1,2,1,3}]
Map[CardPic, {{1,2,1,2},{1,3,1,1},{2,1,3,1}}]

Directory[]

SetDirectory["/home/campus03/struther/public_html/Courses/2990/ClassSamples/Sets/Pics"]
Do[
Export[
ToString[StringForm["``_``_``_``.gif",i,j,k,m]],
PicData[[i,j,k,m]]
],
{i,3},
{j,3},
{k,3},
{m,3}]

?Export