For printing messages:
Most of the time what is printed is just a simple message and format/2,3 will work.
When a messages needs some color ansi_format/3 (example) will work.
When you need to print messages in other languages and for other output devices or need to hook into the printing sequence, print_message/2 (tutorial) comes to the rescue.
For printing structures:
When the term is a large structure, print_term/2 comes to the recuse.
When all of these don’t seem right, take a look at portray/1. There is a really nice example of this for displaying a Rubick’s Cube. (ref)
EDIT
Example code for parsing ABNF from text to structure using DCG and converting structure back into text using portray/1 - EricGT/ABNF. Code has fixed_point_check/1.
And then we learn something more.
See: How to disable specific multifile predicates? i.e. portray(cr(A))
For completeness sake.
pprint.pl – Pretty Print Prolog terms