/*************************************************************************

            name: lexicon_cellphone_english.pl 
         version: 28 May, 2001
     description: English lexicon for Mini Mobile Phone
         authors: Staffan Larsson, Stina Ericsson
 
*************************************************************************/

%:- module( lexicon_cellphone_english, [output_form/2, input_form/2, yn_answer/1] ).


:- module( lexicon_cellphone_english, [output_form/2,
				       input_form/2,
				       input_form2/3,
				       yn_answer/1,
				       language/2,
				       digit_word/2
				      ]).

:- use_module( library(lists), [ member/2, select/3, append/3 ] ).

/*----------------------------------------------------------------------
     output_form( +Move, -String )
----------------------------------------------------------------------*/




%%% greet
output_form( greet, "Welcome to the cellphone!" ).

%%% quit
output_form( quit, "Bye!" ).

%%% reqRep(relevance)
output_form( reqRep(relevance), "What do you mean by that?"). 

%%% reqRep(understanding)
output_form( reqRep(understanding),
	     "I'm sorry, I don't understand. Could you say it in a different way?").


%%% inform
output_form( inform( calling( NameOrNum ) ), String ) :-
	name( NameOrNum, NameOrNumString ),
	append("I am now calling ", NameOrNumString, String).
output_form( inform( code_correct ),
	     "The code is correct" ).
output_form( inform( code_incorrect ),
	     "The code is incorrect" ).
output_form( inform(entry_added(Name)), String ) :-
	name( Name, NameString ),
	append( NameString, " has been added to the phone book", String).
output_form( inform(entry_deleted(Name)), String ) :-
	name( Name, NameString ),
	append( NameString, " has been deleted from the phone book", String).
output_form( inform( new_language(L) ), String ) :-
	name(L, LString),
	append("The language is now ", LString, String).
output_form( inform( phone_reset ),
	     "You have now reset all the settings" ).
output_form( inform( security_code_changed ),
	     "You have now changed the security code" ).



%%% ask

% yn-questions
output_form( ask( call ), "Do you want to call this number?" ).
output_form( ask( change_language(L) ), String ) :-
	name(L, LString),
	append( "Do you want to change the language to ", LString, Str0),
	append(Str0, "?", String).
%output_form( ask( change_language ), "Do you want to change the phone's language?" ).
%output_form( ask( change_security_code ), "Do you want to change the security code?" ).



% wh-questions
output_form( ask( X^call(X) ), "Who do you want to call? Please give me a name or a number.").
output_form( ask( X^current_security_code(X) ), "What is the current security code?" ).
output_form( ask( X^entry_to_delete(X) ),
	     "Which entry do you want to delete? Please give me a name." ).
output_form( ask( X^language(X) ), "What language do you want to change to?" ).
output_form( ask( X^name_to_add(X) ), "What name do you want to add?" ).
output_form( ask( X^new_security_code(X) ), "What security code do you want instead?" ).
output_form( ask( X^number_to_add(X) ), "What number do you want to add?" ).
output_form( ask( X^search_for_name(X) ), "What name do you want to search for?" ).
output_form( ask( X^the_security_code(X) ), "I need the security code" ).

% wh-questions; ask for task
output_form( ask( X^(task=X) ), "What do you want to do?" ).
output_form( ask( X^(task(X)) ), "What do you want to do?" ).

%%% ask about task

output_form( ask( [ task(search_phonebook),
		    task(add_new_entry),
		    task(delete_entry) ] ),
	     "Do you want to search the phonebook, add a new entry, or delete an entry?").

% security_settings
%output_form( ask( task(change_security_code) ),
%	     "Say 'change the security code' if you want to change the security code" ).
output_form( ask( [ task(change_security_code) ] ),
	     "Say 'change the security code' if you want to change the security code" ).


% settings
output_form( ask( [ task(telephone_settings),
		    task(security_settings),
		    task(reset) ] ),
	     "Do you want to go to telephone settings, security settings, or reset?").

% telephone_settings
output_form( ask( [ task(change_language) ] ),
	     "Say 'change the language' if you want to change the language" ).


% top
output_form( ask( [ task(call), task(phonebook),
		    task(settings)%, task(tone_control)
		  ] ),
	     %"Where do you want to go? Phone book, settings or tone control?" ).
	     "Where do you want to go? Phone book or settings?" ).

output_form( ask(main_menu), "Do you want to choose another domain?" ).





%%% task clarification

%SE (to handle a list of one task)
% (list format needed to get the task defined
%  as a task in dominates relations)
output_form( ask([task(T)]), Str ):-
	output_form(task(T), StrT ),
	append( "Do you want to ", StrT, Str0 ),
	append( Str0, " ?", Str).
	    
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( task(add_new_entry), "add a new entry").
output_form( task(call), "make a phone call" ).
output_form( task(change_language), "change the language" ).
output_form( task(change_security_code), "change the security code" ).
output_form( task(delete_entry), "delete an entry").
output_form( task(phonebook), "go to phonebook" ).
output_form( task(reset), "reset the phone" ).
output_form( task(search_phonebook), "search the phonebook").
output_form( task(security_settings), "go to security settings" ).
output_form( task(settings), "go to settings" ).
output_form( task(telephone_settings), "go to telephone settings" ).
output_form( task(tone_control), "go to tone control" ).
output_form( task(main_menu), "choose another domain" ).

%% repeating a move

output_form( repeat(Move), Str ):-
	output_form( Move, Str ).




%%% answer
%output_form( answer( X^(entry_addedDB(X)), entry_addedDB(_) ),
%	     "The entry has been added" ).
%output_form( answer( X^(entry_addedDB(X)), fail ),
%	    "I'm sorry, I cannot add that name and number to the phone book" ). 
%output_form( answer( X^(entry_deletedDB(X)), entry_deletedDB(_) ),
%	     "The entry has been deleted" ).
%output_form( answer( X^(entry_deletedDB(X)), fail ),
%	    "I'm sorry, the name you want to delete is not in the phone book" ). 
output_form( answer( X^(pb_numberDB(X)), pb_numberDB(Number) ), String) :-
%	name(Number, NumberString),
	number( Number ), number_chars_nice( Number, NumberStr ),
	append("The number is ", NumberStr, String).
output_form( answer( X^(pb_numberDB(X)), fail ),
	     "I'm sorry, the name is not in the phone book" ).
	     

%%%% other

output_form( answer( _^alts(_,_), alts(_,AltList) ) , Str ):-
	altlist2altstr_and( AltList, AltStr ),
	append( "The alternatives are: ", AltStr, Str1 ),
	append( Str1, ".", Str ).


altlist2altstr_and( [D], Str ):-
	alt2altstr( D, Str1 ),
	append( " och ", 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 ):-
	atomic(D),
	name( D, Str ).




/*----------------------------------------------------------------------
     input_form( +Phrase, -Move )
----------------------------------------------------------------------*/

% 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).


%%% greet
input_form( Hello, greet ) :- lexsem( Hello, hello ).

%%% quit
input_form( Bye, quit ) :- lexsem( Bye, bye ).

%%% yes and no
input_form( [yes], answer(yes) ).
input_form( [no], answer(no) ).

%%% acknowledge
input_form( [okay], ack).
input_form( [ok], ack).

%%% reqRep
input_form( Repeat, reqRep ) :- lexsem( Repeat, repeat ).



%%% tasks


% phonebook
input_form( [search,the,phonebook], answer(task(search_phonebook)) ).
input_form( [search,the,phone,book], answer(task(search_phonebook)) ).
%input_form( [search], answer(task(search_phonebook)) ).
input_form( [add,a,new,entry], answer(task(add_new_entry)) ).
input_form( [add,new,entry], answer(task(add_new_entry)) ).
input_form( [add,an,entry], answer(task(add_new_entry)) ).
input_form( [add,entry], answer(task(add_new_entry)) ).
input_form( [add], answer(task(add_new_entry)) ).
input_form( [delete,an,entry], answer(task(delete_entry)) ).
input_form( [delete,entry], answer(task(delete_entry)) ).
input_form( [delete], answer(task(delete_entry)) ).
input_form( [domain], answer(task(main_menu))).


% security_settings
input_form( [change,the,security,code], answer(task(change_security_code)) ).
input_form( [change,security,code], answer(task(change_security_code)) ).



% settings
input_form( [telephone,settings], answer(task(telephone_settings)) ).
input_form( [security,settings], answer(task(security_settings)) ).
input_form( [reset], answer(task(reset)) ).


% telephone_settings
input_form( [change,the,phones,language], answer(task(change_language)) ).
input_form( [change,the,language], answer(task(change_language)) ).
input_form( [change,language], answer(task(change_language)) ).


% tone_control



% top
input_form( [call], answer(task(call)) ).
input_form( [make,a,call], answer(task(call)) ).
input_form( [make,a,phonecall], answer(task(call)) ).
input_form( [call,someone], answer(task(call)) ).
input_form( [phonebook], answer(task(phonebook)) ).
input_form( [phone,book], answer(task(phonebook)) ).
input_form( [settings], answer(task(settings)) ).
%input_form( [tone,control], answer(task(tone_control)) ).



%%% non-task answers

input_form( [Language], answer(language(Language)) ) :-
	lex_language(Language).

input_form( [Name], answer(name(Name)) ) :-
	lex_name(Name).

/*
Now handled by TrindiKit (interpret_simple2)

input_form( Number, answer(number(Number)) ) :-
	lex_number(Number).

input_form( Sec_Code, answer(security_code(Sec_Code)) ) :-
	lex_security_code(Sec_Code).
*/


%%% elliptical answers

input_form( [C], answer(C) ) :- concept( C ).
input_form( S, answer(C) ) :- lexsem( S, C ), concept( C ).


% don't use complex interpretation

input_form2( _, _, _ ) :- fail.


/*----------------------------------------------------------------------
     yn_answer( A )
     --- is A yes or no?
----------------------------------------------------------------------*/

yn_answer(A):-
	A = yes;
	A = no.






/*----------------------------------------------------------------------
     lexsem( ?Word, ?Concept )
     -- Lexical semantics
----------------------------------------------------------------------*/

% SL
lexsem( Word, Concept ):-
	synset( Words, Concept ),
	member( Word, Words ).


% synset( [ [],[] ], ).

synset( [ [hello],[hi],[good,morning],[good,afternoon],
	  [good,evening] ], hello ).

synset( [ [bye],[goodbye],[bye-bye],[quit],[finish],[stop] ], bye ).

synset( [ [repeat],[sorry],[pardon],[what,did,you,say] ], repeat ).







/*----------------------------------------------------------------------
     - Conceptual knowledge
----------------------------------------------------------------------*/


concept(C):-
	lex_language(C);
	lex_name(C).
%        lex_number(C); % Removed by Alex
%	lex_security_code(C).



%%% language lexicon
lex_language(deutsch).
lex_language(english).
lex_language(espanol).
lex_language(francais).
lex_language(french).
lex_language(gaeilge).
lex_language(german).
lex_language(irish).
lex_language(spanish).
lex_language(svenska).
lex_language(swedish).



%%% name lexicon
lex_name(alex).
lex_name(alida).
lex_name(anna).
lex_name(bj�rn).
lex_name(bo).
lex_name(david).
lex_name(edith).
lex_name(elsa).
lex_name(erik).
lex_name(hildur).
lex_name(hugo).
lex_name(jan).
lex_name(john).
lex_name(kalle). 
lex_name(leif).
lex_name(lisa).
lex_name(maria).
lex_name(mia).
lex_name(olle).
lex_name(oscar).
lex_name(paul).
lex_name(pelle). 
lex_name(per).
lex_name(peter).
lex_name(robert).
lex_name(robin). 
lex_name(staffan). 
lex_name(stina).
lex_name(�sa).


%%% (telephone) number lexicon
lex_number(Num) :-
	atomic(Num),
	name(Num,NumString),
	name(N,NumString),
	integer(N),
	10000 =< N.


%%% security code lexicon
lex_security_code(SecCode) :-
	atomic(SecCode),
	name(SecCode, X),
	name(SC, X),
	integer(SC),
	SC =< 9999,
	1000 =< SC.


number_chars_nice( Number, CharsNice ) :-
	number_chars( Number, Chars ),
	nicify( Chars, CharsNice ).

nicify( [], [] ).
nicify( [C], [C] ) :- !.
nicify( [C|Cs], [C,0' |Cs1] ) :-
	nicify( Cs, Cs1 ).
