46 lines
980 B
Prolog
46 lines
980 B
Prolog
do_it(N) :-
|
|
card_sets(N, Cards, Sets),
|
|
!,
|
|
format('Cards: ~n'),
|
|
maplist(print_card, Cards),
|
|
format('~nSets: ~n'),
|
|
maplist(print_set, Sets).
|
|
|
|
print_card(Card) :- format(' ~p ~p ~p ~p~n', Card).
|
|
print_set(Set) :- maplist(print_card, Set), nl.
|
|
|
|
n(9,4).
|
|
n(12,6).
|
|
|
|
card_sets(N, Cards, Sets) :-
|
|
n(N,L),
|
|
repeat,
|
|
random_deal(N, Cards),
|
|
setof(Set, is_card_set(Cards, Set), Sets),
|
|
length(Sets, L).
|
|
|
|
random_card([C,S,N,Sh]) :-
|
|
random_member(C, [red, green, purple]),
|
|
random_member(S, [oval, squiggle, diamond]),
|
|
random_member(N, [one, two, three]),
|
|
random_member(Sh, [solid, open, striped]).
|
|
|
|
random_deal(N, Cards) :-
|
|
length(Cards, N),
|
|
maplist(random_card, Cards).
|
|
|
|
is_card_set(Cards, Result) :-
|
|
select(C1, Cards, Rest),
|
|
select(C2, Rest, Rest2),
|
|
select(C3, Rest2, _),
|
|
|
|
match(C1, C2, C3),
|
|
sort([C1,C2,C3], Result).
|
|
|
|
match([],[],[]).
|
|
match([A|T1],[A|T2],[A|T3]) :-
|
|
match(T1,T2,T3).
|
|
match([A|T1],[B|T2],[C|T3]) :-
|
|
dif(A,B), dif(B,C), dif(A,C),
|
|
match(T1,T2,T3).
|