/*********************************************************************** name: lexicon_agenda_svenska.pl description: General Lexicon module for Swedish generation and interpretation "grammars" input_form(String,Move) output_form(Move,SharedCom,String) author: written by Staffan Larsson modified by Rebecca Jonson ***************************************************************************/ :-module(lexicon_agenda_svenska, [output_form/3, input_form/2, sametype/2, resource_of_type/1]). resource_of_type(lexicon). %:-discontiguous output_form/3, input_form/2. :- use_module(library(random)). :- use_module( library(lists), [ member/2, select/3, append/3 ] ). :- use_module( library(charsio), [ format_to_chars/3 ] ). :- multifile output_form/3, input_form/2. :- ensure_loaded(generate_svenska). :- ensure_loaded(semsort_agendatalk). /*---------------------------------------------------------------------- input_form( +Phrase, -Move ) -- Almost canned input ----------------------------------------------------------------------*/ % generic input_form( [g�,upp], request(up) ). input_form( [g�,tillbaka], request(up) ). input_form( [g�,tillbaks], request(up) ). input_form( [upp], request(up) ). input_form( [spr�k], request(change_language) ). input_form( [engelska], answer(language(english)) ). input_form( [svenska], answer(language(svenska)) ). input_form( [inglish], answer(language(english)) ). % contradiction 050803 RJ input_form( [nej,inte,NotS,S],[request(not(NotC)),request(C)]):- input_form([NotS],request(NotC)),input_form([S],request(C)). input_form( [nej,inte,NotS,utan,S],[answer(not(NotC)),answer(C)]):- input_form([NotS],answer(NotC)), input_form([S],answer(C)), sametype(NotC,C). input_form( [nej,inte,NotS,S],[answer(not(NotC)),answer(C)]):- input_form([NotS],answer(NotC)), input_form([S],answer(C)), sametype(NotC,C). input_form( [inte,NotS,S],[request(not(NotC)),request(C)]):- input_form([NotS],request(NotC)),input_form([S],request(C)). input_form( [inte,NotS,utan,S],[answer(not(NotC)),answer(C)]):- input_form([NotS],answer(NotC)), input_form([S],answer(C)), sametype(NotC,C). input_form( [inte,NotS,S],[answer(not(NotC)),answer(C)]):- input_form([NotS],answer(NotC)), input_form([S],answer(C)), sametype(NotC,C). input_form( [S,inte,NotS],[answer(not(NotC)),answer(C)]):- input_form([NotS],answer(NotC)), input_form([S],answer(C)), sametype(NotC,C). % general negation 010419 does not work for "inte m�te" just "inte ett m�te" input_form( [nej,inte|S], answer(not(C))):- input_form(S,answer(C)). input_form( [inte|S], answer(not(C))):- input_form(S,answer(C)). input_form( [ja,precis],answer(yes)). input_form( [ja], answer(yes) ). input_form( [jaa], answer(yes) ). input_form( [jajamen],answer(yes)). input_form( [javisst],answer(yes)). input_form( [japp],answer(yes)). input_form( [svar,ja],answer(yes)). input_form( [exakt],answer(yes)). input_form( [korrekt],answer(yes)). input_form( [det,st�mmer],answer(yes)). input_form( [nej,det,st�mmer,inte], answer(no) ). input_form( [nej,det,�r,fel], answer(no) ). input_form( [nej], answer(no) ). input_form( [svar,nej], answer(no) ). input_form( [n�], answer(no)). % simple stuff input_form( [hej], greet ). input_form( [hejsan],greet). input_form( [tjenare],greet). input_form( [hej,d�], quit ). input_form( [hejd�], quit). input_form( [avsluta],quit). input_form( [klart,slut],quit). input_form( [sluta], quit ). input_form( [adj�], quit ). % ICM input_form( [f�rl�t], icm:per*neg ). input_form( [jag,h�rde,inte,vad,du,sa], icm:per*neg ). input_form( [jag,h�rde], icm:per*neg ). input_form( [vad,sa,du], icm:per*neg ). input_form( [fl�t], icm:per*neg ). input_form( [okej], icm:acc*pos ). input_form( [ok], icm:acc*pos ). input_form( [vet, inte], icm:acc*neg:issue ). /*---------------------------------------------------------------------- yn_answer( ?YN ) ----------------------------------------------------------------------*/ yn_answer(A):- A = 'ja'; A = 'nej'. %%%%LOAD DOMAIN-SPECIFIC INTERPRETATION LEXICON :- ensure_loaded(interpret_svenska). /*---------------------------------------------------------------------- output_form( +Move, -WordList ) -- Canned output SL ----------------------------------------------------------------------*/ output_form( ask(X^language(X)), _,['Vilket spr�k vill du anv�nda?'] ). output_form( ask([language(_)|_]),_, ['Vill du anv�nda engelska eller svenska?'] ). % object-level clarification and groundnig questions output_form( ask(C),Com,Output ):- output_form( icm:und*pos:_*C,Com,IcmPos ), append( IcmPos0,['.'],IcmPos), append( IcmPos0, [', �r det korrekt?'], Output ). output_form( ask(set([Alt0|Alts])), Com,Output):- output_form(Alt0, Com,Alt0out), altlist2alts_or( Alts, AltsOr ), % append(['Do you mean'|Alt0out], AltsOr, Output0 ), append(['Vill du '|Alt0out], AltsOr, Output0 ), append(Output0, ['?'], Output). 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). output_form( Alt, _,OutputAlt ):- input_form( OutputAlt, answer( Alt ) ). % db entries output_form( answer( db_entry( _PropList, set(NewPropList), P ) ),Com,[''|Output ] ):- output_forms( NewPropList, NewPropListOut ), output_form( answer( P ), Com,AnswerOut ), append( AnswerOut, NewPropListOut, Output ). output_forms( [],[] ). output_forms( [ Move | Moves ], Output1 ):- output_form( Move, _,Output ), output_forms( Moves, Outputs ), append( Output, Outputs, Output1 ). 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 sa du?'] ). %output_form( icm:per*neg, _,['Urs�kta, Jag h�rde inte vad du sa.'] ). output_form(icm:per*neg, _, [Answer]):- random(1,6,N),negperception(List),getNoflist(N,List,Answer). /* RANDOM VARIATION */ negperception(['Urs�kta, Jag h�rde inte vad du sa.','Urs�kta, Jag uppfattade inte vad du sa.', 'F�rl�t, jag h�rde inte.','F�rl�t, kanske talade du samtidigt som mig.', 'F�rl�t, vad sa du?']). output_form( icm:per*pos:String, _,['Jag tyckte du sa',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(Q), _, ['Du vill ha reda p� n�got om'|AnsPDot] ):- input_form( AnsP, ask( Q ) ), append(AnsP,['.'],AnsPDot). 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*int:usr*C, _,Output ):- output_form( icm:und*pos:_*C, _,IcmPos ), append( IcmPos0,['.'],IcmPos), append( IcmPos0, [', �r det korrekt?'], Output ). %%%Hack for AgendaTalk output_form( icm:und*int:usr*take_down_event(X), Com, ['Var det ett ja?'] ). % 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, _,['Ockej.'] ). % 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 ).*/ output_form( icm:acc*neg:date_to_store(P), _, ['Ledsen, '|Rest]):- input_form( InputP, answer(date_to_store(P)) ), append( InputP, [' �r inte ett korrekt datum'], Rest ). output_form( icm:acc*neg:P, _, ['Sorry, '|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, _,['L�t se.'] ). % reraise issue explicitly (feedback on user reraise, or system-initiated) output_form( icm:reraise:Q, _,['Tillbaka 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, _,['Tillbaka 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, _,['Tillbaka till fr�gan om'|AnsPDot] ):- input_form( AnsP, ask( Q ) ), append(AnsP,['.'],AnsPDot). output_form( not C, _,['Inte'|S] ):- output_form( C, _,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 ). %split(Atom, CharList) split('',[]). split(Atom, [C|Cs]):- atom_concat(C,Rest,Atom), atom_length(C,1), split(Rest, Cs). sametype(event_to_store(_X),event_to_store(_Y)). sametype(time(_X),time(_Y)). sametype(am_or_pm(_X),am_or_pm(_Y)). sametype(date(_X),date(_Y)). sametype(location(_X),location(_Y)).