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)]]