Тема: Грамотное использование SWRL правил (при помощи библиотеки Jess)

Добрый вечер, уважаемые знатоки форума!

Я разрабатываю онтологию определения геометрических фигур, в данном примере только треугольников. Использую SWRL правила и библиотеку Jess.

Написал SWRL правила и столкнулся со следующей проблемой:

Правило для определения просто треугольника (пока даже без чёта углов):

Triangle(?t)  ∧ Point(?p1)  ∧ Point(?p2)  ∧ Point(?p3)  ∧ Line(?l1)  ∧ Line(?l2)  ∧Line(?l3)  ∧ begin_point(?l1, ?p1)  ∧ end_point(?l1, ?p2)  ∧ begin_point(?l2, ?p2)  ∧ end_point(?l2, ?p3)  ∧ begin_point(?l3, ?p3)  ∧ end_point(?l3, ?p1)  → vertex(?t, ?p1)  ∧vertex(?t, ?p2)  ∧vertex(?t, ?p3)  ∧side(?t, ?l1)  ∧side(?t, ?l2)  ∧side(?t, ?l3)  ∧angle(?t, ?a1)  ∧angle(?t, ?a2)  ∧angle(?t, ?a3)

После этого экземпляру класса Triangle присваиваются вершины и стороны. Дальше мне нужно определить равносторонний треугольник, для этого пишу следующее правило:

Triangle(?et)  ∧ side(?et, ?l1)  ∧ side(?et, ?l2)  ∧ side(?et, ?l3)  ∧ length(?l1, ?len1)  ∧length(?l2, ?len2)  ∧ length(?l3, ?len3)  ∧ swrlb:equal(?len1, ?len2)  ∧ swrlb:equal(?len2, ?len3)   → Equilateral_triangle(?et)

После его работы, тот экземпляр, что был в классе Triangle  с определившимися сторонами и вершинами, должен добавиться в класс Equilateral_triangle. Он добавляется, но почему то игнорирует проверку длины сторон. Тоесть добавляет любой треугольник (определившийся на предыдущем этапе) вне зависимости от длинн его сторон.

Вопрос вот в чём: как правильно использовать знания, полученные из первого правила, во втором?

Проект создаю в Protege 3.4.1, так как если использовать более поздние версии, при работе правил Протеже намертво виснет или считает очень долго (несколько часов).

Заранее благодарен за ответы!

Отредактировано WinterLord1 (2012-05-20 23:05:33)

Thumbs up Thumbs down

2

Re: Грамотное использование SWRL правил (при помощи библиотеки Jess)

WinterLord1 пишет:

Правило для определения просто треугольника (пока даже без чёта углов):

Triangle(?t)  ∧ Point(?p1)  ∧ Point(?p2)  ∧ Point(?p3)  ∧ Line(?l1)  ∧ Line(?l2)  ∧Line(?l3)  ∧ begin_point(?l1, ?p1)  ∧ end_point(?l1, ?p2)  ∧ begin_point(?l2, ?p2)  ∧ end_point(?l2, ?p3)  ∧ begin_point(?l3, ?p3)  ∧ end_point(?l3, ?p1)  → vertex(?t, ?p1)  ∧vertex(?t, ?p2)  ∧vertex(?t, ?p3)  ∧side(?t, ?l1)  ∧side(?t, ?l2)  ∧side(?t, ?l3)  ∧angle(?t, ?a1)  ∧angle(?t, ?a2)  ∧angle(?t, ?a3)

По-моему в SWRL консеквент (голова) должен состоять из одного атома. Может поэтому Protege вешается.

А все отношения из консеквента (→ vertex(?t, ?p1)  ∧vertex(?t, ?p2)  ∧vertex(?t, ?p3)  ∧side(?t, ?l1)  ∧side(?t, ?l2)  ∧side(?t, ?l3)  ∧angle(?t, ?a1)  ∧angle(?t, ?a2)  ∧angle(?t, ?a3)) выводяться?