This short posting is about a useful piece of SWI-Prolog code I keep (re-)using, ever since I wrote it. It is a predicate that converts time (in an EXCEL-compatible format ‘HH:MM’ or ‘HH:MM:SS’) to integers expressing minutes only, e.g. integers suitable for use in CLP applications (Constraints Logic Programming over finite integer domains). I am developing a serious CLP application, during the last few weeks and I regard the following (bi-directional) conversion code as indispensable:
%%% Conversion of Hours-and-minutes to integers and vice-versa (e.g. for CLP problems)
%%% converts number of minutes to a valid time-string e.g. '03:05':
mins2hourmin(MINS,OUTX):- nonvar(MINS), MINS > 0, Hours is MINS // 60, Minsx is MINS mod 60, num2str2(Hours,S1x), num2str2(Minsx,S2x), swritef(OUTX,'%w:%w',[S1x,S2x]), ! ; MINS = 0, OUTX = '00:00', !. mins2hourmin(HMINx,HRi):- nonvar(HRi), sub_atom(HRi,0,2,_,A1x), atom_number(A1x,HOURx), sub_atom(HRi,3,2,_,A2x), atom_number(A2x,MINSx), HMINx is MINSx + 60*HOURx, !. mins2hourmin(MINS1,OUTX):- nonvar(MINS1), MINS1 < 0, MINS is -MINS1, Hours is MINS // 60, Minsx is MINS mod 60, num2str2(Hours,S1x), num2str2(Minsx,S2x), swritef(OUTX,'-%w:%w',[S1x,S2x]), !.
%% the same predicate operating on Lists of time-entities:
mins2hourmin_list(,):- !. mins2hourmin_list([M|ML],[X|XL]):- mins2hourmin(M,X), !, mins2hourmin_list(ML,XL).
%%% an auxilliary predicate for mins2hourmin/2: num2str2(N,Sx):- N >= 10, swritef(Sx,'%w',[N]), ! ; swritef(Sx,'0%w',[N]), !.