; your code goes here
;; ============================================================
;; SISTEM PAKAR DIAGNOSIS PENYAKIT MENGGUNAKAN CLIPS
;; Domain : Flu, COVID-19, Alergi
;; Fitur : Menanyakan gejala kepada user lalu memberikan diagnosis
;; ============================================================
(clear)
;; ------------------------------------------------------------
;; 1. TEMPLATE DATA PASIEN (menyimpan jawaban user)
;; ------------------------------------------------------------
(deftemplate patient-symptom
(slot demam (default unknown))
(slot batuk (default unknown))
(slot pilek (default unknown))
(slot sakit_tenggorokan (default unknown))
(slot lelah (default unknown))
(slot sesak_nafas (default unknown))
(slot bersin (default unknown))
(slot mata_gatal (default unknown))
(slot demam_tinggi (default unknown))
)
;; ------------------------------------------------------------
;; 2. AWAL PROGRAM: MENGISI DATA PASIEN DARI USER
;; ------------------------------------------------------------
(deffacts initial-data
(patient-symptom)
(diagnosis-status waiting)
)
(defrule ask-demam
(diagnosis-status waiting)
(patient-symptom (demam unknown))
=>
(printout t crlf "Apakah pasien mengalami demam? (ya/tidak): ")
(bind ?answer (read))
(if (eq ?answer ya) then
(assert (patient-symptom (demam ya)))
else
(assert (patient-symptom (demam tidak)))))
(defrule ask-batuk
(diagnosis-status waiting)
(patient-symptom (demam ?d) (batuk unknown))
=>
(printout t crlf "Apakah pasien mengalami batuk? (ya/tidak): ")
(bind ?answer (read))
(if (eq ?answer ya) then
(assert (patient-symptom (batuk ya)))
else
(assert (patient-symptom (batuk tidak)))))
(defrule ask-pilek
(diagnosis-status waiting)
(patient-symptom (batuk ?b) (pilek unknown))
=>
(printout t crlf "Apakah pasien mengalami pilek? (ya/tidak): ")
(bind ?answer (read))
(if (eq ?answer ya) then
(assert (patient-symptom (pilek ya)))
else
(assert (patient-symptom (pilek tidak)))))
(defrule ask-sakit-tenggorokan
(diagnosis-status waiting)
(patient-symptom (pilek ?p) (sakit_tenggorokan unknown))
=>
(printout t crlf "Apakah pasien mengalami sakit tenggorokan? (ya/tidak): ")
(bind ?answer (read))
(if (eq ?answer ya) then
(assert (patient-symptom (sakit_tenggorokan ya)))
else
(assert (patient-symptom (sakit_tenggorokan tidak)))))
(defrule ask-lelah
(diagnosis-status waiting)
(patient-symptom (sakit_tenggorokan ?st) (lelah unknown))
=>
(printout t crlf "Apakah pasien merasa lelah berlebihan? (ya/tidak): ")
(bind ?answer (read))
(if (eq ?answer ya) then
(assert (patient-symptom (lelah ya)))
else
(assert (patient-symptom (lelah tidak)))))
(defrule ask-sesak-nafas
(diagnosis-status waiting)
(patient-symptom (lelah ?l) (sesak_nafas unknown))
=>
(printout t crlf "Apakah pasien mengalami sesak nafas? (ya/tidak): ")
(bind ?answer (read))
(if (eq ?answer ya) then
(assert (patient-symptom (sesak_nafas ya)))
else
(assert (patient-symptom (sesak_nafas tidak)))))
(defrule ask-bersin
(diagnosis-status waiting)
(patient-symptom (sesak_nafas ?sn) (bersin unknown))
=>
(printout t crlf "Apakah pasien sering bersin? (ya/tidak): ")
(bind ?answer (read))
(if (eq ?answer ya) then
(assert (patient-symptom (bersin ya)))
else
(assert (patient-symptom (bersin tidak)))))
(defrule ask-mata-gatal
(diagnosis-status waiting)
(patient-symptom (bersin ?br) (mata_gatal unknown))
=>
(printout t crlf "Apakah pasien merasa mata gatal? (ya/tidak): ")
(bind ?answer (read))
(if (eq ?answer ya) then
(assert (patient-symptom (mata_gatal ya)))
else
(assert (patient-symptom (mata_gatal tidak)))))
;; ------------------------------------------------------------
;; 3. ATURAN DIAGNOSIS PENYAKIT
;; ------------------------------------------------------------
(defrule diagnose-flu
(patient-symptom (demam ya)
(batuk ya)
(pilek ya)
(sakit_tenggorokan ya)
(lelah ya))
(diagnosis-status waiting)
=>
(assert (diagnosis (penyakit Flu)
(deskripsi "Influenza adalah infeksi virus pada saluran pernapasan.")
(saran "Istirahat cukup, minum banyak air, dan konsumsi obat penurun demam jika perlu.")))
(retract (diagnosis-status waiting)))
(defrule diagnose-covid19
(patient-symptom (demam ya)
(batuk ya)
(sesak_nafas ya)
(lelah ya))
(diagnosis-status waiting)
=>
(assert (diagnosis (penyakit COVID-19)
(deskripsi "COVID-19 adalah penyakit infeksi yang disebabkan oleh virus SARS-CoV-2.")
(saran "Segera lakukan tes PCR, isolasi mandiri, dan hubungi fasilitas kesehatan terdekat.")))
(retract (diagnosis-status waiting)))
(defrule diagnose-covid19-varian
(patient-symptom (demam ya)
(batuk ya)
(pilek ya)
(sakit_tenggorokan ya)
(sesak_nafas ya)
(lelah ya))
(diagnosis-status waiting)
=>
(assert (diagnosis (penyakit COVID-19 varian Omicron)
(deskripsi "Varian Omicron memiliki gejala mirip flu biasa namun mudah menular.")
(saran "Segera lakukan tes PCR, isolasi mandiri, dan pantau gejala pernapasan.")))
(retract (diagnosis-status waiting)))
(defrule diagnose-alergi
(patient-symptom (pilek ya)
(bersin ya)
(mata_gatal ya))
(not (demam ya))
(diagnosis-status waiting)
=>
(assert (diagnosis (penyakit Alergi)
(deskripsi "Alergi adalah reaksi sistem imun terhadap zat asing (alergen).")
(saran "Hindari pemicu alergi, konsumsi antihistamin, dan konsultasi ke dokter.")))
(retract (diagnosis-status waiting)))
(defrule diagnose-tidak-terdeteksi
(diagnosis-status waiting)
=>
(assert (diagnosis (penyakit Tidak Terdeteksi)
(deskripsi "Gejala yang Anda masukkan tidak sesuai dengan basis pengetahuan kami.")
(saran "Silakan konsultasi ke dokter untuk pemeriksaan lebih lanjut.")))
(retract (diagnosis-status waiting)))
;; ------------------------------------------------------------
;; 4. ATURAN MENAMPILKAN HASIL DIAGNOSIS
;; ------------------------------------------------------------
(defrule print-diagnosis
(diagnosis (penyakit ?p) (deskripsi ?d) (saran ?s))
=>
(printout t crlf "========================================" crlf)
(printout t "HASIL DIAGNOSIS AWAL" crlf)
(printout t "========================================" crlf)
(printout t "Penyakit : " ?p crlf)
(printout t "Deskripsi: " ?d crlf)
(printout t "Saran : " ?s crlf)
(printout t "========================================" crlf)
(printout t "Catatan: Diagnosis ini hanya bersifat edukasi." crlf)
(printout t "Selalu konsultasikan ke dokter untuk kepastian medis." crlf)
(printout t "========================================" crlf crlf))
(exit)
; empty line at the end