論理的な側面を忘れて、prologを手続型の言語として捉えるのはいい勉強になるね

少し趣旨は違うけど

main :- between(1, 9, X), between(1, 9, Y), Z is X * Y, write(X*Y=Z), nl, fail.

失敗駆動ループを覚えると、バックトラックが少し楽に理解できるかも