读取对象的插槽值(其中该对象是变量,并且在defrule中的语法是什么?

问题描述 投票:0回答:1

我一直在仔细阅读文档,找不到解决方案,因此,如果我在某个地方错过了此内容,请原谅我。这是我的问题:我有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))

除了可能的以外,如果您可以分享哪种方法是编写此规则的最“简单”自然的方法,那将不胜感激。

clips
1个回答
1
投票

您的第一个规则将起作用,如果您将第三个模式放在第一位,则变量?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> 

0
投票

您的第一个规则将起作用,如果您先放置第三个模式,则在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> 
© www.soinside.com 2019 - 2024. All rights reserved.