Tôi đang gặp khó khăn khi quấn đầu quanh cách trộn clojure và core.logic.Làm thế nào để bạn sử dụng core.logic một cách thiết thực trong một chương trình Clojure lớn hơn?
Ví dụ nói rằng tôi có vấn đề sau đây:
Tôi có một danh sách các cặp giá trị key với điểm kèm theo:
(:foo "10" 2)
(:bar "20" 3)
(:baz "30" 7)
Và tôi cũng có một bản đồ:
{:foo "10",
:bar "42",
:baz "30"}
Điều tôi muốn làm là trả lại danh sách điểm số dựa trên danh sách điểm số được đánh giá theo bản đồ.
Sử dụng logic lõi tôi có thể làm một cái gì đó như thế này:
(defrel score key value score)
(fact score :foo "10" 2)
(fact score :bar "20" 3)
(fact score :baz "30" 7)
(run* [q]
(conde
((score :foo "10" q))
((score :baz "30" q))))
Và tôi nhận được kết quả dự kiến:
(2 7)
Vấn đề của tôi là tôi không thấy làm thế nào để tắt chức năng này thành một cái gì đó Tôi có thể chạy trong một chương trình lớn hơn động. Có nghĩa là tôi sẽ có các bản đồ khác nhau và các ràng buộc khác nhau để áp dụng vào các thời điểm khác nhau. Tôi nghĩ rằng tôi có thể tạo ra các đối số để conde bằng cách viết một chức năng mà có bản đồ và đầu ra các ràng buộc, nhưng làm thế nào để tôi có chạy * đánh giá trong bối cảnh của một tập hợp các sự kiện tạm thời?
Tôi chắc chắn có thể viết một hàm để trả lại những gì tôi muốn mà không có core.logic, nhưng điều đó có vẻ kém thanh lịch hơn. Có lẽ tôi đang sủa cây sai (tôi mới dùng cả Clojure và core.logic) và đây không phải là vấn đề khó khăn.
Vì vậy, câu hỏi của tôi là:
Làm thế nào để bạn kết hợp trong logic lõi khi bạn kéo các sự kiện và những hạn chế của bạn từ một nguồn bạn sẽ không biết cho đến khi thời gian chạy?
Và có liên quan, bạn làm như thế nào trong một môi trường mà bạn muốn đánh giá một tập hợp các ràng buộc trong môi trường thực tế mới?
Xin cảm ơn. Điều này đã khiến tôi đi đúng hướng. Tôi sẽ cần phải làm việc thông qua các macro nhưng điều này sẽ giúp rất nhiều và tôi khá chắc chắn core.logic là giải pháp đúng cho vấn đề tôi muốn giải quyết. – jgerman
Xem thêm wiki ví dụ về việc mở rộng core.logic bằng cách sử dụng API https://github.com/clojure/core.logic/wiki/Extending-core.logic-%28Datomic-example%29 –