Je suis nouveau sur CLIPS et le paradigme du backtracking fait mal à la tête.Comment éliminer if-then-else dans CLIPS pour mieux optimiser le code
On me pose une question où je dois produire la sortie suivante.
Q: Is the patient's temperature more than 39? [yes/no]: yes
The patient has fever
Q: Does the patient sick over a month? [yes/no]: yes
We suspect the patient has bacterial infection
Q: How about sore throat? [yes/no]: yes
We believe the patient has strep throat
Si nécessaire, j'ai défini quelques règles pour le faire fonctionner.
(defrule rule_1
(THE-PATIENT-HAS-A-SORE-THROAT)
(WE-SUSPECT-A-BACTERIAL-INFECTION) =>
(assert(WE-BELIEVE-THE-PATIENT-HAS-STREP-THROAT))
(printout t "We believe the patient has strep throat" crlf))
(defrule rule_2
(THE-PATIENT-TEMPERATURE-IS-40C) =>
(assert(THE-PATIENT-HAS-A-FEVER)))
(defrule rule_3
(THE-PATIENT-HAS-BEEN-SICK-OVER-A-MONTH)
(THE-PATIENT-HAS-A-FEVER) =>
(assert(WE-SUSPECT-A-BACTERIAL-INFECTION)))
(defrule ask-sick
(start-question) =>
(printout t "Q: Is the patient's temperature more than 39? [yes/no]: ")
(bind ?input (readline))
(if (neq ?input "no")
then
(assert (THE-PATIENT-TEMPERATURE-IS-40C))
(printout t "The patient has fever" crlf)
(printout t "Q: Does the patient sick over a month? [yes/no]: ")
(bind ?input2 (readline))
(if (neq ?input2 "no")
then
(assert (THE-PATIENT-HAS-BEEN-SICK-OVER-A-MONTH))
(printout t "We suspect the patient has bacterial infection" crlf)
(printout t "Q: How about sore throat? [yes/no]: ")
(bind ?input3 (readline))
(if (neq ?input3 "no")
then
(assert (THE-PATIENT-HAS-A-SORE-THROAT))
)
)
)
)
(deffacts start
(start-question)
)
Finalement, j'ai réussi à faire vivre le programme. Le problème est, à la règle demander-malade, je devais incorporer un tas de if-then-else pour faire fonctionner le programme où il n'est pas très conforme au paradigme de retour arrière.
Quelqu'un peut-il me dire comment dois-je optimiser comme il sait où procéder, règle1 -> règle2/Règle3, etc.
Wow! C'est vraiment génial! Merci! –