This page is not created by, affiliated with, or supported by Slack Technologies, Inc.
2023-02-16
Channels
- # announcements (18)
- # architecture (12)
- # babashka (20)
- # beginners (32)
- # biff (21)
- # calva (81)
- # clerk (6)
- # clj-kondo (16)
- # clj-otel (5)
- # cljsrn (8)
- # clojure (94)
- # clojure-austin (1)
- # clojure-australia (1)
- # clojure-europe (68)
- # clojure-nl (2)
- # clojure-norway (6)
- # clojure-uk (2)
- # clojurescript (13)
- # conjure (1)
- # core-logic (1)
- # cursive (7)
- # data-science (2)
- # datahike (3)
- # datomic (12)
- # emacs (33)
- # etaoin (1)
- # fulcro (8)
- # graalvm (2)
- # graphql (1)
- # honeysql (1)
- # hyperfiddle (97)
- # improve-getting-started (40)
- # jobs (2)
- # jobs-discuss (12)
- # lsp (9)
- # membrane (6)
- # nbb (2)
- # off-topic (16)
- # portal (6)
- # re-frame (2)
- # reagent (3)
- # releases (2)
- # remote-jobs (1)
- # tools-deps (7)
- # xtdb (38)
Hi I wonder if there is someone who could help me with this. I have a function that is accumulating something (load) until it doesn't exceed its limit (capacity). Please help me if you can!
It almost works as intended but I get non-unique
results. I have tried but failed in writing code that doesn't produce non-unique results. My function and function call looks like:
(defn assign-classes-to-teacher [classes teacher load-sum ?assigned-classes]
(fresh [?c ?class ?l ?next-load-sum ?rest-classes ?run-assigned-classes]
(conde
[(rembero ?class classes ?rest-classes)
(featurec teacher {:capacity ?c})
(featurec ?class {:load ?l})
(fd/+ ?l load-sum ?next-load-sum)
(fd/>= ?c ?next-load-sum)
(conso ?class ?run-assigned-classes ?assigned-classes)
(assign-classes-to-teacher
?rest-classes teacher ?next-load-sum ?run-assigned-classes)]
[(emptyo classes) (== '() ?assigned-classes)]
[(rembero ?class classes ?rest-classes)
(assign-classes-to-teacher
?rest-classes teacher load-sum ?assigned-classes)])))
(let [classes [{:id 0 :subject "da" :load 50 :block 1}
{:id 1 :subject "da" :load 42 :block 1}
{:id 2 :subject "ma" :load 40}
{:id 3 :subject "en" :load 30}]
teacher {:id 0 :subjects ["da" "en"] :capacity 100}]
(run 5 [?assigned-classes]
(assign-classes-to-teacher classes teacher 0 ?assigned-classes)))
And it returns the following (the first 2 answers are not unique)
(({:id 0, :subject "da", :load 50, :block 1} {:id 1, :subject "da", :load 42, :block 1})
({:id 0, :subject "da", :load 50, :block 1} {:id 1, :subject "da", :load 42, :block 1})
({:id 2, :subject "ma", :load 40} {:id 3, :subject "en", :load 30})
({:id 1, :subject "da", :load 42, :block 1} {:id 3, :subject "en", :load 30})
({:id 0, :subject "da", :load 50, :block 1} {:id 3, :subject "en", :load 30}))