isFizz(Num) :- 0 is Num mod 3. isBuzz(Num) :- 0 is Num mod 5. isFizzbuzz(Num) :- isFizz(Num), isBuzz(Num). fizzbuzz(Num, Res) :- isFizzbuzz(Num) -> Res = 'fizzbuzz'; isFizz(Num) -> Res = 'fizz'; isBuzz(Num) -> Res = 'buzz'; Res = Num. fizzbuzzes(TopNum, TopNum, List) :- List = [],!. fizzbuzzes(TopNum, CurrentNum, [Head | Tail]) :- CurrentNum > TopNum -> throw('the CurrentNum is greater than TopNum'); TopNum < 1 -> throw('the TopNum is less than 1'); (NextNum is CurrentNum + 1, fizzbuzz(CurrentNum, Head), fizzbuzzes(TopNum, NextNum, Tail)). fizzbuzzes(TopNum, List) :- OneHigher is TopNum + 1, fizzbuzzes(OneHigher, 1, List). printFizzbuzzes(TopNum) :- fizzbuzzes(TopNum, FizzbuzzList), forall(member(X, FizzbuzzList), (print(X), nl)). main :- printFizzbuzzes(20), halt. % Test Cases :- begin_tests(fizzbuzz). test(isFizz_isnot) :- not(isFizz(5)). test(fizzbuzz_fizz) :- fizzbuzz(3, 'fizz'). test(fizzbuzzes_empty) :- fizzbuzzes(0, []). test(fizzbuzzes_5) :- fizzbuzzes(5, [1, 2, fizz, 4, buzz]). :- end_tests(fizzbuzz).