Подтвердить что ты не робот

Выражая, что определенное подмножество X имеет свойство Y в core.logic

Я хочу:

  • Опишите факт о подмножестве класса объектов.
  • Объявить, что объект имеет свойство, состоящее из других свойств.

В качестве примера возьмем следующее:

Red robotic birds are only composed of buttons, cheese, and wire.

Я хочу сказать, что класс птиц, птиц, красных и роботизированных, обладает свойством. Это свойство состоит в том, что они состоят только из кнопок, сыра и проволоки. Нет никаких ограничений на тип проволочного сыра или кнопок. Также в результате должно быть понятно, что нет красных роботизированных птиц, которые состоят из бумаги. Кроме того, эти птицы могут состоять из подмножества кнопок, сыра и проволоки.

В clojure/core.logic.prelude существуют отношения и факты с использованием defrel и fact. Однако я не могу придумать комбинацию, чтобы объяснить этот факт.

4b9b3361

Ответ 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). может вернуть цвет как зеленый. Тем не менее, нет зеленой клубники, поэтому пролог будет отступать и спрашивать, какие другие цвета делают яблоки. Следующий ответ может быть красным, на котором будет выполняться второе утверждение цвета, и все правило будет истинным.