CLIPS中是否可以有多个类的实例?

时间:2019-10-02 21:59:29

标签: rdf clips

我有一个来自OWL本体的类结构,我希望将其转换为CLIPS知识以执行封闭世界推理。我现有的类层次结构的实例是多个类的类型。例如,我想在CLIPS中执行以下操作:

CLIPS> (defclass A (is-a USER))
CLIPS> (defclass B (is-a USER))
CLIPS> (bind ?x (make-instance fact1 of A B))
[fact1]
CLIPS> (type ?x)
A B

我知道这是不可能的(请参见下一个示例)。

CLIPS> (make-instance fact1 of A B)

[PRNTUTIL2] Syntax Error:  Check appropriate syntax for slot-override.

是否可以使一个实例具有多种类型,其中一种类型与另一种类型无关(即不是其他类型的父或子类型)。如果没有,任何建议将不胜感激。我猜这是不可能的,可以用父类型为A和类型B的新defclass来完成。如果采用这种方式,将制定一条规则,自动创建一个将它们都作为父类型的匿名类型。被认为是好的风格?还是应该从根本上改变类结构?

希望如此。任何帮助/建议,表示赞赏。

1 个答案:

答案 0 :(得分:1)

在OOP中,有两种“组合”对象的方式:多重继承或合成。首先,您使用类C,该类继承自AB。在后者中,您将创建一个通用对象C,其中包含从AB生成的对象的引用。

对于多重继承,您可以查看Basic Programming Guide9.3.1 Multiple Inheritance章,以了解如何在CLIPS中实现它。

实际上,您需要在defclass构造中指定多种类型。

(defclass A (is-a USER)) 
(defclass B (is-a USER))
(defclass C (is-a A B))

(make-instance c of C)

对于合成,您可以在C类中存储AB的实例地址或它们的名称。换句话说,您将实例作为其他两个实例组成的结果。

(defclass A (is-a USER))                                                                                                                                                                                    
(defclass B (is-a USER))                                                                                                                                                                                    
(defclass C (is-a USER) 
  (slot a) 
  (slot b))     

(make-instance c of C 
  (a (make-instance a of A)) 
  (b (make-instance b of B)))

对象的type始终由其类推断。没有类定义,就无法创建对象。