word
(0) :- write('zero').word
(3) :- write('three').word
(4) :- write('four').word
(5) :- write('five').word
(7) :- write('seven').word
(8) :- write('eight').word
(9) :- write('nine').
num_words(Nums) :- % This is top-level predicate.
NDiv
is Nums
// 10, % It prints the first digit unconditionally, dash_num_words(NDiv),% letting you handle the case when the number is zero.
word(NMod).
dash_num_words(0). % When we reach zero, we stop printing.
dash_num_words(Nums) :- % Otherwise, we follow your algorithm
Nums > 0, % with one modification: the dash is printed
NDiv
is Nums
// 10, % unconditionally before printing the digit. dash_num_words(NDiv),
word(NMod),
:- num_words
(123), nl, num_words
(0), nl.
d29yZCgwKSA6LSB3cml0ZSgnemVybycpLgp3b3JkKDEpIDotIHdyaXRlKCdvbmUnKS4Kd29yZCgyKSA6LSB3cml0ZSgndHdvJykuCndvcmQoMykgOi0gd3JpdGUoJ3RocmVlJykuCndvcmQoNCkgOi0gd3JpdGUoJ2ZvdXInKS4Kd29yZCg1KSA6LSB3cml0ZSgnZml2ZScpLgp3b3JkKDYpIDotIHdyaXRlKCdzaXgnKS4Kd29yZCg3KSA6LSB3cml0ZSgnc2V2ZW4nKS4Kd29yZCg4KSA6LSB3cml0ZSgnZWlnaHQnKS4Kd29yZCg5KSA6LSB3cml0ZSgnbmluZScpLgoKbnVtX3dvcmRzKE51bXMpIDotICAgICAgICUgVGhpcyBpcyB0b3AtbGV2ZWwgcHJlZGljYXRlLgogICAgTkRpdiBpcyBOdW1zIC8vIDEwLCAgJSBJdCBwcmludHMgdGhlIGZpcnN0IGRpZ2l0IHVuY29uZGl0aW9uYWxseSwKICAgIGRhc2hfbnVtX3dvcmRzKE5EaXYpLCUgbGV0dGluZyB5b3UgaGFuZGxlIHRoZSBjYXNlIHdoZW4gdGhlIG51bWJlciBpcyB6ZXJvLgogICAgTk1vZCBpcyBOdW1zIG1vZCAxMCwgCiAgICB3b3JkKE5Nb2QpLgoKZGFzaF9udW1fd29yZHMoMCkuICAgICAgICUgV2hlbiB3ZSByZWFjaCB6ZXJvLCB3ZSBzdG9wIHByaW50aW5nLgoKZGFzaF9udW1fd29yZHMoTnVtcykgOi0gICUgT3RoZXJ3aXNlLCB3ZSBmb2xsb3cgeW91ciBhbGdvcml0aG0KICAgIE51bXMgPiAwLCAgICAgICAgICAgICUgd2l0aCBvbmUgbW9kaWZpY2F0aW9uOiB0aGUgZGFzaCBpcyBwcmludGVkCiAgICBORGl2IGlzIE51bXMgLy8gMTAsICAlIHVuY29uZGl0aW9uYWxseSBiZWZvcmUgcHJpbnRpbmcgdGhlIGRpZ2l0LgogICAgZGFzaF9udW1fd29yZHMoTkRpdiksCiAgICBOTW9kIGlzIE51bXMgbW9kIDEwLAogICAgd29yZChOTW9kKSwKICAgIHdyaXRlKCctJykuCiAgICAKOi0gbnVtX3dvcmRzKDEyMyksIG5sLCBudW1fd29yZHMoMCksIG5sLg==