% Representative example: clinical-trial screening.
%
% The program models a small diabetes trial screening workflow. Helper
% predicates keep the inclusion/exclusion logic separate from the concise
% public `triple/3` report.

patient(p001).
patient(p002).
patient(p003).
patient(p004).

age(p001, 54).
age(p002, 67).
age(p003, 31).
age(p004, 45).

diagnosis(p001, type2_diabetes).
diagnosis(p002, type2_diabetes).
diagnosis(p003, type2_diabetes).
diagnosis(p004, type2_diabetes).

lab(p001, hba1c_pct, 8.4).
lab(p002, hba1c_pct, 7.9).
lab(p003, hba1c_pct, 9.1).
lab(p004, hba1c_pct, 6.4).

lab(p001, egfr_ml_min, 83.0).
lab(p002, egfr_ml_min, 38.0).
lab(p003, egfr_ml_min, 91.0).
lab(p004, egfr_ml_min, 72.0).

condition(p003, pregnant).

inclusion_adult(Patient) :-
  patient(Patient),
  age(Patient, Age),
  ge(Age, 18).

inclusion_diagnosis(Patient) :-
  diagnosis(Patient, type2_diabetes).

inclusion_hba1c(Patient) :-
  lab(Patient, hba1c_pct, Hba1c),
  ge(Hba1c, 7.0),
  le(Hba1c, 10.5).

exclusion_renal(Patient) :-
  lab(Patient, egfr_ml_min, Egfr),
  lt(Egfr, 45.0).

exclusion_pregnancy(Patient) :-
  condition(Patient, pregnant).

screen_eligible(Patient) :-
  inclusion_adult(Patient),
  inclusion_diagnosis(Patient),
  inclusion_hba1c(Patient),
  not(exclusion_renal(Patient)),
  not(exclusion_pregnancy(Patient)).

screen_fail(Patient) :- exclusion_renal(Patient).
screen_fail(Patient) :- exclusion_pregnancy(Patient).
screen_fail(Patient) :- patient(Patient), not(inclusion_hba1c(Patient)).

triple(Patient, type, trial_candidate) :-
  screen_eligible(Patient).

triple(Patient, status, eligible) :-
  screen_eligible(Patient).

triple(Patient, reason, "meets inclusion criteria and no listed exclusion") :-
  screen_eligible(Patient).

triple(Patient, status, screen_fail) :-
  screen_fail(Patient).

triple(Patient, reason, "eGFR below renal safety threshold") :-
  exclusion_renal(Patient).

triple(Patient, reason, "pregnancy exclusion applies") :-
  exclusion_pregnancy(Patient).

triple(Patient, reason, "HbA1c is outside protocol range") :-
  patient(Patient),
  not(inclusion_hba1c(Patient)).
