:- module( lexicon_vcrphone_english, [output_form/2, input_form/2, input_form2/3, digit_word/2, yn_answer/1, time/1]). :- use_module( library(vcr_languages) ). :- 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(X^new_program_position(X)), "What program position do you want?" ). output_form( ask(X^program_position_to_store(X)), "What program position 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 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 the telephone manager" ). output_form( task(tp_base_station), "go 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), "OK. The VCR is now playing." ). output_form( inform(already_stopped), "The VCR is already stopped." ). output_form( inform(now_stopped), "OK. The VCR is now stopped." ). output_form( inform(already_ff), "The VCR is already fast-forwarding." ). output_form( inform(now_ff), "OK. The VCR is now fast-forwarding." ). output_form( inform(already_rewinding), "The VCR is already rewinding." ). output_form( inform(now_rewinding), "OK. The VCR is now rewinding." ). output_form( inform(already_paused), "The VCR is already paused." ). output_form( inform(now_paused), "OK. The VCR is now paused." ). output_form( inform(already_recording), "The VCR is already recording." ). output_form( inform(now_recording), "OK. 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), "OK. The clock was set." ). output_form( inform(ok_new_program_position(P)), Cs ) :- format_to_chars( 'OK. 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(Stop,[Stop1,Stop2,Stop3,Stop4]), format_to_chars( 'OK, 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?\n", Listing, Cs ). output_form( inform(no_program_to_delete), "There is no program to delete." ). output_form( inform(program_deleted), "OK. 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), "OK. 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), "OK. The answering machine is now switched off." ). output_form( inform(autoanswer_already_on), "Auto answer is already enabled." ). output_form( inform(autoanswer_now_on), "OK. Auto answer is now enabled." ). output_form( inform(autoanswer_already_off), "Auto answer is already disabled." ). output_form( inform(autoanswer_now_off), "OK. Auto answer is now disabled." ). output_form( inform(ring_volume_was_set), "OK. The ring volume was set." ). output_form( inform(earpiece_volume_was_set), "OK. The earpiece volume was set." ). output_form( inform(new_earpiece_volume(V)), Cs ) :- format_to_chars( 'OK. The earpiece volume was set to ~a.\n', [V], Cs ). output_form( inform(new_ring_volume(V)), Cs ) :- format_to_chars( 'OK. 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('OK. 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('OK. 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('OK. ~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 ). output_form( greet, "Welcome to the telephone and VCR manager!" ). output_form( quit, "Good bye!" ). output_form( reqRep(understanding), "I didnt understand what you said. Please rephrase." ). 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(Date,[Date1,Date2,Date3,Date4]), atom_chars(Start,[Start1,Start2,Start3,Start4]), atom_chars(Stop,[Stop1,Stop2,Stop3,Stop4]), format_to_chars( 'Number ~d: position ~a, ~c~c/~c~c, from ~c~c:~c~c to ~c~c:~c~c;\n', [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(Move,String) :- input_form( Words, answer(Move) ), concat_words( Words, String ). /*---------------------------------------------------------------------- input_form( +Phrase, -Move ) -- Almost canned input ----------------------------------------------------------------------*/ % 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)) ). % 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], 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( [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( [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( [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( [delete,an,entry], answer(task(tp_phonebook_delete_entry)) ). input_form( [delete,entry], answer(task(tp_phonebook_delete_entry)) ). 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], answer(signal_type(search_signal)) ) . %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_form( C, M ). % 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 ). % more complex parsing input_form2( [from] + answer(number(T)), answer(start_time_to_store(T)), time(T) ). input_form2( [to] + answer(number(T)), answer(stop_time_to_store(T)), time(T) ). input_form2( [switch,to,[program,channel]] + answer(number(P)), answer(new_program_position(P)), true ). input_form2( [record,[program,channel]] + answer(number(P)), answer(program_position_to_store(P)), true ). input_form2( [[program,channel]] + answer(number(P)), answer(program_position(P)), true ). input_form2( [delete,program,maybe(number)] + answer(number(N)), answer(program_number(N)), true ). input_form2( [clock,to] + answer(number(C)), answer(new_clock(C)), true ). input_form2( [add] + answer(name(N)), answer(phonebook_name_to_add(N)), true ). input_form2( [delete] + answer(name(N)), answer(phonebook_entry_to_delete(N)), true ). input_form2( [[call,dial]] + answer(name(N)), [ answer(call(_)), answer(phonebook_name_to_find(N)) ], true ). program_word(program). program_word(channel). % numbers digit_word(zero,0'0). digit_word(one,0'1). digit_word(two,0'2). digit_word(three,0'3). digit_word(four,0'4). digit_word(five,0'5). digit_word(six,0'6). digit_word(seven,0'7). digit_word(eight,0'8). digit_word(nine,0'9). /*---------------------------------------------------------------------- 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. to_number(Atom,Number) :- number_atom(Atom), atom_chars(Atom,Cs), number_chars(Number,Cs). number_atom(A) :- atomic(A), \+ number(A).