:- use_module(library(clpfd)).

factorial(0,1).
factorial(N,F):-
	F #> 0,
	N #>0,
	N1 #= N-1,
	F #= N*F1,
	factorial(N1,F1).

namematch(sol,1).
namematch(ricky,2).
namematch(doug,3).

solve:-
	Sol=1, Ricky=2, Doug=3,
	Terms=[RockGod,Butcher,Janitor,Vocalist,Guitar,Bass],
	Terms ins 1..3,
	all_different([RockGod,Butcher,Janitor]),
	all_different([Vocalist,Guitar,Bass]),
	Sol #\= Janitor,
	RockGod #\= Bass,
	Ricky #= Vocalist,
	Sol #= Guitar,
	RockGod #= Vocalist,
	report(Terms).

report([RockGod,Butcher,Janitor,Vocalist,Guitar,Bass]):-
	assert(profession(rockgod,RockGod)),
	assert(profession(butcher,Butcher)),
	assert(profession(janitor,Janitor)),
	assert(role(vocalist,Vocalist)),
	assert(role(guitar,Guitar)),
	assert(role(bass,Bass)),!,
	matchem.

matchem:-
	namematch(Person,Id),
	retract(profession(Job,Id)),
	retract(role(Music,Id)),
	write(Person),write(', '),write(Job),write(', '),write(Music),nl,fail.

matchem:- !.


