Cod sursa(job #2523837)

Utilizator Consti.001FMI Dranca Constantin Consti.001 Data 14 ianuarie 2020 19:55:10
Problema Factorial Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.63 kb
read_KB(X):-see('E:\\KRR\\KB_Lab_5.txt'),read(X),seen.

welcome_message:-write("Welcome! I am here to help!\n").
temperature_question(X):-write("\nWhat is patient temperature?\n"),read(X).
days_question(X):-write("For how many days has the patient been sick?\n"),read(X).
cough_question(X):-write("Has patient cough?\n"),read(X).


add_temp_to_KB(KB, Temp, New_KB):-Temp > 38, append(KB, [[temp_more_than_38]], New_KB),!.
add_temp_to_KB(KB, Temp, KB):-Temp =< 38.

add_days_sick_to_KB(KB, Days, New_KB):-Days >= 2, append(KB, [[sick_for_at_least_2_days]], New_KB),!.
add_days_sick_to_KB(KB, Days, KB):-Days < 2.

add_cough_to_KB(KB, Cough , New_KB):-Cough == yes, append(KB, [[patient_has_cough]], New_KB),!.
add_cough_to_KB(KB, Cough , KB):-Cough == no.

eliminate_negations([],[]):-!.
eliminate_negations([H|T],[Arg|Rest]):-eliminate_negations(T, Rest), arg(1, H, Arg).

backward_chain_solve(_,_, [], yes):-!.
backward_chain_solve(_, [], _, no):-!.
backward_chain_solve(KB,[[Head|Clause]|_], [Q1|Sentences], yes):-
    Head==Q1,
    eliminate_negations(Clause,Rest),
    append(Rest, Sentences, New_sentences),
    backward_chain_solve(KB,KB,New_sentences,Rez),
    Rez == yes,!.

backward_chain_solve(KB,[_|Rest_KB], Sentences, Res):-
    backward_chain_solve(KB,Rest_KB, Sentences, Res).

verify_solved_literals([], []):-!.
verify_solved_literals([], _):-!.
verify_solved_literals([H|T], Sentences):-
    member(H, Sentences),
    verify_solved_literals(T, Sentences),!.

forward_chain_solve(_, _, [], _, yes):-!.
forward_chain_solve(_, [], _, _, no):-!.
forward_chain_solve(KB, [[H|Clause]|_], Sentences, Solved, Res):-
    member(H, Sentences),
    eliminate_negations(Clause, POZ_Clause),
    verify_solved_literals(POZ_Clause, Solved),
    delete(Sentences, H, New_Sentences),
    append(Solved, [H], New_Solved),
    forward_chain_solve(KB, KB, New_Sentences, New_Solved, Res),!.

forward_chain_solve(KB, [[H|Clause]|_], Sentences, Solved, Res):-
    not(member(H, Sentences)),
    not(member(H, Solved)),
    eliminate_negations(Clause, POZ_Clause),
    verify_solved_literals(POZ_Clause, Solved),
    append(Solved, [H], New_Solved),
    forward_chain_solve(KB, KB, Sentences, New_Solved, Res),!.

forward_chain_solve(KB, [_|Rest_KB], Sentences, Solved, Res):-
    forward_chain_solve(KB, Rest_KB, Sentences, Solved, Res).

get_answers(KB, Temp, Days, Cough, Ans_Backward, Ans_Forward):-
    add_temp_to_KB(KB, Temp, KB_1),
    add_days_sick_to_KB(KB_1, Days, KB_2),
    add_cough_to_KB(KB_2, Cough , New_KB),
    backward_chain_solve(New_KB, New_KB, [patient_has_pneumonia], Ans_Backward),
    forward_chain_solve(New_KB, New_KB, [patient_has_pneumonia], [], Ans_Forward),!.
    
continue_prog(X):-X \== stop.

print_ans(yes, X):-atom_string(X, Ans), string_concat(Ans, ": YES patient has pneumonia\n", Y),write(Y),!.
print_ans(no, X):-atom_string(X, Ans), string_concat(Ans, ": NO I can't say if patient has pneumonia\n", Y),write(Y).

run(KB):-
    temperature_question(Temp),
    continue_prog(Temp),
    days_question(Days),
    continue_prog(Days),
    cough_question(Cough),
    continue_prog(Cough),
    get_answers(KB, Temp, Days, Cough, Ans_Backward, Ans_Forward),
    print_ans(Ans_Backward, backward),
    print_ans(Ans_Forward, forward),
    run(KB),!.
run(_).

start:-read_KB(KB), welcome_message,run(KB),!.

verify(Ans_Backward, Ans_Forward):-read_KB(KB),get_answers(KB, 39, 5, yes, Ans_Backward, Ans_Forward).

[[patient_has_pneumonia, n(patient_has_cough), n(patient_has_infection)], [patient_has_fever, n(temp_more_than_38)], [patient_has_infection, n(sick_for_at_least_2_days), n(patient_has_fever)]]