fork download
  1. word(0, '') :- !.
  2. word(1, 'one') :- !.
  3. word(2, 'two') :- !.
  4. word(3, 'three') :- !.
  5. word(4, 'four') :- !.
  6. word(5, 'five') :- !.
  7. word(6, 'six') :- !.
  8. word(7, 'seven') :- !.
  9. word(8, 'eight') :- !.
  10. word(9, 'nine') :- !.
  11. word(10, 'ten') :- !.
  12. word(11, 'eleven') :- !.
  13. word(12, 'twelve') :- !.
  14.  
  15. prefix(N, 'twen') :- 2 is N div 10, !.
  16. prefix(N, 'thir') :- (N is 13 ; 3 is N div 10), !.
  17. prefix(N, 'fif') :- (N is 15 ; 5 is N div 10), !.
  18. prefix(N, W) :- N < 20, !, M is N mod 10, word(M, W).
  19. prefix(N, W) :- !, M is N div 10, word(M, W).
  20.  
  21. postfix(18, 'een') :- !.
  22. postfix(N, 'teen') :- N > 12, N < 20, !.
  23. postfix(N, 'y') :- 8 is N div 10, !.
  24. postfix(_, 'ty') :- !.
  25.  
  26. hour(0, W) :- !, word(12, W).
  27. hour(H, W) :- !, word(H, W).
  28.  
  29. minute(0, '') :- !.
  30. minute(M, W) :- M < 10, !,
  31. word(M, Mw), swritef(W, 'oh %w', [Mw]).
  32. minute(M, W) :- M < 13, !, word(M, W).
  33. minute(M, W) :- M < 20, !,
  34. prefix(M, Pre), postfix(M, Post),
  35. swritef(W, '%w%w', [Pre, Post]).
  36. minute(M, W) :- M < 60, !,
  37. prefix(M, Pre), postfix(M, Post),
  38. SndN is M mod 10,
  39. %word(SndN, Snd), swritef(W, '%w%w %w', [Pre, Post, Snd]).
  40. ( SndN is 0, !, swritef(W, '%w%w', [Pre, Post]) ;
  41. !, word(SndN, Snd), swritef(W, '%w%w %w', [Pre, Post, Snd]) ).
  42.  
  43. mer(H, S) :- H < 12, !, S = 'am'.
  44. mer(_, S) :- S = 'pm'.
  45.  
  46. % time format: HH:MM
  47. tell_time(T) :-
  48. split_string(T, ':', '', [Hstr, Mstr]),
  49. number_string(H, Hstr), H >= 0, H < 24, number_string(M, Mstr),
  50. mer(H, Mer), H_ is H mod 12,
  51. tell_time(H_, M, Mer), write('\n').
  52.  
  53. tell_time(H, 30, Mer) :- !,
  54. hour(H, Hw), writef('It is half past %w %w.', [Hw, Mer]).
  55.  
  56. tell_time(H, 15, Mer) :- !,
  57. hour(H, Hw), writef('It is quarter past %w %w.', [Hw, Mer]).
  58.  
  59. tell_time(H, 45, Mer) :- !,
  60. NextH is H + 1, hour(NextH, Hw),
  61. writef('It is quarter before %w %w.', [Hw, Mer]).
  62.  
  63. tell_time(H, 0, Mer) :- !,
  64. hour(H, Hw), writef('It is %w %w', [Hw, Mer]).
  65.  
  66. tell_time(H, M, Mer) :- !,
  67. hour(H, Hw), minute(M, Mw),
  68. writef('It is %w %w %w.', [Hw, Mw, Mer]).
  69.  
  70. program :-
  71. maplist(tell_time, ['00:00', '01:30', '12:05', '14:01', '20:29', '21:00', '13:45', '17:15']).
Success #stdin #stdout #stderr 0.02s 30888KB
stdin
Standard input is empty
stdout
It is twelve am
It is half past one am.
It is twelve oh five pm.
It is two oh one pm.
It is eight twenty nine pm.
It is nine pm
It is quarter before two pm.
It is quarter past five pm.
stderr
% halt