Не совсем уверен, что это то, что вам нужно, но вы можете легко выразить, что у класса есть набор свойств, создав структуру фактов графа (см. Список фактов свойств ниже и правило для нахождения свойств внутриset).
Затем, чтобы выразить композицию этого набора свойств, вам понадобится еще один набор фактов композиции и правило, которое обнаруживает любые подсвойства класса и, в результате, вещи, из которых он может состоять.
Я также привел приведенный ниже пример кода, чтобы помочь объяснить.
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): - color (Color, FruitA), color (Color, FruitB).
Если мы выполним запрос share_same_colour(apple, strawberry).
, тогдаcolour(Colour, apple).
может вернуть цвет как зеленый.Тем не менее, нет зеленой клубники, поэтому пролог вернется и спросит, какие еще цвета имеют яблоки. Следующий ответ может быть красным, после чего второе утверждение цвета будет успешным, и все правило будет верным.