[英]How do I use core.logic to search for valid nested maps in a database of maps?
我目前正在解決一個問題,該問題要求尋找可以履行訂單的某些供應商。 供應商表示為地圖,訂單也是如此。 如果供應商可以為訂單的郵政編碼、訂單的服務水平、訂單請求的車輛提供服務,並且具有適當的額外便利條件,則供應商可以履行訂單。 我一直在嘗試使用 core.logic 來解決這個問題,所以我使用 core.logic.pldb 作為隊列將供應商存儲在邏輯數據庫中。 在我研究如何將 core.logic 與 Clojure 地圖結合使用后,我一直在嘗試使用 featurec、membero 和 PMap 的組合來解決問題。 下面顯示的代碼是我努力的當前狀態。
(pldb/db-rel fleet fl)
(def f1 {:id 1
:zipcodes #{"02138" "33135" "33157" "02139"}
:services #{"standard" "through_door" "to_curb" "to_door"}
:vehicles #{"any" "sedan" "suv" "wav"}
:extra {:covid-19 true}
:cost 20
:weight 100})
(def f2 {:id 2
:zipcodes #{"33157" "02139"}
:services #{"standard" "through_door"}
:vehicles #{"sedan" "suv"}
:extra {:covid-19 true}
:cost 40
:weight 80})
(def f3 {:id 3
:zipcodes #{"02138" "33135"}
:services #{"to_curb" "to_door"}
:vehicles #{"any" "sedan"}
:extra {:covid-19 true}
:cost 60
:weight 120})
(def ex_m {:ride {:zipcodes "02138"
:appointment-time "0630"
:services "to_curb"
:vehicles "sedan"}
:accessibility {:extra {:covid-19 true}}})
(def fleets
(pldb/db
[fleet (map->PMap f1)]
[fleet (map->PMap f2)]
[fleet (map->PMap f3)]))
(defn find-fleets [m]
(run-db* fleets [fl]
(fresh [fl_zipcodes fl_services fl_vehicles fl_covid
ride_info ride_zip ride_service ride_vehicle ride_covid]
(membero ride_zip fl_zipcodes)
(membero ride_service fl_services)
(membero ride_vehicle fl_vehicles)
(== fl_covid ride_covid)
(featurec fl {:zipcodes fl_zipcodes
:services fl_services
:vehicles fl_vehicles
:extra {:covid-19 fl_covid}})
(featurec m {:ride ride_info
:accessibility {:extra {:covid-19 ride_covid}}})
(featurec ride_info {:zipcodes ride_zip
:services ride_service
:vehicles ride_vehicle}))))
但是,當我嘗試運行上面的 find-fleets 函數時,
(find-fleets (map->PMap ex_m))
我收到以下錯誤並跟蹤:
; Error printing return value (StackOverflowError) at clojure.lang.KeywordLookupSite$1/get (KeywordLookupSite.java:45).
; null
關於 core.logic 以及如何將其與 Clojure 地圖一起使用,我在這里是否遺漏了什么? 我只是錯過了一些愚蠢的錯誤嗎?
先感謝您!
如果您稍微重新表述一下您的問題,您可以使用submatch?
功能從圖珀洛庫。 從文檔:
(submatch? smaller larger)
Returns true if the first arg is (recursively) a
subset/submap/subvec of the 2nd arg
一個例子
(ns tst.demo.core
(:use tupelo.core tupelo.test)
(:require [tupelo.core :as t]))
(def shops
[{:id 1
:zipcodes #{"02138" "33135" "33157" "02139"}
:services #{"standard" "through_door" "to_curb" "to_door"}
:vehicles #{"any" "sedan" "suv" "wav"}
:extra {:covid-19 true}
:cost 20
:weight 100}
{:id 2
:zipcodes #{"33157" "02139"}
:services #{"standard" "through_door"}
:vehicles #{"sedan" "suv"}
:extra {:covid-19 true}
:cost 40
:weight 80}
{:id 3
:zipcodes #{"02138" "33135"}
:services #{"to_curb" "to_door"}
:vehicles #{"any" "sedan"}
:extra {:covid-19 true}
:cost 60
:weight 120}])
定義維修作業以匹配商店的結構(具有集合或地圖值的地圖)。
(def job
{:zipcodes #{"02138"}
:services #{"to_curb"}
:vehicles #{"sedan"}
:extra {:covid-19 true}})
單元測試顯示子submatch?
在行動中發揮作用。
(dotest
(let [matches (t/keep-if #(t/submatch? job %) shops)] ; synonym for `filter`
(is= matches
[{:id 1,
:zipcodes #{"02138" "02139" "33157" "33135"},
:services #{"to_curb" "standard" "to_door" "through_door"},
:vehicles #{"wav" "any" "suv" "sedan"},
:extra {:covid-19 true},
:cost 20,
:weight 100}
{:id 3,
:zipcodes #{"02138" "33135"},
:services #{"to_curb" "to_door"},
:vehicles #{"any" "sedan"},
:extra {:covid-19 true},
:cost 60,
:weight 120}])
))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.