Rdf 在剪辑中是否可能有多个类的实例?

Rdf 在剪辑中是否可能有多个类的实例?,rdf,clips,Rdf,Clips,我有一个来自OWL本体的类结构,我希望将其转换为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 我知道这是不可能的(见下一个例子) 是否

我有一个来自OWL本体的类结构,我希望将其转换为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
我知道这是不可能的(见下一个例子)

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


希望这是清楚的。欢迎提供任何帮助/建议。

在OOP中,有两种方法可以“组合”对象:多重继承或组合。在第一种情况下,使用继承自
a
B
的类
C
。在后者中,您创建一个通用对象
C
,其中包含从
a
B
生成的对象的引用

对于多重继承,您可以查看的章节
9.3.1多重继承
,了解如何在片段中实现它

实际上,您需要在
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)))

对象的
类型始终由其类推断。如果没有类定义,则无法创建对象

不,我特别不希望A类和B类相互关联。我想说fact1是一个A和一个B对象,但如果可能的话,不必做C。虽然从外观上看,当你创建一个实例时,它只针对一个特定的类?相应地修改了答案。当你创建一个实例时,它必须针对一个特定的类。
(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)))