我需要帮助来查找此序言代码中的错误

问题描述 投票:0回答:1

我正在构建一个界面,其目的是诊断某人并提供一种治疗形式,包括治疗方法、治疗费用和持续时间。我首先提供症状列表,并询问用户是否有症状(插入 1)或是否没有(插入 2)。然后我将症状列表与某种疾病联系起来,并提供治疗信息。 当我在 SWI-prolog 上运行代码时,它卡在第一个问题的答案上,并且无法继续处理第二个问题。 谁能告诉我我的错误是什么?

这是我设置规则的代码:

:- dynamic (fact/1), [interface].
:- dynamic (demo/1).
  
%A simple backward chaining rule interpreter
:-  op( 800, fx, if).
:-  op( 700, xfx, then).
:-  op( 300, xfy, or).
:-  op( 200, xfy, and).

demo( Q)  :- 
   fact( Q).

demo( Q)  :-
   if Condition then Q, %A relevant rule   
   demo( Condition). %whose condition is true 

demo( Q1 and Q2)  :-
   demo( Q1),
   demo( Q2).

demo( Q1 or Q2)  :-
   demo( Q1)
   ;
   demo( Q2).

%Simple forward chaining in Prolog

demo:- new_derived_fact( P),             %A new fact
   !,
   write( 'Derived: '), write( P), nl,
   assert( fact( P)),
   demo.
demo:- write( 'No more facts').          %All facts derived

new_derived_fact( Concl)  :-
   if Cond then Concl,               %A rule
   \+ fact( Concl),                 %Rule's conclusion not yet a fact
   composed_fact( Cond).             %Condition true?

composed_fact( Cond)  :-
   fact( Cond).                      %Simple fact

composed_fact( Cond1 and Cond2)  :-
   composed_fact( Cond1),
   composed_fact( Cond2).            %Both conjuncts true

composed_fact( Cond1 or Cond2)  :-
   composed_fact( Cond1)
   ;
   composed_fact( Cond2).

%Associating symptoms with diseases

if febre and tosse and dor_de_cabeca and cansaco then gripe.
if cansaco and palidez then anemia.
if dificuldade_respiratoria and tosse then asma.
if dor_abdominal and nausea and diarreia and vomito then gastroenterite.
if dor_de_cabeca and nausea and sensibilidade_a_luz then migranea.
if febre and dor_muscular and dor_de_cabeca and erupcoes_cutaneas then dengue.
if dor_abdominal and febre and nausea and perda_de_apetite then apendicite.
if febre and tosse and dificuldade_respiratoria and dor_no_peito then pneumonia.
if febre and dor_de_cabeca and cansaco and dor_de_garganta and inchaco_nos_ganglios then mono.
if cansaco and aumento_de_peso and intolerancia_ao_frio then hipotireoidismo.
if perda_de_peso and taquicardia and nervosismo and intolerancia_ao_calor then hipertireoidismo.
if sede_excessiva and fome_frequente and urinacao_frequente and perda_de_peso then diabetes.
if dor_lombar and rigidez_muscular then lombalgia.
if erupcoes_cutaneas and coceira and vermelhidao_na_pele then urticaria.
if dor_abdominal and diarreia and perda_de_peso and presenca_de_sangue_nas_fezes then colite_ulcerativa.
if tosse and tosse_prolongada and febre and suores_noturnos and perda_de_peso then tuberculose.
if dor_de_cabeca and tontura and falta_de_ar then hipertensao.
if dificuldade_respiratoria and cansaco and inchaco_nas_pernas and tosse and tosse_seca then insuficiencia_cardiaca.

%Treatments

tratamento(nome_tratamento, [tratamentos], custo, duracao).

tratamento(gripe, [repouso, hidratacao, paracetamol], 7, 7).
tratamento(anemia, [dieta, suplemento_ferro], 15, 15).
tratamento(asma, [inalador], 40, 10).
tratamento(gastroenterite, [hidratacao, dieta], 0, 30).
tratamento(migranea, [aspirina, repouso], 10, 10).
tratamento(dengue, [hidratacao, paracetamol], 3, 15).
tratamento(apendicite, [cirurgia], 1500, 1).
tratamento(pneumonia, [antibiotico], 10, 15).
tratamento(mono, [hidratacao, repouso], 0, 10).
tratamento(hipotireoidismo, [terapia_hormonal], 90, 3).
tratamento(hipertireoidismo, [antitireoidiano], 35, 5).
tratamento(diabetes, [dieta, exercicio, insulina], 15, 5).
tratamento(lombalgia, [fisioterapia, brufen], 10, 15).
tratamento(urticaria, [antihistaminico], 20, 5).
tratamento(colite_ulcerativa, [antiinflamatorio], 15, 7).
tratamento(tuberculose, [antibiotico], 30, 30).
tratamento(hipertensao, [dieta, antihipertensivo], 5, 15).
tratamento(insuficiencia_cardiaca, [dieta, vasodilatador, diuretico], 5, 15).

这是我界面中的代码:

:- dynamic (fact/1), [P1].
:- dynamic (demo/1).

%Inciate consultation

iniciar_consulta :-
    retractall(fact(_)),  
    writeln('Bem-vindo ao sistema de diagnostico medico.'),
    writeln('Por favor, responda às seguintes perguntas com 1 (sim) ou 2 (nao):'), perg1.
    
    perg1 :- writeln('Tem febre?'), read(S), (S == 1, assert(fact(febre))), perg2.
    perg2 :- writeln('Tem tosse?'), read(S), (S == 1, assert(fact(tosse))), perg3.
    perg3 :- writeln('Tem tosse seca?'), read(S), (S == 1, assert(fact(tosse_seca))), perg4.
    perg4 :- writeln('Tem tosse prolongada?'), read(S), (S == 1, assert(fact(tosse_prolongada))), perg5.
    perg5 :- writeln('Tem cansaço?'), read(S), (S == 1, assert(fact(cansaco))), perg6.
    perg6 :- writeln('Tem nervosismo?'), read(S), (S == 1, assert(fact(nervosismo))), perg7.
    perg7 :- writeln('Tem naúseas?'), read(S), (S == 1, assert(fact(nausea))), perg8.
    perg8 :- writeln('Tem diarreia?'), read(S), (S == 1, assert(fact(diarreia))), perg9.
    perg9 :- writeln('Tem vómitos?'), read(S), (S == 1, assert(fact(vomito))), perg10.
    perg10 :- writeln('Tem coceira?'), read(S), (S == 1, assert(fact(coceira))), perg11.
    perg11 :- writeln('Tem taquicardia?'), read(S), (S == 1, assert(fact(taquicardia))), perg12.
    perg12 :- writeln('Tem tonturas?'), read(S), (S == 1, assert(fact(tontura))), perg13.
    perg13 :- writeln('Tem dor abdominal?'), read(S), (S == 1, assert(fact(dor_abdominal))), perg14.
    perg14 :- writeln('Tem dor de cabeca?'), read(S), (S == 1, assert(fact(dor_de_cabeca))), perg15.
    perg15 :- writeln('Tem dor muscular?'), read(S), (S == 1, assert(fact(dor_muscular))), perg16.
    perg16 :- writeln('Tem dor no peito?'), read(S), (S == 1, assert(fact(dor_no_peito))), perg17.
    perg17 :- writeln('Tem dor de garganta?'), read(S), (S == 1, assert(fact(dor_de_garganta))), perg18.
    perg18 :- writeln('Tem dificuldade respiratória?'), read(S), (S == 1, assert(fact(dificuldade_respiratoria))), perg19.
    perg19 :- writeln('Tem rigidez muscular?'), read(S), (S == 1, assert(fact(rigidez_muscular))), perg20.
    perg20 :- writeln('Tem perda de apetite?'), read(S), (S == 1, assert(fact(perda_de_apetite))), perg21.
    perg21 :- writeln('Tem inchaço nos gânglios?'), read(S), (S == 1, assert(fact(inchaco_nos_ganglios))), perg22.
    perg22 :- writeln('Tem inchaço nas pernas?'), read(S), (S == 1, assert(fact(inchaco_nas_pernas))), perg23.
    perg23 :- writeln('Tem erupções cutâneas?'), read(S), (S == 1, assert(fact(erupcoes cutaneas))), perg24.
    perg24 :- writeln('Tem vermelhidão na pele?'), read(S), (S == 1, assert(fact(vermelhidao_na_pele))), perg25.
    perg25 :- writeln('Tem sensibilidade à luz?'), read(S), (S == 1, assert(fact(sensibilidade_a_luz))), perg26.
    perg26 :- writeln('Tem perdido peso?'), read(S), (S == 1, assert(fact(perda_de_peso))), perg27.
    perg27 :- writeln('Tem ganho peso?'), read(S), (S == 1, assert(fact(aumento_de_peso))), perg28.
    perg28 :- writeln('Tem intolerância ao frio?'), read(S), (S == 1, assert(fact(intolerancia_ao_frio))), perg29.
    perg29 :- writeln('Tem intolerância_ao_calor?'), read(S), (S == 1, assert(fact(intolerancia_ao_calor))), perg30.
    perg30 :- writeln('Tem urinado frequentemente?'), read(S), (S == 1, assert(fact(urinacao_frequente))), perg31.
    perg31 :- writeln('Tem sede excessiva?'), read(S), (S == 1, assert(fact(sede_excessiva))), perg32.
    perg32 :- writeln('Tem fome frequente?'), read(S), (S == 1, assert(fact(fome_frequente))), perg33.
    perg33 :- writeln('Tem presenca de sangue nas fezes?'), read(S), (S == 1, assert(fact(presenca_de_sangue_nas_fezes))), perg34.
    perg34 :- writeln('Tem suores noturnos?'), read(S), (S == 1, assert(fact(suores_noturnos))), perg35.
    perg35 :- writeln('Tem falta de ar?'), read(S), (S == 1, assert(fact(falta_de_ar))).
    
    
%Diagnosting the disease 

doenca :-
    demo(X),
    writeln('Baseado nos sintomas fornecidos, pode ter:'),
    writeln(X).

%Providing Treatment

tratamento :-
    fact(X),
    tratamento(Nome_tratamento, [Tratamentos], Custo, Duracao),
    writeln('Tratamento recomendado:'),
    write('Para tratar '),
    write(Nome_tratamento),
    write(' recomendamos o seguinte tratamento: '),
    writeln([Tratamentos]),
    writeln('Este tratamento terá um custo total de: '),
    writeln(Custo),
    writeln('E uma duração (em dias) de: '),
    writeln(Duracao).

%Main Function to Execute Consulation

consulta :-
    iniciar_consulta,
    doenca,
    tratamento.

这是我运行代码时 SWI-Prolog 的打印结果以供参考: enter image description here

interface prolog swi-prolog
1个回答
0
投票

read(S)
读取 Prolog 术语;请参阅 SWI Prolog 帮助:https://www.swi-prolog.org/pldoc/man?predicate=read%2F1 其中写着:

[注意]您可能在寻找谓词以从文件或用户读取输入时发现了这一点。在这种情况下,这很可能不是您所需要的。该谓词用于读取 Prolog 术语,该术语可能跨越多行,并且必须以句号结束(点字符后跟布局字符)。

尝试

read_line_to_string/2
,然后将字符串转换为数字,例如

?- read_line_to_string(user_input, Str),
   number_string(Num, Str).
© www.soinside.com 2019 - 2024. All rights reserved.