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

Is it possible to have an instance of multiple classes in CLIPS?

我有一个来自 OWL ontology 的 class 结构,我希望将其转换为 CLIPS 知识以执行 closed-world 推理。我现有的 class 层次结构具有多个 class 类型的实例。例如,我想在 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.

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

希望这很清楚。任何 help/advice 表示赞赏。

在 OOP 中,您有两种方法 "combine" 对象:多重继承或组合。首先,您使用继承自 AB 的 class C。在后者中,您创建了一个通用对象 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 class 中存储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 总是由它的 class 推断出来的。没有 class 定义就无法创建对象。