:- module( lexicon_vcrphone_svenska, [output_form/2, input_form/2,
				      yn_answer/1]).
:- use_module( library(vcr_languages) ).
:- ensure_loaded( library(lexicon_numbers) ).
:- ensure_loaded( library(digits_svenska) ).
:- 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))), "Vad kan jag hj�lpa dig med?" ).

output_form( ask(task(T)), Str ):-
	output_form(task(T), StrT ),
	append( "Vill du ", StrT, Str0 ),
	append( Str0, "?", Str).

output_form( ask(TaskList), Str ) :-
	TaskList = [task(_)|_],
	altlist2altstr_or( TaskList, AltStr ),
	append( "Vill du ", AltStr, Str0 ),
	append( Str0, "?", Str).

output_form( ask(quit), "Vill du avsluta GoDiS?" ).


output_form( ask(X^new_program_position(X)),
	     "Vilken kanal vill du ha?" ).
output_form( ask(X^program_position_to_store(X)),
	     "Vilken kanal vill du ha?" ).
output_form( ask(X^date_to_store(X)),
	     "Vilket datum?" ).
output_form( ask(X^start_time_to_store(X)),
	     "Hur dags vill du att inspelningen ska b�rja?" ).
output_form( ask(X^stop_time_to_store(X)),
	     "Hur dags vill du att inspelningen ska sluta?" ).
output_form( ask(X^program_number(X)),
	     "Vilket programnummer vill du radera?" ).
output_form( ask(X^new_clock(X)),
	     "Vilken tid?" ).

output_form( ask(X^base_station_language(X)),
	     "Vilket spr�k vill du �ndra basstationen till?" ).
output_form( ask(X^handset_language(X)),
	     "Vilket spr�k vill du �ndra handtelefonen till?" ).
output_form( ask(X^ring_volume(X)),
	     "V�lj en volymniv� mellan 0 och 7." ).
output_form( ask(X^earpiece_volume(X)),
	     "V�lj en volymniv� mellan 0 och 7." ).
output_form( ask(X^signal_type(X)),
	     "V�lj signaltyp: intern, extern, meddelandesignal eller s�ksignal.").
output_form( ask(X^tone_or_melody(X)),
	     "V�lj en ton eller melodi: l�g, medium, h�g, blandad, hoppig, Eine kleine Nachtmusik, Toccata, Elise, Samba eller Blues Rhythm." ).
output_form( ask( X^phonebook_name_to_add(X) ),
	     "Vilket namn vill du l�gga till?" ).
output_form( ask( X^phonebook_number_to_add(X) ),
	     "Vilket nummer vill du l�gga till?" ).
output_form( ask( X^phonebook_entry_to_delete(X) ),
	     "Vem vill du radera? S�g ett namn." ).
output_form( ask( X^phonebook_name_to_find(X) ),
	     "Vilket namn vill du leta efter?" ).

output_form( ask(main_menu), "Vill du byta dom�n?" ).

output_form( ask( call(Number) ), Cs ) :-
	format_to_chars( 'Numret �r ~a. Vill du ringa detta nummer?', [Number], Cs ).

output_form( task(vcr_top), "g� till videon" ).
output_form( task(vcr_change_play_status), "�ndra spelningsl�ge p� videon" ).
output_form( task(vcr_timer_recording), "g� till tidsinst�lld inspelning" ).
output_form( task(vcr_settings), "g� till inst�llningar" ).
output_form( task(vcr_query), "st�lla en fr�ga" ).
output_form( task(vcr_new_program_position), "�ndra kanal" ).
output_form( task(vcr_play), "starta spelning" ).
output_form( task(vcr_stop), "stoppa" ).
output_form( task(vcr_ff), "spola fram" ).
output_form( task(vcr_rew), "spola bak" ).
output_form( task(vcr_pause_still), "pausa" ).
output_form( task(vcr_still_adv), "advance" ). % SE: Vad �r detta?
output_form( task(vcr_rec), "spela in" ).
output_form( task(vcr_add_program), "l�gga till ett program" ).
output_form( task(vcr_add_program1), "l�gga till ett program" ).
output_form( task(vcr_delete_program), "radera ett program" ).
output_form( task(vcr_delete_program1), "radera ett program" ).
output_form( task(vcr_set_clock), "st�lla in klockan" ).
output_form( task(vcr_query_status), "fr�ga om spelningsl�ge" ).
output_form( task(vcr_query_channel), "ta reda p� vilken kanal som �r p�" ).

output_form( task(tp_top), "g� till telefonen" ).
output_form( task(tp_base_station), "g� till basstationen" ).
output_form( task(tp_handset), "g� till handtelefonen" ).
output_form( task(tp_phonebook), "g� till telefonboken" ).
output_form( task(tp_answering_machine), "g� till telefonsvararen" ).
%output_form( task(tp_answering_machine_onoff), "switch it on or off" ).
output_form( task(tp_answering_machine_switch_on), "aktivera den" ).
output_form( task(tp_answering_machine_switch_off), "st�nga av den" ).
output_form( task(tp_base_station_settings), "g� till basstationsinst�llningar" ).
output_form( task(tp_base_station_settings_volume), "�ndra volymen" ).
output_form( task(tp_base_station_settings_autoanswer), "st�nga av eller p� autosvar" ).
output_form( task(tp_base_station_settings_autoanswer_on), "aktivera autosvar" ).
output_form( task(tp_base_station_settings_autoanswer_off), "st�nga av autosvar" ).
output_form( task(tp_base_station_settings_basic), "g� till basinst�llningar" ).
output_form( task(tp_base_station_settings_basic_date), "st�lla in datum" ).
output_form( task(tp_base_station_settings_basic_language),
	     "�ndra basstationens spr�k" ).
output_form( task(tp_handset_warnings), "ordna med ringsignaler och volym" ).
output_form( task(tp_handset_language), "�ndra handtelefonens spr�k" ).
output_form( task(tp_handset_earpiece_volume), "�ndra h�rlurens volym" ).
output_form( task(tp_handset_warnings_volume), "�ndra ringsignalens volym" ).
output_form( task(tp_handset_warnings_signals), "ordna med ringsignalen" ).
output_form( task(tp_phonebook_new_entry), "g�ra till�gg i telefonboken" ).
output_form( task(tp_phonebook_search_entry), "s�ka i telefonboken" ).
output_form( task(tp_phonebook_delete_entry), "radera n�got i telefonboken" ).

output_form( task(main_menu), "byta dom�n" ).

output_form( inform(already_playing), "Videon �r redan i spell�ge" ).
output_form( inform(now_playing), "Videon spelar nu." ).
output_form( inform(already_stopped), "Videon �r redan i stoppl�ge." ).
output_form( inform(now_stopped), "Videon har nu stoppats." ).
output_form( inform(already_ff), "Videon �r redan p� fram�tspolning." ).
output_form( inform(now_ff), "Videon spolar nu fram�t." ).
output_form( inform(already_rewinding), "Videon �r redan p� bak�tspolning." ).
output_form( inform(now_rewinding), "Videon spolar nu bak�t." ).
output_form( inform(already_paused), "Videon �r redan i pausl�ge." ).
output_form( inform(now_paused), "Videon �r nu pausad." ).
output_form( inform(already_recording), "Videon spelar redan in." ).
output_form( inform(now_recording), "Videon spelar nu in." ).
output_form( inform(advanced), "Okej." ).
output_form( inform(not_paused), "Videon �r inte i pausl�ge." ).
output_form( inform(no_available_program_slot), "Det finns ingen tillg�nglig programplats." ).
output_form( inform(clock_was_set), "Klockan har st�llts in." ).
output_form( inform(date_cannot_be_set),
	     "Tyv�rr kan inte datum st�llas in i denna version." ).


output_form( inform(ok_new_program_position(P)), Cs ) :-
	format_to_chars( 'Bytt till kanal ~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( 'Okej, jag spelar in kanal ~a ~a fr�n ~c~c:~c~c till ~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( "Vilket programnummer vill du radera?", Listing, Cs ).

output_form( inform(no_program_to_delete), "Det finns inget program att radera." ).
output_form( inform(program_deleted), "Programmet har raderats." ).
output_form( inform(no_such_program), "Ingen program finns sparat i den positionen." ).

output_form( inform(confirm_status(S)), Cs ) :-
	status_output(S,SO),
	format_to_chars( 'Ja, videon �r i l�ge ~a.', [SO], Cs ).

output_form( inform(status_is(S)), Cs ) :-
	status_output(S,SO),
	format_to_chars( 'Nej, videon �r i l�ge ~a.', [SO], Cs ).

output_form( inform(current_program_position(P)), Cs ) :-
	format_to_chars( 'Nuvarande kanal �r ~a.', [P], Cs ).

output_form( inform(answering_machine_already_on),
	     "Telefonsvararen �r redan p�." ).
output_form( inform(answering_machine_now_on),
	     "Telefonsvararen �r nu p�." ).
output_form( inform(answering_machine_already_off),
	     "Telefonsvararen �r redan av." ).
output_form( inform(answering_machine_now_off),
	     "Telefonsvararen �r nu av." ).
output_form( inform(autoanswer_already_on),
	     "Autosvar �r redan aktiverat." ).
output_form( inform(autoanswer_now_on),
	     "Autosvar �r nu aktiverat." ).
output_form( inform(autoanswer_already_off),
	     "Autosvar �r redan av." ).
output_form( inform(autoanswer_now_off),
	     "Autosvar �r nu av." ).
output_form( inform(ring_volume_was_set),
	     "Ringvolymen �r nu inst�lld." ).
output_form( inform(earpiece_volume_was_set),
	     "H�rlurens volym �r nu inst�lld." ).
output_form( inform(new_earpiece_volume(V)), Cs ) :-
	format_to_chars( 'H�rlurens volym �r inst�lld p� ~a.\n', [V], Cs ).
output_form( inform(new_ring_volume(V)), Cs ) :-
	format_to_chars( 'Handtelefonens ringvolym �r nu ~a.\n', [V], Cs ).

output_form( inform(base_station_language_was_set(L)), Cs ) :-
	synset(SynSet, L),
	member([Syn],SynSet),
	capitalize(Syn,LS),
	format_to_chars('Basstationens spr�k �r nu ~s.', [LS], Cs ).
output_form( inform(handset_language_was_set(L)), Cs ) :-
	synset(SynSet, L),
	member([Syn],SynSet),
	capitalize(Syn,LS),
	format_to_chars('Handtelefonens spr�k �r nu ~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 samtal kommer att anv�nda ~s.',[SignalTypeCs,ToneOrMelodyCs],Cs).

output_form( inform(phonebook_entry_added(Name)), String ) :-
	atom_chars( Name, NameString ),
	append( NameString, " har lagts till telefonboken.", String).
output_form( inform(phonebook_entry_deleted(Name)), String ) :-
	atom_chars( Name, NameString ),
	append( NameString, " har raderats fr�n telefonboken.", String).
output_form( inform(phonebook_entry_exists(Name)), String ) :-
	atom_chars( Name, NameString ),
	append( NameString, " finns redan i telefonboken.", String).
output_form( inform(phonebook_entry_not_found), "Jag kunde inte hitta det namnet." ).
output_form( inform(now_calling(Name)), Cs ) :-
	format_to_chars( 'Jag ringer nu ~a.', [Name], Cs ).


% silent confirmation of queries and change domain
output_form( inform(task(top)), "Okej, toppniv�n." ):-!.
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)), "" ):-!.

% confirmation 
output_form( inform(task(T)), Str ):-
	move_string( task(T), TaskStr ),
	append( "Okej, ", TaskStr, Str0 ),
	append( Str0, ".", Str ).
% in case there is no input form, use output form
output_form( inform(task(T)), Str ):-
	output_form( task(T), TaskStr ),
	append( "Okej, ", TaskStr, Str0 ),
	append( Str0, ".", Str ).
%output_form( task(top), "toppniv�n" ).
output_form( inform(task(T)), "" ).

output_form( greet, "V�lkommen till telefonen och videon!" ).
output_form( quit, "Hej d�!" ).
output_form( reqRep(understanding), "Urs�kta?" ).
output_form( reqRep(relevance), "Vad menar du?" ).
output_form( thank, "Tack s� mycket." ).
output_form( confirm, "Okej" ).

% repeating a move

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

date_output(today,idag) :- !.

date_output(Date,DateOutput) :-
	atom_chars(Date,Chars),
	format_to_chars('~c~c/~c~c',Chars,DateOutputCs),
	atom_chars(DateOutput,DateOutputCs).

status_output(ff,'fram�tspolning') :- !.
status_output(stopped,'stoppad') :- !.
status_output(rewind,'bak�tspolning') :- !.
status_output(paused,'pausad') :- !.
status_output(playing,'uppspelning') :- !.
status_output(S,S).

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( " eller ", 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(Start,[Start2,Start3,Start4]), Start1=48),
	( atom_chars(Stop,[Stop1,Stop2,Stop3,Stop4]);
	    atom_chars(Stop,[Stop2,Stop3,Stop4]), Stop1=48 ),
	%atom_chars(Start,[Start1,Start2,Start3,Start4]),
	%atom_chars(Stop,[Stop1,Stop2,Stop3,Stop4]),
	format_to_chars( 'Nummer ~d: kanal ~a, ~c~c/~c~c, fr�n ~c~c:~c~c till ~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(Move,String) :-
	input_form( Words, answer(Move) ),
	concat_words( Words, String ).

/*----------------------------------------------------------------------
     input_form( +Phrase, -Move )
     -- Almost canned input
----------------------------------------------------------------------*/

input_form( [english], answer(changeto(english)) ).
input_form( [inglish], answer(changeto(english)) ).

output_form( inform(current_language(svenska)), "Okej, pratar nu svenska. Urs�kta min darriga r�st.").

% VCR

input_form( [video],             answer(task(vcr_top)) ).
input_form( [videon],             answer(task(vcr_top)) ).
input_form( [spelningsl�ge],     answer(task(vcr_change_play_status)) ).
input_form( [tidsinst�lld,inspelning], answer(task(vcr_timer_recording)) ).
input_form( [l�gga,till,ett,program],   answer(task(vcr_add_program)) ).
input_form( [l�gga,till,program],     answer(task(vcr_add_program)) ).
input_form( [l�gg,till,ett,program],   answer(task(vcr_add_program)) ).
input_form( [l�gg,till,program],     answer(task(vcr_add_program)) ).
input_form( [radera,ett,program],  answer(task(vcr_delete_program)) ).
input_form( [radera,program],answer(task(vcr_delete_program)) ).
input_form( [ta,bort,program],answer(task(vcr_delete_program)) ).
input_form( [ta,bort,ett,program],answer(task(vcr_delete_program)) ).
input_form( [st�ll,klocka],           answer(task(vcr_set_clock)) ).
input_form( [st�ll,klockan],           answer(task(vcr_set_clock)) ).
input_form( [s�tt,klocka],           answer(task(vcr_set_clock)) ).
input_form( [s�tt,klockan],           answer(task(vcr_set_clock)) ).
input_form( [�ndra,kanal],  answer(task(vcr_new_program_position)) ).
input_form( [�ndra,program],  answer(task(vcr_new_program_position)) ).
input_form( [byt,kanal],  answer(task(vcr_new_program_position))).% 011217
input_form( [byt,program],  answer(task(vcr_new_program_position))). % 011217
input_form( [�ka,kanal],[answer(task(vcr_new_program_position)),
				answer(incdec(increase))]).
input_form( [minska,kanal],[answer(task(vcr_new_program_position)),
				answer(incdec(decrease))]).
input_form( [n�sta,kanal],    [answer(task(vcr_new_program_position)),
				answer(incdec(increase))]).
input_form( [n�sta,program],    [answer(task(vcr_new_program_position)),
				answer(incdec(increase))]).
input_form( [f�rra,kanalen],[answer(task(vcr_new_program_position)),
				answer(incdec(decrease))]).
input_form( [f�rra,programmet],[answer(task(vcr_new_program_position)),
				answer(incdec(decrease))]).
input_form( [s�rskild,kanal],answer(task(vcr_new_specific_program_position)) ).
input_form( [specifik,kanal],answer(task(vcr_new_specific_program_position)) ).
input_form( [en,viss,kanal],answer(task(vcr_new_specific_program_position)) ).

input_form( [play],            answer(task(vcr_play)) ).
input_form( [spela],            answer(task(vcr_play)) ).

input_form( [stop],            answer(task(vcr_stop)) ).
input_form( [stoppa],            answer(task(vcr_stop)) ).
input_form( [stanna],            answer(task(vcr_stop)) ).
input_form( [stoppl�ge],            answer(task(vcr_stop)) ).

input_form( [forward],         answer(task(vcr_ff)) ).
input_form( [spola,fram�t],         answer(task(vcr_ff)) ).
input_form( [spola, fram],         answer(task(vcr_ff)) ).

input_form( [rewind],          answer(task(vcr_rew)) ).
input_form( [spola,bak�t],          answer(task(vcr_rew)) ).
input_form( [spola,tillbaka],          answer(task(vcr_rew)) ).
input_form( [spola,tillbaks],          answer(task(vcr_rew)) ).
input_form( [spola,bak],          answer(task(vcr_rew)) ).

input_form( [pause],           answer(task(vcr_pause_still)) ).
input_form( [paus],           answer(task(vcr_pause_still)) ).
input_form( [pausa],           answer(task(vcr_pause_still)) ).

input_form( [advance],         answer(task(vcr_still_adv)) ). %% ...

input_form( [spela,in],          answer(task(vcr_rec)) ).
input_form( [inspelning],          answer(task(vcr_rec)) ).

input_form( [idag],           answer(date_to_store(today)) ).
input_form( [spelar],         answer(status(playing)) ).
input_form( [pausad],          answer(status(paused)) ).
input_form( [stoppad],         answer(status(stopped)) ).
input_form( [spolar,tillbaka],       answer(status(rewinding)) ).
input_form( [spolar,fram�t],      answer(status(ff)) ).
input_form( [spelar,in],       answer(status(recording)) ).
input_form( [fr�ga],           answer(task(vcr_query)) ).
input_form( [vilken,kanal],    answer(task(vcr_query_channel)) ).
input_form( [vilket,spelningsl�ge],    answer(task(vcr_query_status)) ).

% "komplexa" fr�gor
input_form( [spolar,videon,fram�t],    [answer(task(vcr_query)), answer(status(ff))] ).
input_form( [spolar,videon,tillbaka],      [answer(task(vcr_query)), answer(status(rewinding))] ).
input_form( [spelar,videon,in],      [answer(task(vcr_query)), answer(status(recording)) ] ).




input_form( [fr�n|L], answer(start_time_to_store(T)) ) :-
	input_form( L, answer(number(T)) ).

input_form( [till|L], answer(stop_time_to_store(T)) ) :-
	input_form( L, answer(number(T)) ).

input_form( [�ndra,till,PrCh|L], answer(new_program_position(P)) ) :-
	program_word(PrCh),
	input_form( L, answer(number(P)) ).

input_form( [byt,till,PrCh|L], answer(new_program_position(P)) ) :-
	program_word(PrCh),
	input_form( L, answer(number(P)) ).

input_form( [spela,in,PrCh|L], answer(program_position_to_store(P)) ) :-
	program_word(PrCh),
	input_form( L, answer(number(P)) ).


input_form( [PrCh|L], answer(program_position(P)) ) :-
	program_word(PrCh),
	input_form( L, answer(number(P)) ).

input_form( [klockan,p�|L], answer(new_clock(C)) ) :-
	input_form( L, answer(number(C)) ).

% Telephone

input_form( [telefon],            answer(task(tp_top)) ).
input_form( [telefonen],            answer(task(tp_top)) ).
input_form( [basstation],         answer(task(tp_base_station)) ).
input_form( [basstationen],         answer(task(tp_base_station)) ).
input_form( [telefonsvarare],    answer(task(tp_answering_machine)) ).
input_form( [telefonsvararen],    answer(task(tp_answering_machine)) ).
input_form( [basstationsinst�llningar],answer(task(tp_base_station_settings)) ).
input_form( [basstationsinst�llningarna],answer(task(tp_base_station_settings)) ).
input_form( [basstationens,inst�llningar],answer(task(tp_base_station_settings)) ).
input_form( [basstationsvolym],  answer(task(tp_base_station_settings_volume)) ).
input_form( [basstationsvolymen],  answer(task(tp_base_station_settings_volume)) ).
input_form( [basstationens,volym],  answer(task(tp_base_station_settings_volume)) ).
input_form( [volym],               answer(task_type(volume)) ).
input_form( [basinst�llning],
	    answer(task(tp_base_station_settings_basic)) ).
input_form( [basinst�llningar],
	    answer(task(tp_base_station_settings_basic)) ).
input_form( [basinst�llningarna],
	    answer(task(tp_base_station_settings_basic)) ).
input_form( [basinst�llningen],
	    answer(task(tp_base_station_settings_basic)) ).
input_form( [datum], answer(task(tp_base_station_settings_basic_date)) ).
input_form( [basstationsspr�k],answer(task(tp_base_station_settings_basic_language)) ).
input_form( [spr�k],             answer(task_type(language)) ).

input_form([W], answer(language(L)) ) :-
        lexsem([W],L),
        vcr_language(L).
%input_form( [L],                    answer(language(L)) ) :-
	%vcr_language(L).
input_form( [autosvar],
	    answer(task(tp_base_station_settings_autoanswer)) ).
input_form( [handtelefon],              answer(task(tp_handset)) ).
input_form( [handtelefonen],              answer(task(tp_handset)) ).
input_form( [handtelefonens,spr�k],     answer(task(tp_handset_language)) ).
input_form( [h�rlurens,volym],      answer(task(tp_handset_earpiece_volume)) ).
input_form( [telefonbok],            answer(task(tp_phonebook)) ).
input_form( [telefonboken],           answer(task(tp_phonebook)) ).
input_form( [s�ka,i,telefonboken], answer(task(tp_phonebook_search_entry)) ).
input_form( [s�ka,i,telefonbok],answer(task(tp_phonebook_search_entry)) ).
input_form( [s�k],           answer(task(tp_phonebook_search_entry)) ).
input_form( [s�k,efter],           answer(task(tp_phonebook_search_entry)) ).
input_form( [s�ka,efter],           answer(task(tp_phonebook_search_entry)) ).
input_form( [vilket, telefonnummer], answer(task(tp_phonebook_search_entry)) ).%011217
input_form( [vilket, nummer], answer(task(tp_phonebook_search_entry)) ).%011217
input_form( [vad, har, Name, f�r, nummer], [answer(task(tp_phonebook_search_entry))|[NameAns]] ):-input_form([Name],NameAns).%011217


input_form( [g�ra,till�gg,i,telefonboken],      answer(task(tp_phonebook_new_entry)) ).
input_form( [till�gg],        answer(task(tp_phonebook_new_entry)) ).
input_form( [l�gg, till],      answer(task(tp_phonebook_new_entry)) ).

input_form( [radera,n�got,i,telefonboken],      answer(task(tp_phonebook_delete_entry)) ).
input_form( [radera,i,telefonboken],         answer(task(tp_phonebook_delete_entry)) ).
input_form( [ta,bort,Name,i,telefonboken], [answer(task(tp_phonebook_delete_entry))|NameAns] ):- input_form([Name],NameAns).
input_form( [ta,bort,Name,fr�n,telefonboken], [answer(task(tp_phonebook_delete_entry))|NameAns] ):- input_form([Name],NameAns).

input_form( [ringsignaler,och,volym], answer(task(tp_handset_warnings)) ).
input_form( [ringsignaler],       answer(task(tp_handset_warnings_signals)) ).
input_form( [ringsignalens,volym],  answer(task(tp_handset_warnings_volume)) ).
input_form( [l�g],                  answer(tone_or_melody(low)) ).
input_form( [medium],               answer(tone_or_melody(medium)) ).
input_form( [h�g],                 answer(tone_or_melody(high)) ).
input_form( [blandad],                answer(tone_or_melody(mixed)) ).
input_form( [hoppig],                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,rhythm],          answer(tone_or_melody(blues_rythm)) ).
input_form( [intern],             answer(signal_type(internal)) ) .
input_form( [extern],             answer(signal_type(external)) ) .
input_form( [meddelandesignal],              answer(signal_type(message)) ) .
input_form( [s�ksignal],               answer(signal_type(search_signal)) ) .

input_form( [l�gg,till|L], answer(phonebook_name_to_add(N)) ) :-
	input_form( L, answer(name(N)) ).

input_form( [radera|L], answer(phonebook_entry_to_delete(N)) ) :-
	input_form( L, answer(name(N)) ).

input_form( [ring|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( [inst�llningar],        answer(task_type(settings)) ).
input_form( [dom�n],          answer(task(main_menu))).
input_form( [st�ng,p�],   answer(action(switch_on)) ).
input_form( [st�ng,av],  answer(action(switch_off)) ).
input_form( [s�tt,p�],    answer(action(switch_on)) ).
input_form( [s�tt,av],   answer(action(switch_off)) ).
input_form( [aktivera],          answer(onoff(on)) ).
input_form( [avaktivera],         answer(onoff(off)) ).
input_form( [�ka],        answer(incdec(increase)) ).
input_form( [minska],        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( [hej], greet ).
input_form( [goddag], greet ).
input_form( [hejsan], greet ).
input_form( [hej,d�], quit ).
input_form( [adj�], quit ).
input_form( [sluta], quit ).
input_form( [vad,sa,du], reqRep ).
input_form( [vad,sade,du], reqRep ).
input_form( ['va?'], reqRep ).
input_form( ['vad?'], reqRep ).
input_form( [va], reqRep ).
input_form( [vad], reqRep ).
input_form( [f�rl�t], reqRep ).
input_form( [urs�kta], reqRep ).
input_form( [ja], answer(yes) ).
input_form( [jo], answer(yes) ).
input_form( [japp], answer(yes) ).
input_form( [nej], answer(no) ).
input_form( [n�], answer(no) ).
input_form( [okej], ack ).
input_form( [ok], ack ).
input_form( [aha], ack ).

program_word(program).
program_word(kanal).

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

%call_word(call).
%call_word(dial).

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

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

synset( [[video],[videon]], vcr ).
synset( [[telefon],[telefonen]], telephone ).
synset([[svenska]],swedish).
synset([[engelska]],english).
synset([[tyska]],german).
synset([[spanska]],spanish).
synset([[franska]],french).

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