Мой код работает, но проблема в том, что он показывает одни и те же результаты более одного раза. Вот мой код:Пролог Рекурсия пропускает те же результаты
disease(hiv,[sore_throat,headache,fever,rash]).
disease(pregnancy,[fatigue,vomiting,light_headedness,increased_waistline]).
disease(flu,[fatigue,fever,tiredness,nasal_discharge]).
diagnose([], []).
diagnose(Name, [H|T]) :-
disease(The_Disease, Symptoms),
member(H, Symptoms),
write(Name), write(' has/is '), writeln(The_Disease),
diagnose(Name, T).
member(X,[X|_]).
member(X,[_|T]):-
member(X,T).
Результат при выполнении в прологе:
?- diagnose(kevin,[sore_throat,fatigue,tiredness,rash]).
kevin has/is hiv
kevin has/is pregnancy
kevin has/is flu
kevin has/is hiv
kevin has/is flu
kevin has/is flu
kevin has/is hiv
false.
Как избежать этого же результаты? Я пробовал использовать другой метод, который я нашел здесь:
filter_doubles([], []).
filter_doubles([X|L], Result) :-
(memberchk(X,L) ->
filter_doubles(L, Result)
;
filter_doubles(L, Result0),
Result = [X|Result0]
).
Но я не смог применить его к своему коду. Помоги пожалуйста.
Возможно ли это, что вы проверяете * все * симптомы болезни присутствуют, прежде чем возвращать этот диагноз? – hardmath
@ hardmath да, это план. – Mezzan