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

         name: lexicon_lamps_svenska.pl 
	 date: 2004-11-23
       author: Andreas Wallentin
 
*************************************************************************/

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

:- discontiguous output_form/2, input_form/2.
:- multifile synset/2.

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


resource_of_type(lexicon).

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

output_form( greet,       ['V�lkommen till X10'] ).
output_form( quit,        ['Aj� aj�'] ).

output_form( action(top), ['b�rjan igen'] ).
output_form( ask(X^(action(X))), ['Vad kan jag g�ra f�r dig?'] ).

output_form( ask(action(T)), Str ):-
	output_form(action(T), StrT ),
	append( ['Vill du '], StrT, Str0 ),
	append( Str0, ['?'], Str).

output_form( ask(L^lamp_to_turn_on(L)),   ['Vilken lampa vill du t�nda?'] ).
output_form( ask(L^lamp_to_turn_off(L)),  ['Vilken lampa vill du sl�cka?'] ).
output_form( ask(L^lamp_to_add(L)),       ['Vilken sorts lampa vill du l�gga till?'] ).
output_form( ask(L^lamp_to_remove(L)),    ['Vilken sorts lampa vill du ta bort?'] ).

output_form( action(lamps_turn_on),    ['t�nda lampor'] ).
output_form( action(lamps_turn_off),   ['sl�cka lampor'] ).
output_form( action(add_lamp),         ['l�gga till en lampa'] ).
output_form( action(remove_lamp),      ['ta bort en lampa'] ).
output_form( action(all_lamps_on),     ['t�nda alla lampor'] ).
output_form( action(all_lamps_off),    ['sl�cka alla lampor'] ).

output_form( confirm(lamps_turn_on),   ['Lampan �r t�nd'] ).
output_form( confirm(lamps_turn_off),  ['Lampan �r sl�ckt'] ).
output_form( confirm(add_lamp),        ['Ny lampa  inkopplad'] ).
output_form( confirm(remove_lamp),     ['Lampan �r urkopplad'] ).
output_form( confirm(all_lamps_on),    ['Alla inkopplade lampor �r nu t�nda'] ).
output_form( confirm(all_lamps_off),   ['Alla inkopplade lampor �r sl�ckta'] ).

output_form( answer(available_lamps(Lamps)),  ['Dessa lampor finns:',Lamps] ).
output_form( answer(lamps_on(Lamps)),         ['Dessa �r t�nda:',Lamps] ).
output_form( answer(lamps_off(Lamps)),        ['Dessa �r sl�ckta:',Lamps] ).
output_form( answer(is_lit(Answer)),          [Answer] ).
output_form( answer(is_off(Answer)),          [Answer] ).

output_form( report('Exist',failed(Lamp)),
	     ['Det finns ingen',Lamp,'inkopplad'] ).
output_form( report('Single',failed(Lamp)),
	     ['Det finns redan en',Lamp,'inkopplad'] ).
output_form( report('TurnOn',failed(Lamp)),
	     [Lamp,'�r redan p�'] ).
output_form( report('TurnOff',failed(Lamp)),
	     [Lamp,'�r redan sl�ckt'] ).
output_form( report('AnyLamps',failed),
	     ['Det finns inga lampor inkopplade'] ).



/*
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 ).
*/




%%% used in output_form/2 with ask(set(...))
altlist2alts_or( [Alt], ['eller'|OutputAlt] ):-
	output_form(Alt, OutputAlt ).
altlist2alts_or( [Alt|Alts], [','|Output] ):-
	output_form(Alt, OutputAlt ),
	altlist2alts_or(Alts, AltsOr),
	append( OutputAlt, AltsOr, Output).


% object-level clarification and groundning questions
output_form( ask(C), Output  ):-
	output_form( icm:und*pos:_*C, IcmPos ),
	append( IcmPos0,['.'],IcmPos),
	append( IcmPos0, [', �r det korrekt?'], Output ).

output_form( ask(set([Alt0|Alts])), Output):-
	output_form(Alt0, Alt0out),
	altlist2alts_or( Alts, AltsOr ),
	append(['Vill du '|Alt0out], AltsOr, Output0 ),
	append(Output0, ['?'], Output).

output_form( Alt, OutputAlt ):-
	input_form( OutputAlt, answer( Alt ) ).


output_form( answer(notexist(X,Q)), [' Ledsen, det finns inget som matchar din fr�ga om'|InputQDot]):-
	input_form( InputQ, ask(X^Q) ),
	append( InputQ, ['.'], InputQDot ).
output_form( answer(unknown(Q)), ['Ledsen, det finns inget som matchar din fr�ga om'|InputQDot]):-
	input_form( InputQ, ask(Q) ),
	append( InputQ, ['.'], InputQDot ).

% for asking metaissue clarification question
output_form( issue(Q), ['fr�ga om'|Out] ):-
	input_form( Out, ask( Q ) ).


% ICM

% contact
output_form( icm:con*neg, ['Hall�?'] ).


% perception
output_form( icm:per*int, ['Urs�kta?'] ).
output_form( icm:per*int, ['Vad sade du?'] ).
output_form( icm:per*neg, ['Urs�kta, Jag h�rde inte vad du sade.'] ).


output_form( icm:per*pos:String, ['Jag tyckte du sade',Name,'.'] ):-
	name( Name, String ).

output_form( icm:sem*int, ['Vad menar du'] ).
output_form( icm:sem*neg, ['F�rl�t, jag f�rst�r inte.'] ).
output_form( icm:sem*pos:Move, InputDot ):-
	input_form( Input, Move ),
	append( Input, ['.'], InputDot ).


% understanding(pragmatic)
output_form( icm:und*neg, ['Jag f�rst�r inte riktigt.']  ).

output_form( icm:und*pos:usr*issue(A^play_status(A)),
	     ['Du vill veta vad spelaren g�r']  ).


output_form( icm:und*pos:usr*issue(play_status(Status)),
	     ['Du vill veta om videon',S0]  ):-
	status_output(Status,S0).

output_form( icm:und*pos:usr*issue(A^current_channel(A)),
	     ['Du vill veta vilken kanal som �r p�.'] ).



output_form( icm:und*pos:usr*(not issue(Q)), ['Du fr�gade inte:'|AnsPDot]  ):-
	input_form( AnsP, ask( Q ) ),
	append(AnsP,['.'],AnsPDot).


output_form( icm:und*pos:usr*(not P), AnsNotPDot  ):-
	output_form( icm:und*pos:usr*P, AnsPDot  ),
	append( ['inte'],AnsPDot,AnsNotPDot ).

output_form( icm:und*pos:usr*P, AnsPDot  ):-
	( output_form(P, AnsP);
	    input_form( AnsP, answer(P) ) ),
	append(AnsP,['.'],AnsPDot).


% 020702 SL
output_form( icm:und*pos:usr*PX, IcmPos ):-
	PX =.. [P,X],
	isa( P, P1 ),
	P1X =.. [P1,X],
	output_form( icm:und*pos:usr*P1X, IcmPos ).



output_form( icm:und*int:usr*C, IcmInt  ):-
	output_form( ask(C), IcmInt ).
	%output_form( icm:und*pos:C, IcmPos ),
	%append( IcmPos0,['.'],IcmPos),
	%append( IcmPos0, [', is that correct?'], IcmInt ).

%output_form( icm:und*int:usr*C, IcmInt  ):-
%	input_form( answer(C), IcmInt ).


output_form( icm:und*int:usr*C, Output  ):-
	output_form( icm:und*pos:_*C, IcmPos ),
	append( IcmPos0,['.'],IcmPos),
	append( IcmPos0, [', �r det korrekt?'], Output ).




% clarification question
output_form( icm:und*int:usr*AltQ, Output):-
	output_form( ask(AltQ), Output).



% "acceptance"/integration

% icm-Type(-Polarity(-Args))
output_form( icm:acc*pos, ['Okej.'] ).

% reject(issue(Q))
output_form( icm:acc*neg:issue(Q), ['Ledsen, jag kan inte svara p� fr�gor om'|InputQDot]):-
	input_form( InputQ, ask(Q) ),
	append( InputQ, ['.'], InputQDot ).

% reject proposition P
output_form( icm:acc*neg:P, ['Ledsen, '|Rest]):-
	input_form( InputP, answer(P) ),
	append( InputP, [' �r inte en korrekt parameter.'], Rest ).

% indicate loading a plan (pushed by findPlan)
%output_form( icm:loadplan, ['I need some information.'] ).
output_form( icm:loadplan, ['L�t oss se.'] ).


% reraise issue explicitly (feedback on user reraise, or system-initiated)
output_form( icm:reraise:Q, ['G� tillbaks till fr�gan om '|InputQDot]):-
	( input_form( InputQ, ask(Q) ); output_form( ask(Q), InputQ ) ),
	append( InputQ, ['.'], InputQDot ).

% reraise action explicitly (feedback on user reraise, or system-initiated)
output_form( icm:reraise:A, ['G� tillbaks till '|InputQDot]):-
	( input_form( InputQ, request(A) ); output_form( action(A), InputQ ) ),
	append( InputQ, ['.'], InputQDot ).

% reraise issue (system-initiated, where question follows immediately after)
output_form( icm:reraise, ['S�,']).

% accommodation
output_form( icm:accommodate:_, ['Visst.']  ).

output_form( icm:reaccommodate:Q, ['G� tillbaks till fr�gan om'|AnsPDot]  ):-
	input_form( AnsP, ask( Q ) ),
	append(AnsP,['.'],AnsPDot).



output_form( not C, ['Inte'|S] ):- output_form( C, S ).


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

input_form( [inte|S], answer(not(C))):- input_form(S,answer(C)).

input_form( [ja], answer(yes) ).
input_form( [nej], answer(no) ).


% simple stuff

input_form( [hej], greet ).
input_form( [hej,d�], quit ).
input_form( [sluta], quit ).
input_form( [avbryt], quita ).

			% ICM

input_form( [f�rl�t], icm:per*neg ).
input_form( [okej], icm:acc*pos ).
input_form( [ok], icm:acc*pos ).

input_form( [vet, inte], icm:acc*neg:issue ).


%%% restarting the dialogue
input_form( [b�rja,om],   request(lamps_restart) ).

%%% requests
input_form( [t�nd,alla],   request(all_lamps_on) ).
input_form( [t�nda,alla],  request(all_lamps_on) ).
input_form( [sl�ck,alla],  request(all_lamps_off) ).
input_form( [sl�cka,alla], request(all_lamps_off) ).
input_form( [On],          request(lamps_turn_on) ):-   lexsem(On,on).
input_form( [Off],         request(lamps_turn_off) ):-  lexsem(Off,off).
input_form( [l�gga,till],  request(add_lamp) ).
input_form( [l�gg,till],   request(add_lamp) ).
input_form( [ta,bort],     request(remove_lamp) ).

%%% answers
input_form( [Lamp0],      answer(lamp(Lamp)) ):-
	lexsem(Lamp0,Lamp),
	sem_sort(Lamp,lamp).


%%% questions
input_form( [�r,X,t�nd],               ask(Lamp^is_lit(Lamp)) ):-
	lexsem(X,Lamp),
	sem_sort(Lamp,lamp).
input_form( [�r,X,p�],                 ask(Lamp^is_lit(Lamp)) ):-
	lexsem(X,Lamp),
	sem_sort(Lamp,lamp).
input_form( [�r,X,sl�ckt],             ask(Lamp^is_off(Lamp)) ):-
	lexsem(X,Lamp),
	sem_sort(Lamp,lamp).
input_form( [�r,X,av],                 ask(Lamp^is_off(Lamp)) ):-
	lexsem(X,Lamp),
	sem_sort(Lamp,lamp).
input_form( [vilka,lampor,finns],      ask(L^available_lamps(L)) ).
input_form( [vilka,lampor,�r,t�nda],   ask(L^lamps_on(L)) ).
input_form( [vilka,�r,t�nda],          ask(L^lamps_on(L)) ).
input_form( [vilka,lampor,�r,sl�ckta], ask(L^lamps_off(L)) ).
input_form( [vilka,�r,sl�ckta],        ask(L^lamps_off(L)) ).

/*----------------------------------------------------------------------
     yn_answer( ?YN )
----------------------------------------------------------------------*/

yn_answer(A):-
	A = 'ja';
	A = 'nej'.

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

% use semantics as surface forms (only possible for english)
lexsem( Word, Concept ):-
	synset( Words, Concept ),
	member( Word, Words ).

synset( [t�nd,t�nda],    on ).
synset( [sl�ck,sl�cka],  off ).

synset( [bordslampa,bordlampa,bordslampan,bordlampan], bordslampa ).
synset( [taklampa,taklampan],                          taklampa ).
synset( [skrivbordslampa,skrivbordslampan],            skrivbordslampa ).
synset( [s�nglampa,s�nglampan],                        s�nglampa ).
synset( [h�rnlampa,h�rnlampan],                        h�rnlampa ).
synset( [sofflampa,sofflampans],                       sofflampa ).
synset( [golvlampa,golvlampan],                        golvlampa ).