Можно ли вставить оператор 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 .

0 ответов

Другие вопросы по тегам