我有一个来自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来完成。如果采用这种方式,将制定一条规则,自动创建一个将它们都作为父类型的匿名类型。被认为是好的风格?还是应该从根本上改变类结构?
希望如此。任何帮助/建议,表示赞赏。
答案 0 :(得分:1)
在OOP中,有两种“组合”对象的方式:多重继承或合成。首先,您使用类C
,该类继承自A
和B
。在后者中,您将创建一个通用对象C
,其中包含从A
和B
生成的对象的引用。
对于多重继承,您可以查看Basic Programming Guide的9.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
类中存储A
和B
的实例地址或它们的名称。换句话说,您将实例作为其他两个实例组成的结果。
(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
始终由其类推断。没有类定义,就无法创建对象。