Выражая, что определенное подмножество X имеет свойство Y в core.logic
Я хочу:
- Опишите факт о подмножестве класса объектов.
- Объявить, что объект имеет свойство, состоящее из других свойств.
В качестве примера возьмем следующее:
Red robotic birds are only composed of buttons, cheese, and wire.
Я хочу сказать, что класс птиц, птиц, красных и роботизированных, обладает свойством.
Это свойство состоит в том, что они состоят только из кнопок, сыра и проволоки. Нет никаких ограничений на тип проволочного сыра или кнопок. Также в результате должно быть понятно, что нет красных роботизированных птиц, которые состоят из бумаги. Кроме того, эти птицы могут состоять из подмножества кнопок, сыра и проволоки.
В clojure/core.logic.prelude существуют отношения и факты с использованием defrel
и fact
.
Однако я не могу придумать комбинацию, чтобы объяснить этот факт.
Ответы
Ответ 1
В Прологе нет различия между фактами и целями, как есть в miniKanren. Я мог бы обратиться к этому в будущем.
Кстати, я не уверен, что это полностью отвечает на ваш вопрос - было бы полезно узнать, какие типы запросов вы хотите запустить.
Это проверенный код (для Clojure 1.3.0-beta1), так как я использую трюк ^: index, этот код будет работать нормально в 1.2.0, если вы поменяете его на ^ {: index true}:
(ns clojure.core.logic.so
(:refer-clojure :exclude [==])
(:use [clojure.core.logic]))
(defrel property* ^:index p ^:index t)
(fact property* :bird :red-robotic-bird)
(fact property* :red :red-robotic-bird)
(fact property* :robotic :red-robotic-bird)
(fact property* :tasty :cake)
(fact property* :red-robotic-bird :macaw)
(defn property [p t]
(conde
[(property* p t)]
[(fresh [ps]
(property* ps t)
(property p ps))]))
(defrel composition* ^:index m ^:index t)
(fact composition* :buttons :red-robotic-bird)
(fact composition* :cheese :red-robotic-bird)
(fact composition* :wire :red-robotic-bird)
(fact composition* :flour :cake)
(defn composition [m t]
(fresh [p]
(composition* m p)
(conde
[(== p t)]
[(property p t)])))
Пробуем.
(comment
;; what is a macaw composed of?
(run* [q] (composition q :macaw))
;; (:wire :cheese :buttons)
;; what things include buttons in their composition?
(run* [q] (composition :buttons q))
;; (:red-robotic-bird :macaw)
;; does a macaw include flour in its composition?
(run* [q] (composition :flour :macaw))
;; ()
;; is a macaw a bird?
(run* [q] (property :bird :macaw))
;; (_.0)
;; is a cake a bird?
(run* [q] (property :bird :cake))
;; ()
;; what are the properties of a macaw?
(run* [q] (property q :macaw))
;; (:red-robotic-bird :robotic :bird :red)
)
Ответ 2
Не совсем уверен, что это то, что вам нужно, но вы можете легко выразить, что класс имеет набор свойств, создавая структуру фактов фактов (см. список приведенных ниже фактов свойств и правило для нахождения свойств внутри установлен).
Затем, чтобы выразить композицию этого набора свойств, вам нужен еще один набор фактов и правил композиции, которые обнаруживают любые под-свойства класса и, как результат, вещи, из которых он может состоять.
Я привел пример кода ниже, чтобы помочь объяснить.
property(bird, red_robotic_bird).
property(red, red_robotic_bird).
property(robot, red_robotic_bird).
property(tasty, cake).
property(red_robotic_bird, macaw).
property(Property, Thing) :-
property(PropertySet, Thing),
property(Property, PropertySet).
composition(buttons, red_robotic_bird).
composition(cheese, red_robotic_bird).
composition(wire, red_robotic_bird).
composition(flour, cake).
composition(Material, Thing) :-
property(Property, Thing),
composition(Material, Property).
пример запросов
?- composition(Material, macaw).
Material = buttons ;
Material = cheese ;
Material = wire ;
no
?- composition(buttons, Thing).
Thing = red_robotic_bird ;
Thing = macaw ;
no
?- composition(flour, macaw).
no
?- property(bird, macaw).
yes
?- property(bird, cake).
no
property(Property, macaw).
Property = red_robotic_bird ;
Property = bird ;
Property = red ;
Property = robot ;
no
Правила пролога вкратце.
Правила - это, по сути, только факты (например, animal(cat).
), которые обусловлены тем, что другие правила или факты являются истинными. Правило составлено головой и телом (head :- body.
). Тело является логическим доказательством, наиболее часто выражаемым в конъюнктивной нормальной форме (A/\ B/\ C). Оператор и в прологе ,
, оператор или ;
(но его использование не рекомендуется в правилах), а период (.
) обозначает конец правила или факт.
Обратите внимание, что если более позднее правило или факт в теле терпит неудачу, то пролог будет отступать и запрашивать альтернативный ответ из предыдущего правила или факта, а затем повторить попытку. Рассмотрим несколько надуманный пример ниже.
share_same_colour (FruitA, FruitB): - цвет (цвет, фрукты), цвет (цвет, FruitB).
Если мы выполним запрос share_same_colour(apple, strawberry).
, то colour(Colour, apple).
может вернуть цвет как зеленый. Тем не менее, нет зеленой клубники, поэтому пролог будет отступать и спрашивать, какие другие цвета делают яблоки. Следующий ответ может быть красным, на котором будет выполняться второе утверждение цвета, и все правило будет истинным.