word( 0 , '' ) :- ! .
word( 1 , 'one' ) :- ! .
word( 2 , 'two' ) :- ! .
word( 3 , 'three' ) :- ! .
word( 4 , 'four' ) :- ! .
word( 5 , 'five' ) :- ! .
word( 6 , 'six' ) :- ! .
word( 7 , 'seven' ) :- ! .
word( 8 , 'eight' ) :- ! .
word( 9 , 'nine' ) :- ! .
word( 10 , 'ten' ) :- ! .
word( 11 , 'eleven' ) :- ! .
word( 12 , 'twelve' ) :- ! .
prefix
( N
, 'twen' ) :- 2 is N div
10 , ! . prefix
( N
, 'thir' ) :- ( N
is 13 ; 3 is N div
10 ) , ! . prefix
( N
, 'fif' ) :- ( N
is 15 ; 5 is N div
10 ) , ! . prefix
( N
, W
) :- N
< 20 , ! , M
is N
mod 10 , word
( M
, W
) . prefix
( N
, W
) :- ! , M
is N div
10 , word
( M
, W
) .
postfix( 18 , 'een' ) :- ! .
postfix( N, 'teen' ) :- N > 12 , N < 20 , ! .
postfix
( N
, 'y' ) :- 8 is N div
10 , ! . postfix( _, 'ty' ) :- ! .
hour( 0 , W) :- ! , word( 12 , W) .
hour( H, W) :- ! , word( H, W) .
minute( 0 , '' ) :- ! .
minute( M, W) :- M < 10 , ! ,
word( M, Mw) , swritef( W, 'oh %w' , [ Mw] ) .
minute( M, W) :- M < 13 , ! , word( M, W) .
minute( M, W) :- M < 20 , ! ,
prefix( M, Pre) , postfix( M, Post) ,
swritef( W, '%w%w' , [ Pre, Post] ) .
minute( M, W) :- M < 60 , ! ,
prefix( M, Pre) , postfix( M, Post) ,
%word(SndN, Snd), swritef(W, '%w%w %w', [Pre, Post, Snd]).
( SndN
is 0 , ! , swritef
( W
, '%w%w' , [ Pre
, Post
] ) ; ! , word( SndN, Snd) , swritef( W, '%w%w %w' , [ Pre, Post, Snd] ) ) .
mer( H, S) :- H < 12 , ! , S = 'am' .
mer( _, S) :- S = 'pm' .
% time format: HH:MM
tell_time( T) :-
split_string( T, ':' , '' , [ Hstr, Mstr] ) ,
number_string( H, Hstr) , H >= 0 , H < 24 , number_string( M, Mstr) ,
mer
( H
, Mer
) , H_
is H
mod 12 , tell_time
( H_
, M
, Mer
) , write ( '\n' ) .
tell_time( H, 30 , Mer) :- ! ,
hour( H, Hw) , writef( 'It is half past %w %w.' , [ Hw, Mer] ) .
tell_time( H, 15 , Mer) :- ! ,
hour( H, Hw) , writef( 'It is quarter past %w %w.' , [ Hw, Mer] ) .
tell_time( H, 45 , Mer) :- ! ,
NextH
is H
+ 1 , hour
( NextH
, Hw
) , writef( 'It is quarter before %w %w.' , [ Hw, Mer] ) .
tell_time( H, 0 , Mer) :- ! ,
hour( H, Hw) , writef( 'It is %w %w' , [ Hw, Mer] ) .
tell_time( H, M, Mer) :- ! ,
hour( H, Hw) , minute( M, Mw) ,
writef( 'It is %w %w %w.' , [ Hw, Mw, Mer] ) .
program :-
read ( In
) , maplist
( tell_time
, In
) .
d29yZCgwLCAnJykgOi0gIS4Kd29yZCgxLCAnb25lJykgOi0gIS4Kd29yZCgyLCAndHdvJykgOi0gIS4Kd29yZCgzLCAndGhyZWUnKSA6LSAhLgp3b3JkKDQsICdmb3VyJykgOi0gIS4Kd29yZCg1LCAnZml2ZScpIDotICEuCndvcmQoNiwgJ3NpeCcpIDotICEuCndvcmQoNywgJ3NldmVuJykgOi0gIS4Kd29yZCg4LCAnZWlnaHQnKSA6LSAhLgp3b3JkKDksICduaW5lJykgOi0gIS4Kd29yZCgxMCwgJ3RlbicpIDotICEuCndvcmQoMTEsICdlbGV2ZW4nKSA6LSAhLgp3b3JkKDEyLCAndHdlbHZlJykgOi0gIS4KCnByZWZpeChOLCAndHdlbicpIDotIDIgaXMgTiBkaXYgMTAsICEuCnByZWZpeChOLCAndGhpcicpIDotIChOIGlzIDEzIDsgMyBpcyBOIGRpdiAxMCksICEuCnByZWZpeChOLCAnZmlmJykgOi0gKE4gaXMgMTUgOyA1IGlzIE4gZGl2IDEwKSwgIS4KcHJlZml4KE4sIFcpIDotIE4gPCAyMCwgISwgTSBpcyBOIG1vZCAxMCwgd29yZChNLCBXKS4KcHJlZml4KE4sIFcpIDotICEsIE0gaXMgTiBkaXYgMTAsIHdvcmQoTSwgVykuCgpwb3N0Zml4KDE4LCAnZWVuJykgOi0gIS4KcG9zdGZpeChOLCAndGVlbicpIDotIE4gPiAxMiwgTiA8IDIwLCAhLgpwb3N0Zml4KE4sICd5JykgOi0gOCBpcyBOIGRpdiAxMCwgIS4KcG9zdGZpeChfLCAndHknKSA6LSAhLgoKaG91cigwLCBXKSA6LSAhLCB3b3JkKDEyLCBXKS4KaG91cihILCBXKSA6LSAhLCB3b3JkKEgsIFcpLgoKbWludXRlKDAsICcnKSA6LSAhLgptaW51dGUoTSwgVykgOi0gTSA8IDEwLCAhLAogICAgd29yZChNLCBNdyksIHN3cml0ZWYoVywgJ29oICV3JywgW013XSkuCm1pbnV0ZShNLCBXKSA6LSBNIDwgMTMsICEsIHdvcmQoTSwgVykuCm1pbnV0ZShNLCBXKSA6LSBNIDwgMjAsICEsCiAgICBwcmVmaXgoTSwgUHJlKSwgcG9zdGZpeChNLCBQb3N0KSwKICAgIHN3cml0ZWYoVywgJyV3JXcnLCBbUHJlLCBQb3N0XSkuIAptaW51dGUoTSwgVykgOi0gTSA8IDYwLCAhLAogICAgcHJlZml4KE0sIFByZSksIHBvc3RmaXgoTSwgUG9zdCksCiAgICBTbmROIGlzIE0gbW9kIDEwLAogICAgJXdvcmQoU25kTiwgU25kKSwgc3dyaXRlZihXLCAnJXcldyAldycsIFtQcmUsIFBvc3QsIFNuZF0pLgogICAgKCBTbmROIGlzIDAsICEsIHN3cml0ZWYoVywgJyV3JXcnLCBbUHJlLCBQb3N0XSkgOwogICAgICAgICEsIHdvcmQoU25kTiwgU25kKSwgc3dyaXRlZihXLCAnJXcldyAldycsIFtQcmUsIFBvc3QsIFNuZF0pICkuCgptZXIoSCwgUykgOi0gSCA8IDEyLCAhLCBTID0gJ2FtJy4KbWVyKF8sIFMpIDotIFMgPSAncG0nLgoKJSB0aW1lIGZvcm1hdDogSEg6TU0KdGVsbF90aW1lKFQpIDotCiAgICBzcGxpdF9zdHJpbmcoVCwgJzonLCAnJywgW0hzdHIsIE1zdHJdKSwKICAgIG51bWJlcl9zdHJpbmcoSCwgSHN0ciksIEggPj0gMCwgSCA8IDI0LCBudW1iZXJfc3RyaW5nKE0sIE1zdHIpLAogICAgbWVyKEgsIE1lciksIEhfIGlzIEggbW9kIDEyLAogICAgdGVsbF90aW1lKEhfLCBNLCBNZXIpLCB3cml0ZSgnXG4nKS4KCnRlbGxfdGltZShILCAzMCwgTWVyKSA6LSAhLAogICAgaG91cihILCBIdyksIHdyaXRlZignSXQgaXMgaGFsZiBwYXN0ICV3ICV3LicsIFtIdywgTWVyXSkuCgp0ZWxsX3RpbWUoSCwgMTUsIE1lcikgOi0gISwKICAgIGhvdXIoSCwgSHcpLCB3cml0ZWYoJ0l0IGlzIHF1YXJ0ZXIgcGFzdCAldyAldy4nLCBbSHcsIE1lcl0pLgoKdGVsbF90aW1lKEgsIDQ1LCBNZXIpIDotICEsCiAgICBOZXh0SCBpcyBIICsgMSwgaG91cihOZXh0SCwgSHcpLAogICAgd3JpdGVmKCdJdCBpcyBxdWFydGVyIGJlZm9yZSAldyAldy4nLCBbSHcsIE1lcl0pLgoKdGVsbF90aW1lKEgsIDAsIE1lcikgOi0gISwKICAgIGhvdXIoSCwgSHcpLCB3cml0ZWYoJ0l0IGlzICV3ICV3JywgW0h3LCBNZXJdKS4KCnRlbGxfdGltZShILCBNLCBNZXIpIDotICEsCiAgICBob3VyKEgsIEh3KSwgbWludXRlKE0sIE13KSwKICAgIHdyaXRlZignSXQgaXMgJXcgJXcgJXcuJywgW0h3LCBNdywgTWVyXSkuCgpwcm9ncmFtIDotCiAgICByZWFkKEluKSwgbWFwbGlzdCh0ZWxsX3RpbWUsIEluKS4=