This page is not created by, affiliated with, or supported by Slack Technologies, Inc.
2018-11-26
Channels
- # adventofcode (2)
- # announcements (9)
- # bangalore-clj (1)
- # beginners (158)
- # calva (32)
- # cider (2)
- # clara (4)
- # cljdoc (40)
- # cljs-dev (3)
- # cljsrn (6)
- # clojure (45)
- # clojure-brasil (2)
- # clojure-dev (35)
- # clojure-europe (9)
- # clojure-italy (7)
- # clojure-nl (2)
- # clojure-uk (29)
- # clojurescript (144)
- # code-reviews (3)
- # core-logic (9)
- # cursive (11)
- # datascript (8)
- # datomic (9)
- # duct (1)
- # figwheel (6)
- # fulcro (11)
- # hyperfiddle (27)
- # kaocha (23)
- # luminus (1)
- # off-topic (7)
- # onyx (2)
- # pathom (3)
- # re-frame (61)
- # reagent (12)
- # remote-jobs (10)
- # shadow-cljs (40)
- # spacemacs (4)
- # sql (27)
- # tools-deps (6)
- # unrepl (3)
- # vim (47)
I'm trying to write a program to calculate the solution in the board game Clue. I'm very new to core.logic
, so I'm starting off with a really simple version: given all the cards in my hand and in my opponents' hands, what are the three remaining cards? I've written the code below, but (do-query)
just makes the CPU max out and never returns. How should I write this? Should I take a different approach?
(def players [:green :scarlet :peacock :mustard :white :plum])
(def rooms [:study :hall :lounge :dining-room :kitchen :ballroom
:conservatory :billiard-room :library])
(def weapons [:candlestick :lead-pipe :revolver :wrench :rope :knife])
(def all-cards (concat players rooms weapons))
(defn do-query []
(let [cards (repeatedly 21 logic/lvar)
[solution remaining] (split-at 3 cards)
[my-cards remaining] (split-at 6 remaining)
[green-cards scarlet-cards] (split-at 6 remaining)]
(logic/run 1 [p r w]
(logic/== solution [p r w])
(logic/permuteo all-cards cards)
(logic/== my-cards [:rope :study :scarlet
:conservatory :mustard :wrench])
(logic/== green-cards [:green :lead-pipe :knife :dining-room
:billiard-room :library])
(logic/== scarlet-cards [:revolver :plum :hall
:lounge :kitchen :white])
(logic/membero p players)
(logic/membero r rooms)
(logic/membero w weapons))))
I think I would start from a map of card names to lvars, where each lvar will have a value like :mine, :opponent, or :deck (if deck is valid in clue)
thanks, I'll try going down that route
if I have a core.logic goal that looks like this
(fresh [?1 ?2 ?3 ?4]
(membero ?1 vars)
(membero ?2 vars)
(membero ?3 vars)
(membero ?4 vars)
...)
will that expand into vars × vars × vars × vars
in memory, even if I have other goals that constrain the answer set to something much smaller?