/************************************************************************* name: lexicon_vcr_english.pl version: description: author: Staffan Larsson *************************************************************************/ :- module( lexicon_medical_english, [output_form/2, input_form/2, yn_answer/1]). :- discontiguous output_form/2, input_form/2, plan/2, postcond/2. :- use_module( library(lists), [ member/2, select/3, append/3 ] ). :- use_module( library(charsio), [ format_to_chars/3 ] ). :- ensure_loaded( library( semsort_medical ) ). %N�gon engelskspr�kig borde kolla p� detta... %note special purpose hack. output_form(icm:reraise:confirmed_by_interview,['I will need to ask some more questions to confirm.']). output_form(icm:reraise:confirmed_by_tests,[]). output_form(icm:reraise:Q,['Returning to the issue of', QF, '.']):- output_form( Q, QF ). output_form(X^disease(X),'your diagnosis'). output_form(X^info(X),'information'). output_form(X^treatment(X),'treament'). output_form(greet,['Hello']). output_form(quit,['Goodbye']). output_form(answer(disease(D)),['You probably have', D, '.']). output_form(answer(info(malaria)),['Malaria is a serious, sometimes fatal, disease caused by a parasite. There\n are four kinds of malaria that can infect humans: Plasmodium falciparum\n (plaz-MO-dee-um fal-SIP-a-rum), P. vivax (VI-vacks), P. ovale\n (o-VOL-ley), and P. malariae (ma-LER-ee-aa).\n\n The World Health Organization estimates that yearly 300-500 million\n cases of malaria occur and more than 1 million people die of malaria.\n\n Humans get malaria from the bite of a malaria-infected mosquito. When a\n mosquito bites an infected person, it ingests microscopic malaria parasites\n found in the persons blood. The malaria parasite must grow in the\n mosquito for a week or more before infection can be passed to another\n person. If, after a week, the mosquito then bites another person, the\n parasites go from the mosquitos mouth into the persons blood. The\n parasites then travel to the persons liver, enter the livers cells, grow and\n multiply. During this time when the parasites are in the liver, the person\n has not yet felt sick. The parasites leave the liver and enter red blood\n cells; this may take as little as 8 days or as many as several months. Once\n inside the red blood cells, the parasites grow and multiply. The red blood\n cells burst, freeing the parasites to attack other red blood cells. Toxins\n from the parasite are also released into the blood, making the person feel\n sick. If a mosquito bites this person while the parasites are in his or her\n blood, it will ingest the tiny parasites. After a week or more, the mosquito\n can infect another person.\n']). output_form( answer( info(coccidioidomycosis) ), ['Coccidioidomycosis or "Valley fever" is a disease caused by the fungus Coccidioides immitis, found in the soil of disease-endemic areas. The disease is acquired by inhalation of fungal spores from dust, usually generated by human activities or natural disasters. \n\nIn disease-endemic areas, persons can be at increased risk for disease if they participate in or are present during ground-disturbing activities resulting in exposure to dust. These\noutdoor activities include construction, landscaping, mining, agriculture, archaeologic excavation, military maneuvers, and recreational pursuits (e.g., dirt biking). Natural events that result in generation of dust clouds in disease-endemic areas, such as earthquakes or windstorms, increase the risk of infection among exposed persons. \n']). output_form( answer( info( schistosomiasis ) ), ['Schistosomiasis is caused by flukes, which have complex life cycles involving specific fresh-water snail species as intermediate hosts. Infected snails release large numbers of\nminute, free-swimming larvae (cercariae) that are capable of penetrating the unbroken skin of the human host. Even brief exposure to contaminated fresh water, such as wading, swimming, or bathing, can result in infection. Human schistosomiasis cannot be acquired by wading or swimming in salt water (oceans or seas). \n']). output_form(answer( treatment(malaria)),['Malaria can be cured with prescription drugs. The type of drugs and\n length of treatment depend on which kind of malaria is diagnosed, where\n the patient was infected, the age of the patient, and how severely ill the\n patient was at start of treatment.\n']). output_form( answer( treatment(coccidioidomycosis) ), ['Most persons with acute symptomatic coccidioidomycosis do not require treatment because the illness is self-limited. \n']). output_form( answer( treatment(schistosomiasis) ), ['\nSafe and effective oral drugs are available for the treatment of schistosomiasis. Praziquantel is the drug of choice for all species of Schistosoma. Oxamniquine has been effective in treating infections caused by S. mansoni in some areas where praziquantel is less effective. Travelers should be advised to contact an infectious disease or tropical medicine specialist.\n']). %symptom questions output_form(ask(X^symptom(X)),['How are you feeling today?']). output_form(ask(symptom(nausea)),['Are you feeling nauseous?']). output_form(ask(symptom('abdominal pain')),['Do you have abdominal pains?']). output_form(ask(symptom(weakness)),['Are you feeling weak?']). output_form(ask(symptom(diarrhea)),['Are you having diarrhea?']). output_form(ask(symptom(vomiting)),['Have you been vomiting?']). % :) output_form(ask(symptom(myalgia)),['Do you have joint pains']). output_form(ask(symptom('weight loss')),['Have you lost weight?']). output_form(ask(symptom('lack of appetite')),['Is you appetite bad?']). output_form(ask(symptom('cough')),['Do you have a cough?']). output_form(ask(symptom('dry cough')),['Do you have a dry cough?']). output_form(ask(symptom('influenzalike illness')),['Do you feel like you have the flu?']). output_form(ask(symptom(malaise)),['Do you feel sick?']). %Detta �r en extremt dum fr�ga... output_form(ask(symptom(arthralgia)), ['Do you have joint pains?']). output_form(ask(symptom('abdominal pains')), ['Do you have abdominal pains?']). output_form(ask(symptom('tiredness')), ['Do you feel tired?']). output_form(ask(symptom('headache')), ['Do you have a headache?']). output_form(ask(symptom('chills')), ['Do you have chills?']). %history questions... output_form(ask(medicalHistory('travel to desert region')),['Have you been in the desert?']). output_form(ask(medicalHistory('travel to tropical climate')),['Have you been to a tropical region?']). output_form(ask(medicalHistory('AIDS')),['Do you have AIDS?']). output_form(ask(medicalHistory('exposure to dust')),['Have you been exposed to dust?']). output_form(ask(medicalHistory('swimming in fresh water')),['Have you been swimming in fresh water?']). output_form(ask(medicalHistory('travel outside US')),['Have you been outside the US the last six months?']). output_form(X^info_disease(X),['What disease do you want to know about?']). output_form(X^disease(X),['What disease?']). output_form( answer( test_result( T ) ), ['The test for',T,'was positive.']). output_form( answer( not( test_result( T ) ) ), ['The test for',T,'was negative.']). %output_form( answer( positive_diagnosis ), ['The diagnosis was confirmed.']). output_form( answer( confirmed_by_interview ), ['The diagnosis was not confirmed by your information.']). output_form( answer( confirmed_by_tests ), ['The diagnosis was confirmed by tests.']). output_form( answer( not( confirmed_by_interview ) ), ['The diagnosis was not confirmed by your information.']). output_form( answer( not( confirmed_by_tests ) ), ['The diagnosis was not confirmed by tests.']). % reports output_form( report( take_test(T), pending ), ['We are going to take a',T,'test.'] ). %test questions (?) /*---------------------------------------------------------------------- output_form( +Move, -String ) -- Canned output ----------------------------------------------------------------------*/ % ask-moves output_form( ask(X^(action(X))), ['What can I do for you?'] ). output_form( ask(action(T)), Str ):- output_form(action(T), StrT ), append( ['Do you want to '], StrT, Str0 ), append( Str0, ['?'], Str). /*---------------------------------------------------------------------- output_form( +Move, -WordList ) -- Canned output ----------------------------------------------------------------------*/ % object-level clarification and groundnig questions output_form( ask(C), Output ):- output_form( icm:und*pos:_*C, IcmPos ), append( IcmPos0,['.'],IcmPos), % append( IcmPos0, [', is that correct?'], Output ). append( IcmPos0, ['?'], Output ). %SL021125 output_form( ask(set([Alt0|Alts])), Output):- Alt0=action(_),!, output_form(Alt0, Alt0out), altlist2alts_or( Alts, AltsOr ), % append(['Do you mean'|Alt0out], AltsOr, Output0 ), append(['Do you want to '|Alt0out], AltsOr, Output0 ), append(Output0, ['?'], Output). output_form( ask(set([Alt0|Alts])), Output):- output_form(Alt0, Alt0out), altlist2alts_or( Alts, AltsOr ), append(['Do you want '|Alt0out], AltsOr, Output0 ), % append([''|Alt0out], AltsOr, Output0 ), append(Output0, ['?'], Output). altlist2alts_or( [Alt], ['or'|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 ) ), [''|Output ] ):- output_forms( NewPropList, NewPropListOut ), output_form( answer( P ), AnswerOut ), append( AnswerOut, NewPropListOut, Output ). %output_form( answer( db_entry( set( List ) ) ), Output ):- % output_forms( List, Output ). output_forms( [], [] ). output_forms( [ Move | Moves ], Output1 ):- output_form( Move, Output ), output_forms( Moves, Outputs ), append( Output, Outputs, Output1 ). % %output_form( answer( db_entry( PropList, P ) ), Output ):- % output_forms( PropList, PropOutput ), % output_form( answer( P ), AnsOutput ), % append( PropOutput, ['.'. output_form( answer(notexist(X,Q)), ['Sorry, there is nothing matching your request about '|InputQDot]):- input_form( InputQ, ask(X^Q) ), append( InputQ, ['.'], InputQDot ). output_form( answer(unknown(Q)), ['Sorry, there is nothing matching your request about '|InputQDot]):- input_form( InputQ, ask(Q) ), append( InputQ, ['.'], InputQDot ). % for asking metaissue clarification question: "do you want ..." output_form( issue(X^info(X)), ['to get general information'] ). output_form( issue(confirmed_by_interview), ['to confirm by interview'] ). output_form( issue(confirmed_by_tests), ['to confirm by taking tests'] ). output_form( issue(Q), ['to ask about'|Out] ):- input_form( Out, ask( Q ) ). % for asking metaissue clarification question %output_form( action(Action), ['to '|Out] ):- % input_form( Out, request( Action ) ). % ICM % contact output_form( icm:con*neg, ['Hello?'] ). % perception output_form( icm:per*int, ['Pardon?'] ). output_form( icm:per*int, ['What did you say?'] ). output_form( icm:per*neg, ['Sorry, I didnt hear what you said.'] ). output_form( icm:per*pos:String, ['I heard you say',Name,'. '] ):- name( Name, String ). output_form( icm:sem*int, ['What do you mean'] ). output_form( icm:sem*neg, ['Sorry, I dont understand.'] ). output_form( icm:sem*pos:Move, InputDot ):- input_form( Input, Move ), append( Input, ['.'], InputDot ). % understanding(pragmatic) output_form( icm:und*neg, ['I dont quite understand.'] ). % first clause added 021120 SL output_form( icm:und*pos:usr*issue(Q), ['You want to know '|AnsPDot] ):- output_form( Q, AnsP ), append(AnsP,['.'],AnsPDot). output_form( icm:und*pos:usr*issue(Q), ['You want to know about'|AnsPDot] ):- input_form( AnsP, ask( Q ) ), append(AnsP,['.'],AnsPDot). output_form( icm:und*pos:usr*(not issue(Q)), ['You did not ask about'|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( ['not'],AnsPDot,AnsNotPDot ). output_form( icm:und*pos:usr*P, AnsPDot ):- ( output_form(P, AnsP); input_form( AnsP, answer(P) ) ), append(AnsP,['.'],AnsPDot). % special cases; could make use of isa-hierarchy %output_form( icm:und*pos:usr*channel_to_store(X), IcmPos ):- % output_form( icm:und*pos:usr*channel(X), IcmPos ). %output_form( icm:und*pos:usr*new_channel(X), IcmPos ):- % output_form( icm:und*pos:usr*channel(X), IcmPos ). % 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, [', is that correct?'], 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, ['Okay.'] ). % reject(issue(Q)) output_form( icm:acc*neg:issue(Q), ['Sorry, I cannot answer questions about'|InputQDot]):- input_form( InputQ, ask(Q) ), append( InputQ, ['.'], InputQDot ). % reject proposition P output_form( icm:acc*neg:P, ['Sorry, '|Rest]):- input_form( InputP, answer(P) ), append( InputP, [' is not a valid parameter.'], Rest ). % indicate loading a plan (pushed by findPlan) %output_form( icm:loadplan, ['I need some information.'] ). output_form( icm:loadplan, ['Lets see.'] ). % reraise issue explicitly (feedback on user reraise, or system-initiated) %output_form( icm:reraise:Q, ['Returning to the issue of '|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, ['Returning to '|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, ['So,']). % accommodation output_form( icm:accommodate:_, ['Alright.'] ). output_form( icm:reaccommodate:Q, ['Returning to the issue of'|AnsPDot] ):- input_form( AnsP, ask( Q ) ), append(AnsP,['.'],AnsPDot). output_form( not C, ['Not'|S] ):- output_form( C, S ). /*---------------------------------------------------------------------- input_form( +Phrase, -Move ) -- Almost canned input ----------------------------------------------------------------------*/ input_form(['diagnosis'],ask(X^disease(X))). input_form(['sick'],ask(X^disease(X))). input_form(['what',is,wrong],ask(X^disease(X))). input_form([information],ask(X^info(X))). input_form([tell,me,about],ask(X^info(X))). input_form([treatment],ask(X^treatment(X))). input_form([tests],ask(confirmed_by_tests)). input_form([interview],ask(confirmed_by_interview)). %input_form(D,answer(info_disease(S))):- input_form(D,answer(disease(S))):- % V2 lexsem(D, S), sem_sort( S, disease). input_form([not|Phrase],answer(not(A))):- input_form(Phrase, answer(A)). input_form(Phrase,answer(medicalHistory(H))):- lexsem(Phrase,H), sem_sort(H,medicalHistory). input_form(Phrase,answer(symptom(S))):- lexsem(Phrase,S), sem_sort(S,symptom). % generic input_form( [go,up], request(up) ). input_form( [language], request(change_language) ). input_form( [english], answer(language(english)) ). input_form( [swedish], answer(language(svenska)) ). input_form( [svenska], answer(language(svenska)) ). input_form( [top], request(top) ). %input_form( S, answer(C) ):- lexsem( S, C ), sem_sort( C, country ). % general negation 010419 input_form( [not|S], answer(not(C))):- input_form(S,answer(C)). input_form( [yes], answer(yes) ). input_form( [no], answer(no) ). % simple stuff input_form( [hello], greet ). input_form( [bye], quit ). input_form( [quit], quit ). % ICM input_form( [pardon], icm:per*neg ). input_form( [okay], icm:acc*pos ). input_form( [dont, know], icm:acc*neg:issue ). input_form( [not, sure], icm:acc*neg:issue ). input_form( [maybe], icm:acc*neg:issue ). input_form( [i, think, so], icm:acc*neg:issue ). input_form( [i, dont, think, so], icm:acc*neg:issue ). /*---------------------------------------------------------------------- yn_answer( ?YN ) ----------------------------------------------------------------------*/ yn_answer(A):- A = 'yes'; A = 'no'. /*---------------------------------------------------------------------- lexsem( ?Word, ?Concept ) -- Lexical semantics ----------------------------------------------------------------------*/ % use semantics as surface forms (only possible for english) lexsem( Word, Concept ):- synset( Words, Concept ), member( Word, Words ). %diseases synset([[malaria]],malaria). synset([[schistosomiasis]],schistosomiasis). synset([[coccidioidomycosis],[valley,fever]],coccidioidomycosis). %symptoms synset([[weak]],weakness). synset([[diarrhea]],diarrhea). synset([[vomiting]],vomiting). synset([[muscle,pain],[muscle,aches],[myalgia]],myalgia). synset([[losing,weight],[lost,weight],[weight,loss]],'weight loss'). synset([[nauseous],[nausea]],nausea). synset([[lack,of,appetite],[no,appetite],[lost,appetite],[bad,appetite],[appetite,bad]],'lack of appetite'). synset([[coughing],[cough]],cough). synset([[dry,cough]],'dry cough'). synset([[flu],[influenzalike,illness],[flu-like,illness],[influenza,like,illness],[flu,like,illness]],'influenzalike illness'). synset([[malaise],[feel,sick]],malaise). synset([[arthralgia],[joint,pain],[joint,pains]],arthralgia). synset([[abdominal,pain],[abdominal,pains],[stomach,aches],[stomach,ache]],'abdominal pain'). synset([[tired],[exhausted],[tiredness],[fatigue],[exhaustion]],'tiredness'). synset([[headache],[head,aches]],headache). synset([[chills]],chills). % history synset([[in,the,desert],[been,in,the,desert],[been,to,the,desert],[travelled,to,a,desert,region]],'travel to desert region'). synset([[been,in,a,tropical,region]],'travel to tropical climate'). synset([[have,aids]],'AIDS'). synset([[exposed,to,dust]],['exposure to dust']). synset([[swimming,in,fresh,water]],['swimming in fresh water']). synset([[travelled,outside,the,us],[outside,us]],['travel outside US']). %Domain specific Qs and As here /* synset( [[vcr],[video],[v,c,r]], vcr ). %synset( [[DigitWord]], Digit ):- digit_word( DigitWord, DigitString ), name( Digit, DigitString ). synset( [NumberPhrase], Number ):- number_phrase( NumberPhrase, Number ). */