Skip to content

Instantly share code, notes, and snippets.

@nfedyashev
Created June 23, 2020 11:28
Show Gist options
  • Save nfedyashev/7acd8194013097e0ff27216570f4bbf3 to your computer and use it in GitHub Desktop.
Save nfedyashev/7acd8194013097e0ff27216570f4bbf3 to your computer and use it in GitHub Desktop.
(ns clara.compatibility
(:require [clara.rules.accumulators :as acc]
[clara.tools.tracing :as tracing]
[clara.tools.inspect]
[clara.rules :refer :all]))
(defrecord Compatible [items])
(defrecord Incompatible [items])
(defrecord Protein [])
(defrecord Sugar [])
(defrecord Meat [])
(defrecord Chicken [])
(defrecord Fish [])
(defrecord Egg [])
(defrecord Cheese [])
(defrecord GenericWithMsg [msg])
(defn create-meat []
(->Protein))
;; Крахмал starch
(defrecord Starch [])
(defrecord Bread [])
(defrecord Kasha []) ;; not a typo
(defrecord Potato [])
(defrecord Pasta [])
(defn create-bread []
(->Starch))
(defrule do-not-mix-proteins
"разные виды белка за один прием нельзя сочетать ;; например яйца и мясо или с сыром"
[Protein]
=>
(insert! (->Incompatible [(-> Protein)])))
(defrule do-not-mix-with-sugars
"белок нельзя совмещать с углеводами ;; например нельзя с углеводами тесто ;; пюре с котлетой нельзя;;
главное правило - не смешивать животный белок с крахмалом(хлеб картошка макароны каши)
"
[Protein]
=>
(insert! (->Incompatible [(-> Sugar)])))
(defquery get-incompatibles
"Query to find what is incompatible"
[]
[?incompat <- Incompatible])
(defquery get-compatibles
"Query to find what is compatible"
[]
[?compat <- Compatible])
(defrule do-mix-proteins-with-greens
"хорошо: ;; мясо с овощами с травами, чеснок, лук, петрушка, кинза, острый перец ; ;; с большим кол-вом зелени"
[Protein]
=>
(insert! (->Compatible [(->GenericWithMsg "овощами с травами, чеснок, лук, петрушка, кинза, острый перец ; ;; с большим кол-вом зелени")])))
;; TODO separate app - glicemic indices
;; худшее сочетание по гликемическому индексу
;; красное мясо с белым хлебом
;; а лучшее сочетание это
;; гречневая каша с козьим сыром - мин нагрузка
(defrule do-not-mix-starch-with-acidic-fruits
"не сочетается крахмальные продукты
с кислыми фруктами
гранаты цитрусовые + кислые яблоки и кислый виноград
потому что гасит фермент который отвечает за расщипление крахмала"
[Starch]
=>
(insert! (->Incompatible [(->GenericWithMsg "кислыми фруктами(гранаты цитрусовые + кислые яблоки и кислый виноград)")])))
(defrule do-not-mix-starches
"крахмалы друг с другом сочетать не нужно
напр кашу с хлебом - не усвоится ни каша ни хлеб"
[Starch]
=>
(insert! (->Incompatible [(->Starch)])))
(defrecord Oils [])
(defrule do-mix-starches-with-oils
"крахмалы нормально сочитаются с жирами
каша + масло; хлеб + сало; овощное рагу(масла)+макароны; бобовые(чечевица нут фасоль горох) с жирами"
[Starch]
=>
(insert! (->Compatible [(->Oils)])))
(defrule do-mix-starches-with-oils
"углеводы(напр крахмалы) нормально сочитаются с жирами
каша + масло; хлеб + сало; овощное рагу(масла)+макароны; бобовые(чечевица нут фасоль горох) с жирами"
[Sugar]
=>
(insert! (->Compatible [(->Oils)])))
(defrecord Cucumber [])
(defrecord Tomato [])
(defrecord CabbageKapusta [])
(defrule do-cucumber-rules
"не сочетается огурцы с помидорами в салате
потому что помидоры более кислые а огурцы более щелочной продукт
"
[Cucumber]
=>
(insert! (->Incompatible [(->Tomato)]) (->Compatible [(->CabbageKapusta)])))
(defrule do-tomato-rules
"не сочетается огурцы с помидорами в салате
потому что помидоры более кислые а огурцы более щелочной продукт
помидоры с фетой или брынзой(с белыми сырами - более легкими) + руккола "
[Tomato]
=>
(insert! (->Incompatible [(->Cucumber)]) (->Compatible [(->GenericWithMsg "с фетой или брынзой(с белыми сырами - более легкими) + руккола")])))
(defrecord StrongAlcohol [])
(defrule do-not-mix-alcohol-with-proteins
"худшее новогоднее сочетание
крепкий алкоголь+салаты с майонезом
алкоголь не способствует расщеплению белка а тормозит"
[StrongAlcohol]
=>
(insert! (->Incompatible [(->Protein)])))
(defrecord Cola [])
(defrule do-not-mix-alcohol-with-proteins
"кола+мясо тоже плохое сочетание
да кола(жидкий сахар) это кислота но это не помогает"
[Cola]
=>
(insert! (->Incompatible [(->Protein)])))
(defrecord Fruit [])
(defrule do-not-mix-fruits-with-anything
"лучше не стоит фруктами заедать основной прием пищи
или чем-то сладким или с кремом или печеным
за 20-30 минут до приема пищи или через 2-3 часа после последнего приема пищи"
[Fruit]
=>
(insert! (->Incompatible [(->GenericWithMsg "не сочетаются с друг продуктами ; не стоит фруктами заедать основной прием пищи; или чем-то сладким или с кремом или печеным ; принимать только как отдельный прием пищи ; желательно за 20-30 минут до основного приема - но не в коем случае не на десерт ; за 20-30 минут до приема пищи или через 2-3 часа после последнего приема пищи")])))
;; 3 категории фруктов
;; сладкие инжир бананы финики хурма + сухофрукты + ягоды => дольше всего перевариваются и провоцируют процессы брожения. Можно сочетать с кислой молочкой
;; полу-кислые-полусладкие яблоки сливы абрекосы персики черника малина земляника cочетаются хорошо друг с другом и сочетаются с белковыми продуктами с такими где много жиров(с сыром или жирным творогом, с другими белковыми не сочетается)
;; кислые гранат цитрусовые - лимон мандарин апельсин кислые яблоки кислый виноград кислые сливы или кислые груши - сочетаются друг с другом НО с лимоном подают рыбу - так делать нельзя - лимон не сочетается с белковыми продуктами - лимон имеет кислую реакцию, но внутри работает как щелочной продукт - а для белков нужна кислота
;; орехи и семечки сочетаются друг с другом хорошо и с сухофруктами - миксы которые продаются дружат друг с другом хорошо - но с другими белковыми лучше не сочетать
;; орехи сочетаются с овощами
;; лимонный сок сочетается хорошо с овощными соками
;; хорошо:
;; * яблоко хорошо сочетается с овощными соками - напр яблоко с морковкой
;; * не сладкая груша с сельдереем
;; имбирный сок с овощными и фруктовыми соками
(defrecord Watermelon [])
(defrule do-not-mix-watermelon
"всегда отдельно от других продуктов + коридор 2 часа в обе стороны"
[Watermelon]
=>
(insert! (->Incompatible [(->GenericWithMsg "всегда отдельно от других продуктов + коридор 2 часа в обе стороны")])))
(defrecord Melon [])
(defrule do-not-mix-melon
"всегда отдельно от других продуктов + коридор 2 часа в обе стороны"
[Watermelon]
=>
(insert! (->Incompatible [(->GenericWithMsg "всегда отдельно от других продуктов + коридор 2 часа в обе стороны")])))
(defn run-examples
"Function to run the above example."
[]
(let [
_ (println "\n===============\n")
facts [
;; (create-meat)
;; (create-bread)
;; (->Cucumber)
;; (->Tomato)
(->StrongAlcohol)
]
session (-> (mk-session 'clara.compatibility :cache false)
(insert-all facts)
fire-rules
)]
(let [res1 (query session get-incompatibles)
_ (println "\nin get-incompatibles" res1)
res (query session get-compatibles)
_ (println "\nin get-compatibles" res)
]
;; (doseq [{{value :value} :?incompat} res]
;; (println "Your daily food quota is completed for: " (format "%.1f" (* 100 value)) "%"))
nil
)
))
(run-examples)
(comment
(run-examples)
(clara.tools.inspect/explain-activations sess)
(clara.tools.inspect/inspect sess)
;; (clara.tools.inspect/strict-map->Explanation sess)
(clara.tools.inspect/with-full-logging sess)
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment