:- module( lexicon_home_svenska, [output_form/2, input_form/2, input_form2/3, digit_word/2, yn_answer/1]). :- use_module( library(lists), [ member/2, select/3, append/3 ] ). :- use_module( library(charsio), [ format_to_chars/3 ] ). /*---------------------------------------------------------------------- output_form( +Move, -String ) -- Canned output ----------------------------------------------------------------------*/ 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."). 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^(device(X))), "Vilken sak �r det du pratar om?" ). output_form( ask(X^(device_type(X))), "Vilken sak �r det du pratar om?" ). output_form( ask(X^(action(X))), "Vad vill du g�ra?" ). output_form( ask(X^(device_state(X))), "Vad vill du veta?" ). output_form( ask(X^(location(X))), "Var?" ). output_form( ask(main_menu), "Vill du byta dom�n?" ). output_form( ask(light(X)), Str ) :- % atom_chars(X,XS), % SE �ndrade till concept_string f�r svenska concept_string(X,XS), append( "Vill du t�nda lyset i ", XS, Str0 ), append( Str0, "?", Str ). output_form( ask(leave_on_light), "Vill du l�ta ljuset vara t�nt i n�got av rummen?" ). output_form( task(perform_specific_action), "�ndra ljuset i n�got av rummen" ). output_form( task(make_query), "st�lla en fr�ga"). output_form( task(main_menu), "byta dom�n" ). output_form( task(leaving), "g� ut" ). output_form( inform(device_already_switched_on(_,L)), Cs ) :- concept_string( L, LS ), format_to_chars( "Ljuset i ~s �r redan t�nt.", [LS], Cs ). output_form( inform(device_already_switched_off(_,L)), Cs ) :- concept_string( L, LS ), format_to_chars( "Ljuset i ~s �r redan sl�ckt.", [LS], Cs ). output_form( inform(light_already_dimmed(_,L)), Cs ) :- concept_string( L, LS ), format_to_chars( "Ljuset i ~s �r redan dimmat.", [LS], Cs ). output_form( inform(no_lamp_in(_)), "Det finns ingen lampa d�r." ). output_form( inform(no_dimmer_in(_)), "Det finns ingen dimmer d�r." ). output_form( inform(is_switched_onoff(OnOff,S,L)), Cs ) :- concept_string( L, LS ), ( ( ( OnOff = on, S = switched_on ) ; ( OnOff = off, S = switched_off ) ) -> CR = "Ja" ; CR = "Nej" ), concept_string( OnOff, OnOffS ), format_to_chars( "~s, ljuset i ~s �r ~s.", [CR,LS,OnOffS], Cs ). output_form( inform(is_dimmed(_,L)), Cs ) :- concept_string( L, LS ), format_to_chars( "Ljuset i ~s �r dimmat.", [LS], Cs ). output_form( inform(is_not_dimmed(_,L)), Cs ) :- concept_string( L, LS ), format_to_chars( "Ljuset i ~s �r inte dimmat.", [LS], Cs ). output_form( inform(bad_action(lamp)), "Man kan inte g�ra s� med en lampa." ). output_form( inform(bad_action(dimmer)), "Man kan inte g�ra s� med en dimmer." ). output_form( inform(switched_on_lamp(L)), Cs ) :- concept_string( L, LS ), format_to_chars( "Ljuset i ~s �r nu t�nt.", [LS], Cs ). output_form( inform(switched_off_lamp(L)), Cs ) :- concept_string( L, LS ), format_to_chars( "Ljuset i ~s �r nu sl�ckt.", [LS], Cs ). output_form( inform(dimmed_light(L)), Cs ) :- concept_string( L, LS ), format_to_chars( "Ljuset i ~s �r nu dimmat.", [LS], Cs ). output_form( inform(woken_up_lit_kitchen), "�ndrat till morgonl�ge. Alla lampor har nu t�nts." ). output_form( inform(woken_up_no_lit_kitchen), "�ndrat till morgonl�ge. Alla lampor utom den i k�ket har t�nts." ). output_form( inform(closed_down_except(L)), Cs ) :- concept_string( L, LS ), format_to_chars( "Alla lampor f�rutom den i ~s har sl�ckts.", [LS], Cs ). output_form( inform(closed_down_all), "Alla lampor �r nu sl�ckta." ). % silent confirmation of queries and change domain output_form( inform(task(make_query)), "" ):-!. output_form( inform(task(main_menu)), "" ):-!. output_form( inform(task(top)), "" ):-!. %output_form( inform(task(top)), "Okej, toppniv�n." ). %output_form( inform(task(T)), "Okej." ). output_form( inform(task(T)), Str ):- move_string( task(T), TaskStr ), append( "Okej, ", TaskStr, Str0 ), append( Str0, ".", Str ). output_form( inform(task(T)), "" ). %output_form( task(wake_up), "morgonl�ge" ). move_string(Answer,String) :- input_form( Words, answer(Answer) ), 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 ). %output_form( greet, "Welcome to the home device manager!" ). output_form( greet, "V�lkommen till hemassistenten!" ). 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 ). 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 ). /*---------------------------------------------------------------------- input_form( +Phrase, -Move ) -- Almost canned input ----------------------------------------------------------------------*/ input_form( [t�nd], answer(action(switch_on)) ). input_form( [sl�ck], answer(action(switch_off)) ). 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( [dimma,ljuset],answer(action(dim_light)) ). input_form( [dimma,lampan], answer(action(dim_light)) ). input_form( [dimma],answer(action(dim_light)) ). input_form( [t�nt], answer(device_state(switched_on)) ). input_form( [�r,Dev,i,Loc,t�nd], [answer(task(make_query)), answer(device_state(switched_on))|[DevAns|[LocAns]]] ):- input_form([Dev], DevAns), input_form([Loc], LocAns). input_form( [�r,Dev,t�nd,i,Loc], [answer(task(make_query)), answer(device_state(switched_on))|[DevAns|[LocAns]]] ):- input_form([Dev], DevAns), input_form([Loc], LocAns). input_form( [�r,Dev,t�nd], [answer(task(make_query)), answer(device_state(switched_on))|[DevAns]] ):- input_form([Dev], DevAns). input_form( [sl�ckt], answer(device_state(switched_off)) ). %input_form( [t�nd], answer(device_state(switched_on)) ). input_form( [p�], answer(device_state(switched_on)) ). input_form( [av], answer(device_state(switched_off)) ). input_form( [dimmat], answer(device_state(dimmed)) ). input_form( [dimmad], answer(device_state(dimmed)) ). input_form( [byt, dom�n], answer(task(main_menu)) ). input_form( [�ndra, dom�n], answer(task(main_menu)) ). input_form( [�ndra], answer(task(perform_specific_action)) ). input_form( [byt], answer(task(perform_specific_action)) ). input_form( [vakna], answer(task(wake_up)) ). input_form( [god,morgon], answer(task(wake_up)) ). input_form( [morgonl�ge], answer(task(wake_up)) ). input_form( [g�r,ut], answer(task(leaving)) ). input_form( [g�,ut], answer(task(leaving)) ). input_form( [g�r], answer(task(leaving)) ). input_form( [g�], answer(task(leaving)) ). input_form( [fr�ga], answer(task(make_query)) ). input_form( [�r], answer(task(make_query)) ). input_form( [l�t,ljuset,vara,p�], answer(leave_on_light) ). input_form( [l�t,ljuset,vara,t�nt], answer(leave_on_light) ). input_form( [dom�n], answer(task(main_menu))). input_form( S, M ) :- lexsem( S, C ), input_move( C, M ). % simple stuff input_form( [hej], greet ). input_form( [hejsan], greet ). input_form( [hej,d�], quit ). input_form( [adj�], quit ). input_form( [stopp], 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( [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 ). % concepts input_move( L, answer(location(L)) ) :- location( L ). input_move( T, answer(device_type(T)) ) :- device_type( T ). input_form2(_,_,_):-fail. digit_word(_,_):-fail. /*---------------------------------------------------------------------- lexsem( ?Word, ?Concept ) -- Lexical semantics ----------------------------------------------------------------------*/ lexsem( Word, Concept ):- synset( Words, Concept ), member( Word, Words ). %synset( [[lamp], [light]], lamp ). %synset( [[lampa], [lampan], [ljus], [ljuset],[lyse],[lyset]], lamp ). synset( [[lampa], [lampan]], lamp ). synset( [[dimmer], [dimmern]], dimmer ). synset( [[k�ket], [k�k]], kitchen ). synset( [['teve-rummet'],['teve-rum'],['tv-rummet'],['tv-rum'], [teverummet],[teverum],[tvrummet],[tvrum]], tv_room ). synset( [[vardagsrummet],[vardagsrum]], living_room ). synset( [[hallen],[hall]], hall ). synset( [[hobbyrummet],[hobbyrum]], hobby_room ). synset( [[arbetsrummet],[arbetsrum]], study ). synset( [[av]], off). synset( [[p�]], on). % 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 ----------------------------------------------------------------------*/ action( X ) :- domain_home:action( X ). task( T ) :- domain_home:task( T ). location( L ) :- domain_home:location( L ). device_type( T ) :- domain_home:device_type( T ). sublist( SubList, List ) :- append( _, Suffix, List ), append( SubList, _, Suffix ).