SWRL: Как использовать встроенный swrlb:booleanNot?

Я использую Protege 3.4.8. Скажем, у меня есть несколько экземпляров со свойством типа данных colors и свойство объекта hasMeaning, Значение colors представлены строкой, например red blue yellow,

Я хотел бы создать такое правило: если цвета содержат red но нет blueтогда это имеет значение Happy, Мое текущее правило написано как ниже:

colors(?x, ?y)
∧ swrlb:contains(?y, "red")
∧ swrlb:booleanNot(true, swrlb:contains(?y,"blue"))
→ hasMeaning(?x, Happy)

Но я получил Error: Expecting ',' or ')', got '('.

Я следовал грамматике, приведенной здесь.

Есть идеи, что здесь не так? Большое спасибо!

1 ответ

Решение

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

atom ::= description '(' i-object ')'
     | dataRange '(' d-object ')'
     | individualvaluedPropertyID '(' i-object i-object ')'
     | datavaluedPropertyID '(' i-object d-object ')' 
     | sameAs '(' i-object i-object ')' 
     | differentFrom '(' i-object i-object ')'
     | builtIn '(' builtinID { d-object } ')'
builtinID ::= URIreference

Синтаксис для builtIn атом занимает список d-objects в качестве аргументов. Производство для d-object является:

d-object ::= d-variable | dataLiteral

Атом booleanNot( true, contains( ?string, "red" )) искажен, потому что contains( ?string, "red" ) это не d-object, но атом.

Другие вопросы по тегам