Простой Пролог к ​​Clojure core.logic - PullRequest
2 голосов
/ 16 января 2020

Я недавно играл с Прологом и обдумывал, как представлять некоторые задачи, которые я хочу с ним выполнить, которые в основном касаются базы данных фактов и выполнения простых запросов к ней, объединения нескольких фактов вместе *. 1001 *

Но я хочу использовать это в контексте, где я пишу Clojure. И похоже, что core.logi c должен делать то, что я хочу.

Но мне наивно трудно понять, как поместить предикаты basi c Prolog в core.logi c.

Например, как мне представить что-то столь простое, как это в core.logi c:

person(phil).
person(mike).
food(cheese).
food(apple).
likes(phil,apple).
likes(phil,cheese).

И такой запрос, как

food(F),person(P),likes(P,F)

Большинство вводных данных, которые я могу найти, тяжелы в программировании logi c, но не в представлении данных .

1 Ответ

1 голос
/ 22 февраля 2020

Как сказал Гай Кодер, пакет PLDB под core.logi c решает именно такие проблемы:

(db-rel person p)
(db-rel food f)
(db-rel likes p f)

(def facts (db
  [person 'phil]
  [person 'mike]
  [food 'cheese]
  [food 'apple]
  [likes 'phil 'apple]
  [likes 'phil 'cheese]))

(with-db facts (run* [p f] (food f) (person p) (likes p f)))

=> ([phil cheese] [phil apple])    p=phil,f=cheese   or   p=phil,f=apple
...