:- module( lexicon_vcrphone_english, [output_form/2, input_form/2, yn_answer/1]). :- use_module( library(vcr_languages) ). :- ensure_loaded( library(lexicon_numbers) ). :- ensure_loaded( library(digits_english) ). :- use_module( library(telephone_names) ). :- use_module( library(lists), [ member/2, select/3, append/3 ] ). :- use_module( library(charsio), [ format_to_chars/3 ] ). /*---------------------------------------------------------------------- output_form( +Move, -String ) -- Canned output ----------------------------------------------------------------------*/ output_form( ask(X^(task(X))), "What can I do for you?" ). output_form( ask(task(T)), Str ):- output_form(task(T), StrT ), append( "Do you want to ", StrT, Str0 ), append( Str0, "?", Str). output_form( ask(TaskList), Str ) :- TaskList = [task(_)|_], altlist2altstr_or( TaskList, AltStr ), append( "Do you want to ", AltStr, Str0 ), append( Str0, "?", Str). output_form( ask(quit), "Do you want to quit GoDiS?" ). output_form( ask(X^new_program_position(X)), "What channel do you want?" ). output_form( ask(X^program_position_to_store(X)), "What channel do you want?" ). output_form( ask(X^date_to_store(X)), "What date?" ). output_form( ask(X^start_time_to_store(X)), "What time do you want to start recording?" ). output_form( ask(X^stop_time_to_store(X)), "What time do you want to stop recording?" ). output_form( ask(X^program_number(X)), "What program number to want to delete?" ). output_form( ask(X^new_clock(X)), "What time?" ). output_form( ask(X^base_station_language(X)), "To what language to you want to set the base station display?" ). output_form( ask(X^handset_language(X)), "To what language to you want to set the handset display?" ). output_form( ask(X^ring_volume(X)), "Choose a volume level from 0 to 7." ). output_form( ask(X^earpiece_volume(X)), "Choose a volume level from 0 to 7." ). output_form( ask(X^signal_type(X)), "Please choose signal type: internal, external, message or search signal." ). output_form( ask(X^tone_or_melody(X)), "Please choose a tone or melody: low, medium, high, mixed, jumpy, Einie kleine Nachtmusik, Toccata, Elise, Samba or Blues Rythm." ). output_form( ask( X^phonebook_name_to_add(X) ), "What name do you want to add?" ). output_form( ask( X^phonebook_number_to_add(X) ), "What number do you want to add?" ). output_form( ask( X^phonebook_entry_to_delete(X) ), "Which entry do you want to delete? Please give me a name." ). output_form( ask( X^phonebook_name_to_find(X) ), "What name do you want to search for?" ). output_form( ask(main_menu), "Do you want to choose another domain?" ). output_form( ask( call(Number) ), Cs ) :- format_to_chars( 'The number is ~a. Do you want to call this number?', [Number], Cs ). output_form( task(vcr_top), "go to the VCR manager" ). output_form( task(vcr_change_play_status), "change play status" ). output_form( task(vcr_timer_recording), "go to timer recording" ). output_form( task(vcr_settings), "go to settings" ). output_form( task(vcr_query), "make a query" ). output_form( task(vcr_new_program_position), "change channel" ). output_form( task(vcr_play), "play" ). output_form( task(vcr_stop), "stop" ). output_form( task(vcr_ff), "fast-forward" ). output_form( task(vcr_rew), "rewind" ). output_form( task(vcr_pause_still), "pause" ). output_form( task(vcr_still_adv), "advance" ). output_form( task(vcr_rec), "record" ). output_form( task(vcr_add_program), "add a program" ). output_form( task(vcr_add_program1), "add a program" ). output_form( task(vcr_delete_program), "delete a program" ). output_form( task(vcr_delete_program1), "delete a program" ). output_form( task(vcr_set_clock), "set the clock" ). output_form( task(vcr_query_status), "query the current play status" ). output_form( task(vcr_query_channel), "find out what channel is on" ). output_form( task(tp_top), "go to the telephone manager" ). output_form( task(tp_base_station), "go to the base station" ). output_form( task(tp_handset), "go to the handset" ). output_form( task(tp_phonebook), "go to the phonebook" ). output_form( task(tp_answering_machine), "go to the answering machine" ). %output_form( task(tp_answering_machine_onoff), "switch it on or off" ). output_form( task(tp_answering_machine_switch_on), "switch it on" ). output_form( task(tp_answering_machine_switch_off), "switch it off" ). output_form( task(tp_base_station_settings), "go to base station settings" ). output_form( task(tp_base_station_settings_volume), "set the volume" ). output_form( task(tp_base_station_settings_autoanswer), "switch auto answer on or off" ). output_form( task(tp_base_station_settings_autoanswer_on), "enable auto answer" ). output_form( task(tp_base_station_settings_autoanswer_off), "disable auto answer" ). output_form( task(tp_base_station_settings_basic), "go to basic settings" ). output_form( task(tp_base_station_settings_basic_date), "set the date" ). output_form( task(tp_base_station_settings_basic_language), "change language for the base station display" ). output_form( task(tp_handset_warnings), "manage ringer signals and volume" ). output_form( task(tp_handset_language), "change language for the handset display" ). output_form( task(tp_handset_earpiece_volume), "set the earpiece volume" ). output_form( task(tp_handset_warnings_volume), "set the ringer volume" ). output_form( task(tp_handset_warnings_signals), "manage ringer signals" ). output_form( task(tp_phonebook_new_entry), "add a new entry" ). output_form( task(tp_phonebook_search_entry), "search the phonebook" ). output_form( task(tp_phonebook_delete_entry), "delete an entry" ). output_form( task(main_menu), "choose another domain" ). output_form( inform(already_playing), "The VCR is already playing." ). output_form( inform(now_playing), "The VCR is now playing." ). output_form( inform(already_stopped), "The VCR is already stopped." ). output_form( inform(now_stopped), "The VCR is now stopped." ). output_form( inform(already_ff), "The VCR is already fast-forwarding." ). output_form( inform(now_ff), "The VCR is now fast-forwarding." ). output_form( inform(already_rewinding), "The VCR is already rewinding." ). output_form( inform(now_rewinding), "The VCR is now rewinding." ). output_form( inform(already_paused), "The VCR is already paused." ). output_form( inform(now_paused), "The VCR is now paused." ). output_form( inform(already_recording), "The VCR is already recording." ). output_form( inform(now_recording), "The VCR is now recording." ). output_form( inform(advanced), "OK." ). output_form( inform(not_paused), "The VCR is not paused." ). output_form( inform(no_available_program_slot), "There is no available program slot." ). output_form( inform(clock_was_set), "The clock was set." ). output_form( inform(date_cannot_be_set), "Sorry, the date cannot be set in this version." ). output_form( inform(ok_new_program_position(P)), Cs ) :- format_to_chars( 'Switched to channel ~a.\n', [P], Cs ). output_form( inform(program_added(Position,Date,Start,Stop)), Cs ) :- date_output(Date,DateOutput), ( atom_chars(Start,[Start1,Start2,Start3,Start4]); atom_chars(Start,[Start2,Start3,Start4]), Start1=48), ( atom_chars(Stop,[Stop1,Stop2,Stop3,Stop4]); atom_chars(Stop,[Stop2,Stop3,Stop4]), Stop1=48 ), format_to_chars( 'I will record channel ~a ~a from ~c~c:~c~c to ~c~c:~c~c.', [Position,DateOutput, Start1,Start2,Start3,Start4, Stop1,Stop2,Stop3,Stop4], Cs ). output_form( inform(programs(Programs)), Cs ) :- program_listing( Programs, Listing ), append( "Which program number to you want to delete?", Listing, Cs ). output_form( inform(no_program_to_delete), "There is no program to delete." ). output_form( inform(program_deleted), "The program was deleted." ). output_form( inform(no_such_program), "No program is stored in that position." ). output_form( inform(confirm_status(S)), Cs ) :- status_output(S,SO), format_to_chars( 'Yes, the VCR is ~a.', [SO], Cs ). output_form( inform(status_is(S)), Cs ) :- status_output(S,SO), format_to_chars( 'No, the VCR is ~a.', [SO], Cs ). output_form( inform(current_program_position(P)), Cs ) :- format_to_chars( 'The current channel is ~a.', [P], Cs ). output_form( inform(answering_machine_already_on), "The answering machine is already switched on." ). output_form( inform(answering_machine_now_on), "The answering machine is now switched on." ). output_form( inform(answering_machine_already_off), "The answering machine is already switched off." ). output_form( inform(answering_machine_now_off), "The answering machine is now switched off." ). output_form( inform(autoanswer_already_on), "Auto answer is already enabled." ). output_form( inform(autoanswer_now_on), "Auto answer is now enabled." ). output_form( inform(autoanswer_already_off), "Auto answer is already disabled." ). output_form( inform(autoanswer_now_off), "Auto answer is now disabled." ). output_form( inform(ring_volume_was_set), "The ring volume was set." ). output_form( inform(earpiece_volume_was_set), "The earpiece volume was set." ). output_form( inform(new_earpiece_volume(V)), Cs ) :- format_to_chars( 'The earpiece volume was set to ~a.\n', [V], Cs ). output_form( inform(new_ring_volume(V)), Cs ) :- format_to_chars( 'The handset ring volume was set to ~a.\n', [V], Cs ). output_form( inform(base_station_language_was_set(L)), Cs ) :- capitalize(L,LS), format_to_chars('The base station language was set to ~s.', [LS], Cs ). output_form( inform(handset_language_was_set(L)), Cs ) :- capitalize(L,LS), format_to_chars('The handset language was set to ~s.', [LS], Cs ). output_form( inform(signal_was_set(SignalType,ToneOrMelody)), Cs ) :- %signal_type_string(SignalType,SignalTypeCs), %tone_or_melody move_string( signal_type(SignalType), SignalTypeCs ), move_string( tone_or_melody(ToneOrMelody), ToneOrMelodyCs ), format_to_chars('~s calls will use ~s.',[SignalTypeCs,ToneOrMelodyCs],Cs). output_form( inform(phonebook_entry_added(Name)), String ) :- atom_chars( Name, NameString ), append( NameString, " has been added to the phone book.", String). output_form( inform(phonebook_entry_deleted(Name)), String ) :- atom_chars( Name, NameString ), append( NameString, " has been deleted from the phone book.", String). output_form( inform(phonebook_entry_exists(Name)), String ) :- atom_chars( Name, NameString ), append( NameString, " is in the phone book already.", String). output_form( inform(phonebook_entry_not_found), "No such name was found." ). output_form( inform(now_calling(Name)), Cs ) :- format_to_chars( 'I am now calling ~a.', [Name], Cs ). % silent confirmation of queries and change domain output_form( inform(task(top)), "OK, top level." ):-!. output_form( inform(task(vcr_query)), "" ):-!. output_form( inform(task(vcr_query_channel)), "" ):-!. output_form( inform(task(vcr_query_status)), "" ):-!. output_form( inform(task(main_menu)), "" ):-!. output_form( inform(task(T)), Str ):- % output_form( task(T), TaskStr ), move_string( task(T), TaskStr ), append( "OK, ", TaskStr, Str0 ), append( Str0, ".", Str ). %input_form( [top,level], task(top) ). output_form( inform(task(T)), Str ):- output_form( task(T), TaskStr ), append( "OK, ", TaskStr, Str0 ), append( Str0, ".", Str ). %input_form( [top,level], task(top) ). output_form( inform(task(T)), "" ). output_form( greet, "Welcome to the telephone and VCR manager!" ). output_form( quit, "Good bye!" ). output_form( reqRep(understanding), "Pardon?" ). output_form( reqRep(relevance), "What do you mean by that?" ). output_form( thank, "Thank you very much." ). output_form( confirm, "OK" ). % repeating a move output_form( repeat(Move), Str ):- output_form( Move, Str ). date_output(today,today) :- !. date_output(Date,DateOutput) :- atom_chars(Date,Chars), format_to_chars('~c~c/~c~c',Chars,DateOutputCs), atom_chars(DateOutput,DateOutputCs). status_output(ff,'fast-forwarding') :- !. status_output(S,S). altlist2altstr_and( [D], Str ):- alt2altstr( D, Str1 ),!, append( " and ", Str1, Str ). altlist2altstr_and( [D|Ds], Str ):- alt2altstr( D, Str1 ), altlist2altstr_and( Ds, Str2 ), append( Str1, ", ", Str3 ), append(Str3, Str2, Str ). altlist2altstr_or( [D], Str ):- alt2altstr( D, Str1 ),!, append( " or ", Str1, Str ). altlist2altstr_or( [D|Ds], Str ):- alt2altstr( D, Str1 ), altlist2altstr_or( Ds, Str2 ), append( Str1, ", ", Str3 ), append(Str3, Str2, Str ). alt2altstr( D, Str ):- output_form( D, Str ). alt2altstr( D, Str ):- name( D, Str ). program_listing( [], "" ). program_listing( [N:(Position,Date,Start,Stop)|Programs], Listing ) :- ( atom_chars(Start,[Start1,Start2,Start3,Start4]); atom_chars(Start,[Start2,Start3,Start4]), Start1=48), ( atom_chars(Stop,[Stop1,Stop2,Stop3,Stop4]); atom_chars(Stop,[Stop2,Stop3,Stop4]), Stop1=48 ), atom_chars(Date,[Date1,Date2,Date3,Date4]), % atom_chars(Start,[Start1,Start2,Start3,Start4]), % atom_chars(Stop,[Stop1,Stop2,Stop3,Stop4]), format_to_chars( 'Number ~d: channel ~a, ~c~c/~c~c, from ~c~c:~c~c to ~c~c:~c~c; ', [N,Position, Date1,Date2,Date3,Date4, Start1,Start2,Start3,Start4, Stop1,Stop2,Stop3,Stop4], This ), program_listing( Programs, Rest ), append( This, Rest, Listing ). capitalize(A,[CC|Cs]) :- atom_chars(A,[C|Cs]), cap_char(C,CC). cap_char(A,B) :- A >= 0'a, A =< 0'z, !, B is A - 32. cap_char(A,A). move_string(Answer,String) :- input_form( Words, answer(Answer) ), concat_words( Words, String ). /*---------------------------------------------------------------------- input_form( +Phrase, -Move ) -- Almost canned input ----------------------------------------------------------------------*/ input_form( [svenska], answer(changeto(svenska)) ). output_form( inform(current_language(english)), "OK, switched to English. Jolly good!"). % VCR input_form( [vcr], answer(task(vcr_top)) ). input_form( [play,status], answer(task(vcr_change_play_status)) ). input_form( [timer,recording], answer(task(vcr_timer_recording)) ). input_form( [add,a,program], answer(task(vcr_add_program)) ). input_form( [add,program], answer(task(vcr_add_program)) ). input_form( [delete,program], answer(task(vcr_delete_program)) ). input_form( [delete,a,program],answer(task(vcr_delete_program)) ). input_form( [clock], answer(task(vcr_set_clock)) ). input_form( [change,program], answer(task(vcr_new_program_position)) ). input_form( [switch,program], answer(task(vcr_new_program_position)) ). input_form( [change,channel], answer(task(vcr_new_program_position)) ). input_form( [switch,channel], answer(task(vcr_new_program_position)) ). input_form( [increase,channel],[answer(task(vcr_new_program_position)), answer(incdec(increase))]). input_form( [decrease,channel],[answer(task(vcr_new_program_position)), answer(incdec(decrease))]). input_form( [next,channel], [answer(task(vcr_new_program_position)), answer(incdec(increase))]). input_form( [previous,channel],[answer(task(vcr_new_program_position)), answer(incdec(decrease))]). input_form( [specific,channel],answer(task(vcr_new_specific_program_position)) ). input_form( [play], answer(task(vcr_play)) ). input_form( [stop], answer(task(vcr_stop)) ). input_form( [forward], answer(task(vcr_ff)) ). input_form( [rewind], answer(task(vcr_rew)) ). input_form( [pause], answer(task(vcr_pause_still)) ). input_form( [advance], answer(task(vcr_still_adv)) ). input_form( [record], answer(task(vcr_rec)) ). input_form( [today], answer(date_to_store(today)) ). input_form( [playing], answer(status(playing)) ). input_form( [paused], answer(status(paused)) ). input_form( [stopped], answer(status(stopped)) ). input_form( [rewinding], answer(status(rewinding)) ). input_form( [forwarding], answer(status(ff)) ). input_form( [recording], answer(status(recording)) ). input_form( [query], answer(task(vcr_query)) ). input_form( [what,channel], answer(task(vcr_query_channel)) ). input_form( [which,channel], answer(task(vcr_query_channel)) ). % ??? should be a command input_form( [switch,to,PrCh|L], answer(new_program_position(P)) ) :- program_word(PrCh), input_form( L, answer(number(P)) ). % ??? same here input_form( [record,PrCh|L], answer(program_position_to_store(P)) ) :- program_word(PrCh), input_form( L, answer(number(P)) ). input_form( [from|L], answer(start_time_to_store(T)) ) :- input_form( L, answer(number(T)) ). input_form( [starting,at|L], answer(start_time_to_store(T)) ) :- input_form( L, answer(number(T)) ). input_form( [to|L], answer(stop_time_to_store(T)) ) :- input_form( L, answer(number(T)) ). input_form( [ending,at|L], answer(stop_time_to_store(T)) ) :- input_form( L, answer(number(T)) ). input_form( [PrCh|L], answer(program_position(P)) ) :- program_word(PrCh), input_form( L, answer(number(P)) ). input_form( [clock,to|L], answer(new_clock(C)) ) :- input_form( L, answer(number(C)) ). % Telephone input_form( [telephone], answer(task(tp_top)) ). input_form( [base,station], answer(task(tp_base_station)) ). input_form( [answering,machine], answer(task(tp_answering_machine)) ). input_form( [base,station,settings],answer(task(tp_base_station_settings)) ). input_form( [base,station,volume], answer(task(tp_base_station_settings_volume)) ). input_form( [volume], answer(task_type(volume)) ). input_form( [basic, settings], answer(task(tp_base_station_settings_basic)) ). input_form( [date], answer(task(tp_base_station_settings_basic_date)) ). input_form( [base,station,language],answer(task(tp_base_station_settings_basic_language)) ). input_form( [change,language,for,the,base,station],answer(task(tp_base_station_settings_basic_language)) ). input_form( [language], answer(task_type(language)) ). input_form( [L], answer(language(L)) ) :- vcr_language(L). input_form( [auto,answer], answer(task(tp_base_station_settings_autoanswer)) ). input_form( [automatic,answer], answer(task(tp_base_station_settings_autoanswer)) ). input_form( [handset], answer(task(tp_handset)) ). input_form( [handset,language], answer(task(tp_handset_language)) ). input_form( [change,language,for,the,handset], answer(task(tp_handset_language)) ). input_form( [earpiece,volume], answer(task(tp_handset_earpiece_volume)) ). input_form( [phonebook], answer(task(tp_phonebook)) ). input_form( [search,the,phonebook], answer(task(tp_phonebook_search_entry)) ). input_form( [search,the,phone,book],answer(task(tp_phonebook_search_entry)) ). input_form( [search,for], answer(task(tp_phonebook_search_entry)) ). input_form( [what, phonenumber], answer(task(tp_phonebook_search_entry)) ).%011217 input_form( [what, number], answer(task(tp_phonebook_search_entry)) ).%011217 input_form( [add,a,new,entry], answer(task(tp_phonebook_new_entry)) ). input_form( [add,new,entry], answer(task(tp_phonebook_new_entry)) ). input_form( [add,an,entry], answer(task(tp_phonebook_new_entry)) ). input_form( [add,entry], answer(task(tp_phonebook_new_entry)) ). input_form( [add,a,new,name], answer(task(tp_phonebook_new_entry)) ). input_form( [add,new,name], answer(task(tp_phonebook_new_entry)) ). input_form( [add,a,new,number], answer(task(tp_phonebook_new_entry)) ). input_form( [add,new,number], answer(task(tp_phonebook_new_entry)) ). input_form( [delete,an,entry], answer(task(tp_phonebook_delete_entry)) ). input_form( [delete,entry], answer(task(tp_phonebook_delete_entry)) ). input_form( [delete,Name,from,the,phonebook], [answer(task(tp_phonebook_delete_entry))|NameAns] ):- input_form([Name],NameAns). input_form( [ringer], answer(task(tp_handset_warnings)) ). input_form( [ringer,signals], answer(task(tp_handset_warnings_signals)) ). input_form( [ringer,volume], answer(task(tp_handset_warnings_volume)) ). input_form( [low], answer(tone_or_melody(low)) ). input_form( [medium], answer(tone_or_melody(medium)) ). input_form( [high], answer(tone_or_melody(high)) ). input_form( [mixed], answer(tone_or_melody(mixed)) ). input_form( [jumpy], answer(tone_or_melody(jumpy)) ). input_form( [nachtmusik], answer(tone_or_melody(eine_kleine_nachtmusik)) ). input_form( [toccata], answer(tone_or_melody(toccata)) ). input_form( [elise], answer(tone_or_melody(elise)) ). input_form( [samba], answer(tone_or_melody(samba)) ). input_form( [blues,rythm], answer(tone_or_melody(blues_rythm)) ). input_form( [internal], answer(signal_type(internal)) ) . input_form( [external], answer(signal_type(external)) ) . input_form( [message], answer(signal_type(message)) ) . input_form( [search,signal], answer(signal_type(search_signal)) ) . input_form( [add|L], answer(phonebook_name_to_add(N)) ) :- input_form( L, answer(name(N)) ). input_form( [delete|L], answer(phonebook_entry_to_delete(N)) ) :- input_form( L, answer(name(N)) ). input_form( [CallDial|L], answer(phonebook_name_to_find(N)) ) :- call_word(CallDial), input_form( L, answer(name(N)) ). %input_form( [call], answer(call) ). input_form( [Name], answer(name(Name)) ) :- lex_name(Name). % Common input_form( [settings], answer(task_type(settings)) ). input_form( [domain], answer(task(main_menu))). input_form( [switch,on], answer(onoff(on)) ). input_form( [switch,off], answer(onoff(off)) ). input_form( [switch,it,on], answer(onoff(on)) ). input_form( [switch,it,off], answer(onoff(off)) ). input_form( [turn,on], answer(onoff(on)) ). input_form( [turn,off], answer(onoff(off)) ). input_form( [turn,it,on], answer(onoff(on)) ). input_form( [turn,it,off], answer(onoff(off)) ). input_form( [enable], answer(onoff(on)) ). input_form( [disable], answer(onoff(off)) ). input_form( [increase], answer(incdec(increase)) ). input_form( [decrease], answer(incdec(decrease)) ). %input_form( S, M ) :- % lexsem( S, C ), % input_move( C, M ). % numbers %input_form(['Num'],answer(number(N))). input_form( S, answer(number(N)) ) :- number_form( S, N ). % simple stuff input_form( [hi], greet ). input_form( [hello], greet ). input_form( [bye], quit ). input_form( [goodbye], quit ). input_form( [quit], quit ). input_form( [what,did,you,say], reqRep ). input_form( ['what?'], reqRep ). input_form( [sorry], reqRep ). input_form( [pardon], reqRep ). input_form( [yes], answer(yes) ). input_form( [no], answer(no) ). input_form( [okay], ack ). input_form( [ok], ack ). input_form( [aha], ack ). program_word(program). program_word(channel). call_word(call). call_word(dial). /*---------------------------------------------------------------------- lexsem( ?Word, ?Concept ) -- Lexical semantics ----------------------------------------------------------------------*/ lexsem( Word, Concept ):- synset( Words, Concept ), member( Word, Words ). synset( [[vcr],[video],[v,c,r]], vcr ). synset( [[phone],[telephone]], telephone ). % yes or no answer yn_answer(A):- A = 'yes'; A = 'no'. % from concept to string (pick the first synonym) concept_string( Concept, String ) :- synset( [Words|_], Concept ), concat_words( Words, String ). concat_words( [Word], String ) :- atom_chars( Word, String ). concat_words( [Word|Words], String ) :- atom_chars( Word, S1 ), concat_words( Words, S2 ), append( S1, [ 0' | S2 ], String ). /*---------------------------------------------------------------------- - Domain concepts ----------------------------------------------------------------------*/ task(T) :- domain_vcrphone:task(T). %language(L) :- % domain_vcrphone:language(L). sublist( SubList, List ) :- append( _, Suffix, List ), append( SubList, _, Suffix ). program_position(P) :- to_number(P,N), integer(N), N >= 1, N =< 99. program_number(P) :- to_number(P,N), integer(N), N >= 1, N =< 8. ring_volume(V) :- to_number(V,N), integer(N), N >= 0, N =< 7. earpiece_volume(V) :- to_number(V,N), integer(N), N >= 0, N =< 7. date(today). date(D) :- number_atom(D), atom_chars(D,[D1,D2,D3,D4]), number_chars(Day,[D1,D2]), Day >= 1, Day =< 31, number_chars(Month,[D3,D4]), Month >= 1, Month =< 12. time(T) :- number_atom(T), atom_chars(T,[T1,T2,T3,T4]), number_chars(Hour,[T1,T2]), Hour >= 0, Hour =< 23, number_chars(Min,[T3,T4]), Min >= 0, Min =< 59. time(T) :- number_atom(T), atom_chars(T,[T2,T3,T4]), T1=48, number_chars(Hour,[T1,T2]), Hour >= 0, Hour =< 23, number_chars(Min,[T3,T4]), Min >= 0, Min =< 59. to_number(Atom,Number) :- number_atom(Atom), atom_chars(Atom,Cs), number_chars(Number,Cs). number_atom(A) :- atomic(A), \+ number(A).