Ну, вы были почти там:
print :-
fact(A),
writeln(A),
Сначала мы получаем факт и распечатываем его.
fail;true.
Затем мы возвращаемся (через неудачу), пока не будет найдено решениеоставил.Чтобы избежать возврата false, мы добавляем дизъюнкцию с true.
Обратите внимание, что вы можете действовать по-другому, например:
print2 :-
findall(Fact, fact(Fact), Facts),
maplist(writeln, Facts).
Но если вы пойдете по этому пути, предпочтите решение @gusbro, лучше!