我一直在仔细阅读文档,找不到解决方案,因此,如果我在某个地方错过了此内容,请原谅我。这是我的问题:我有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))
除了可能的以外,如果您可以分享哪种方法是编写此规则的最“简单”自然的方法,那将不胜感激。
您的第一个规则将起作用,如果您将第三个模式放在第一位,则变量?port1在被hasPort插槽引用之前已绑定到实例地址。
CLIPS (6.31 6/12/19)
CLIPS>
(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))
CLIPS>
(defclass PORT (is-a USER)
(role concrete)
(slot connectedTo (type INSTANCE))
(multislot secondary-types))
CLIPS>
(defrule rule0
?port1 <- (object (is-a PORT) (connectedTo ?port2))
?part1 <- (object (is-a PART) (hasPort ?port1))
?part2 <- (object (is-a PART) (hasPort ?port2))
=>
(printout t "Found connected parts "
(instance-name ?part1) " "
(instance-name ?part2) " by ports "
(instance-name ?port1) " "
(instance-name ?port2)
crlf))
CLIPS> (make-instance port2 of PORT)
[port2]
CLIPS> (make-instance port1 of PORT (connectedTo (instance-address [port2])))
[port1]
CLIPS> (make-instance part1 of PART (hasPort (instance-address [port1])))
[part1]
CLIPS> (make-instance part2 of PART (hasPort (instance-address [port2])))
[part2]
CLIPS> (run)
Found connected parts [part1] [part2] by ports [port1] [port2]
CLIPS>
您可以将实例名称与每个实例的预定义name插槽一起使用,而不是使用实例地址作为插槽值。
CLIPS> (clear)
CLIPS>
(defclass PART (is-a USER)
(role concrete)
(slot affectsProperty (type INSTANCE-NAME))
(slot directlyConnected (type INSTANCE-NAME))
(slot hasPort (type INSTANCE-NAME))
(slot hasSensor (type INSTANCE-NAME))
(slot hasIssue (type INSTANCE-NAME))
(multislot secondary-types))
CLIPS>
(defclass PORT (is-a USER)
(role concrete)
(slot connectedTo (type INSTANCE-NAME))
(multislot secondary-types))
CLIPS>
(defrule rule0
(object (is-a PART) (name ?part1) (hasPort ?port1))
(object (is-a PART) (name ?part2) (hasPort ?port2))
(object (is-a PORT) (name ?port1) (connectedTo ?port2))
=>
(printout t "Found connected parts " ?part1 " " ?part2
" by ports " ?port1 " " ?port2 crlf))
CLIPS> (make-instance port1 of PORT (connectedTo [port2]))
[port1]
CLIPS> (make-instance port2 of PORT)
[port2]
CLIPS> (make-instance part1 of PART (hasPort [port1]))
[part1]
CLIPS> (make-instance part2 of PART (hasPort [port2]))
[part2]
CLIPS> (run)
Found connected parts [part1] [part2] by ports [port1] [port2]
CLIPS>
您的第一个规则将起作用,如果您先放置第三个模式,则在hasPort槽引用变量?port1之前将其绑定到实例地址。
CLIPS (6.31 6/12/19)
CLIPS>
(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))
CLIPS>
(defclass PORT (is-a USER)
(role concrete)
(slot connectedTo (type INSTANCE))
(multislot secondary-types))
CLIPS>
(defrule rule0
?port1 <- (object (is-a PORT) (connectedTo ?port2))
?part1 <- (object (is-a PART) (hasPort ?port1))
?part2 <- (object (is-a PART) (hasPort ?port2))
=>
(printout t "Found connected parts "
(instance-name ?part1) " "
(instance-name ?part2) " by ports "
(instance-name ?port1) " "
(instance-name ?port2)
crlf))
CLIPS> (make-instance port2 of PORT)
[port2]
CLIPS> (make-instance port1 of PORT (connectedTo (instance-address [port2])))
[port1]
CLIPS> (make-instance part1 of PART (hasPort (instance-address [port1])))
[part1]
CLIPS> (make-instance part2 of PART (hasPort (instance-address [port2])))
[part2]
CLIPS> (run)
Found connected parts [part1] [part2] by ports [port1] [port2]
CLIPS>
您可以将实例名称与每个实例的预定义name插槽一起使用,而不是使用实例地址作为插槽值。
CLIPS> (clear)
CLIPS>
(defclass PART (is-a USER)
(role concrete)
(slot affectsProperty (type INSTANCE-NAME))
(slot directlyConnected (type INSTANCE-NAME))
(slot hasPort (type INSTANCE-NAME))
(slot hasSensor (type INSTANCE-NAME))
(slot hasIssue (type INSTANCE-NAME))
(multislot secondary-types))
CLIPS>
(defclass PORT (is-a USER)
(role concrete)
(slot connectedTo (type INSTANCE-NAME))
(multislot secondary-types))
CLIPS>
(defrule rule0
(object (is-a PART) (name ?part1) (hasPort ?port1))
(object (is-a PART) (name ?part2) (hasPort ?port2))
(object (is-a PORT) (name ?port1) (connectedTo ?port2))
=>
(printout t "Found connected parts " ?part1 " " ?part2
" by ports " ?port1 " " ?port2 crlf))
CLIPS> (make-instance port1 of PORT (connectedTo [port2]))
[port1]
CLIPS> (make-instance port2 of PORT)
[port2]
CLIPS> (make-instance part1 of PART (hasPort [port1]))
[part1]
CLIPS> (make-instance part2 of PART (hasPort [port2]))
[part2]
CLIPS> (run)
Found connected parts [part1] [part2] by ports [port1] [port2]
CLIPS>