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. read(In), maplist(tell_time, In).
Success #stdin #stdout #stderr 0.02s 30888KB
stdin
['10:23', '8:12', '0:01', '18:45', '13:30', '23:59'].
stdout
It is ten twenty three am.
It is eight twelve am.
It is twelve oh one am.
It is quarter before seven pm.
It is half past one pm.
It is eleven fifty nine pm.
stderr
% halt