Я копался в документации и не мог найти решение, поэтому прости меня, если я где-то пропустил это. Вот моя проблема: у меня есть два экземпляра класса PART, part1 и part2, а класс PART имеет слот с именем hasPort. Я хочу правило, которое совпадает на две части, если порты подключены. Каждый порт является экземпляром класса PORT, в котором есть слот с именем «connectedTo», который используется для хранения подключаемого экземпляра PORT.
Сначала мои объекты класса:
(defclass PART (is-a USER)
(role concrete)
(slot affectsProperty (type INSTANCE))
(slot directlyConnected (type INSTANCE))
(slot hasPort (type INSTANCE))
(slot hasSensor (type INSTANCE))
(slot hasIssue (type INSTANCE))
(multislot secondary-types))
(defclass PORT (is-a USER)
(role concrete)
(slot connectedTo (type INSTANCE))
(multislot secondary-types))
Я пыталсяправила вроде следующего:
(defrule rule0
?part1 <- (object (is-a PART) (hasPort ?port1))
?part2 <- (object (is-a PART) (hasPort ?port2))
?port1 <- (object (is-a PORT) (connectedTo ?port2))
=>
;(assert (directlyConnected ?part1 ?part2))
(printout t "Found connected parts "
(instance-name ?part1) " "
(instance-name ?part2) " by ports "
(instance-name ?port1) " "
(instance-name ?port2)
crlf))
Я также пробовал что-то вроде следующего:
(defrule rule0
?part1 <- (object (is-a PART) (hasPort ?port1))
?part2 <- (object (is-a PART) (hasPort ?port2))
?port2 <- (send ?port1 get-connectedTo)
=>
;(assert (directlyConnected ?part1 ?part2))
(printout t "Found connected parts "
(instance-name ?part1) " "
(instance-name ?part2) " by ports "
(instance-name ?port1) " "
(instance-name ?port2)
crlf))
и даже что-то вроде следующего:
(defrule rule0
?part1 <- (object (is-a PART) (hasPort ?port1))
?part2 <- (object (is-a PART) (hasPort ?port2))
?port3 <- (send ?port1 get-connectedTo)
(test (eq ?port3 ?port2))
=>
;(assert (directlyConnected ?part1 ?part2))
(printout t "Found connected parts "
(instance-name ?part1) " "
(instance-name ?part2) " by ports "
(instance-name ?port1) " "
(instance-name ?port2)
crlf))
Кроме того, что являетсявозможно, если вы расскажете, какой подход является наиболее «естественным» способом написания этого правила, это было бы очень полезно.