Ваша программа имеет чистое ядро - или придерживаться медицинских терминов - чистое сердце, но это переплетено с раковой тканью ввода / вывода! Таким образом, сделать это правильно очень сложно, если не невозможно. Например, в качестве незначительной ошибки ваша программа завершается с ошибкой kevin
. Но вы, вероятно, имели в виду, чтобы добиться успеха. С другой стороны, вы добьетесь успеха за таинственного господина []
! Кто это?
Итак, давайте отделим чистое от нечистого!
Чистая часть вашей программы связана с сопоставлением списка симптомов с возможными диагнозами. Ваше рабочее предположение состоит в том, что если есть один симптом, который является частью показаний к заболеванию, мы диагностируем это заболевание - просто чтобы быть уверенным. Так почему бы не назвать это symptoms_diagnosis/2
?
symptoms_diagnosis(Symptoms, Diagnosis) :-
member(Symptom, Symptoms),
disease(Diagnosis, Indications),
member(Symptom, Indications).
?- symptoms_diagnosis([sore_throat,fatigue,tiredness,rash], Diagnosis).
Diagnosis = hiv ;
Diagnosis = pregnancy ;
Diagnosis = flu ;
Diagnosis = flu ;
Diagnosis = hiv ;
false.
Обратите внимание, что даже без лишних слов у нас есть меньше избыточных решений, чем в вашей исходной программе. Так как же избавиться от оставшихся избыточных решений? Это делает трюк:
?- setof(t,symptoms_diagnosis([sore_throat,fatigue,tiredness,rash], Diagnosis),_).
Diagnosis = flu ;
Diagnosis = hiv ;
Diagnosis = pregnancy.
Поэтому, когда вы получаете избыточные решения, просто оберните setof(t, ..., _)
вокруг своей цели.
Вы можете использовать это всякий раз, когда ответы являются наземными. То есть в ответе не осталось переменной.
Может быть, вы предпочитаете ставить диагноз в своем собственном списке?
?- setof(Diagnosis,symptoms_diagnosis([sore_throat,fatigue,tiredness,rash],Diagnosis),Diagnoses).
Diagnoses = [flu, hiv, pregnancy].
Итак, теперь мы готовы к учебной больнице Принстон-Плейнсборо! Это только суеверие, если доктор Хаус не примет диагноз Пролога!
Что касается нечистой части, пожалуйста, посмотрите на подход @ Mog.