Джесс в Protege: проблема с несколькими слотами

95
12

На основе примерного правила AssertingHasSiblingMulti1 для установки с несколькими слотами, заданного в AddingRuleWithJessTab, я создал следующее правило Jess для установки значений нескольких слотов в моем свойстве foundPollutionSources:

(defrule findPHPolluters
(declare (salience 553))
(object
(is-a http..#PollutionSources)
(OBJECT ?sitepoll)
(http..potentialPollutant
$? ?b&:(eq (instance-name ?b)(instance-name http..#pH)) $?)
(http..#pollutionSourceName ?psName)
(http..#pollutionType ?psType)
)
(object
(is-a http..#MeasurementSite)
(OBJECT ?loc)
(http..#hasSourcesOfPollution $?sitepoll_list)
)
(object
(is-a http..#ModeratePHMeasurement)
(OBJECT ?mob)
(http..#observationResultLocation ?loc)
(http..#foundPollutionSources $?existing_poll_list)
)
=>
(if (not (member$ ?sitepoll $?sitepoll_list)) then
(printout t "pH pollution source: " ?psName " (Location: " ?psType ")" crlf)
(slot-set ?mob http..#foundPollutionSources (create$ $?existing_poll_list ?sitepoll))
)
)

Но, когда я запускаю это правило, появляется следующее исключение:

Джесс сообщила об ошибке в обычном ValueVector.set при выполнении правила LHS (MTELN) при выполнении правила LHS (TECT). Сообщение: Плохой индекс 117 в вызове set() для этого вектора:...

спросил(а) 2020-04-04T02:44:26+03:00 3 месяца назад
1
Решение
85

Существует отклонение от обычного шаблона использования Джесса переменной, связанной с (частью) значения мультислота. Заметим:

(object 
...
(http..#foundPollutionSources $?existing_poll_list))

Префикс '$' приводит к тому, что все значения в слове foundPollutionSources привязаны к ?existing_poll_list Existing_poll_list. Обычное использование (см. Руководство Jess и связанный пример) было бы, например:

(printout t "pollution sources " ?existing_poll_list crlf))

Но ваш код RHS имеет

 (create$ $?existing_poll_list ...)

Обратите внимание на ложный "$" - я бы опустил его и повторил попытку.

Я не знаю, что может сделать этот протеже и/или Джесс, и у меня нет времени исследовать его в последнем.

ответил(а) 2020-04-04T03:00:18.076542+03:00 3 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема