Можно ли вставить оператор Clojure в середину серии вызовов core.logic «а-ля Prolog»?
Пролог смешивает логические (ошибочные) цели и (безошибочные) процессы, такие как
write/2
или же
assert/1
. Можно ли сделать это с помощью core.logic Clojure?
Например:
(pldb/with-db myFacts
(l/run* [x y]
(person x)
(println "we found a person!")
(likes y x)
)
)
Похоже, это не может работать, потому что
(println ...)
это функция Clojure, встроенная в core.logic
run
(который должен содержать только условия/ограничения, которые я предполагаю).
Что еще интереснее, я хотел бы иметь возможность утверждать новые факты посреди проверки логических условий, как в Прологе:
liked(x,y):-
person(x),
assertz(likable(x)),
likes(y,x).
Что примерно будет выглядеть так в core.logic, я предполагаю:
(pldb/with-db myFacts
(l/run* [x y]
(person x)
(def newFacts (-> newFacts (pldb/db-fact likeable x)))
(likes y x)
)
)
Эти примеры глупы, но в целом речь идет о вставке процедурных команд посреди проверки ограничений в core.logic, как это делается в Прологе.
Например, одним конкретным применением этого может быть возможность собирать дуги в рекурсивном обходе графа с помощью утверждения. Но, если я не ошибаюсь, это возможно только в том случае, если у нас есть возможность смешивать утверждения с логическими условиями.
Большое спасибо за вашу помощь и руководство в этом.
ОБНОВЛЕНИЕ: я думаю, что, возможно, понял это: включение оператора Clojure в порядке, но оно должно возвращать true ; в отличие от Пролога, эти функции не выполняются автоматически. Итак, все, что нам нужно добавить, это:
(l/== (println "hello") true))
Звучит правильно? К вашему сведению, этот пост был действительно полезен: https://ask.clojure.org/index.php/9546/can-core-logic-ask-questions .