Можно ли иметь экземпляр нескольких классов в CLIPS? - PullRequest
1 голос
/ 03 октября 2019

У меня есть структура класса из онтологии 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.

Можно ли заставить экземпляр иметь несколько типов, когда один тип не связан с другим типом (т.е. не является родительским или дочерним типом других типов). Если нет, то любой совет будет оценен. Я предполагаю, что если это невозможно, это может быть сделано с новым defclass, у которого есть родители типа A и типа B. Если выбрать этот маршрут, создаст ли правило, которое автоматически создает анонимный тип, у которого оба они являются родителямисчитаться хорошим стилем? Или я просто должен фундаментально изменить структуру классов?

Надеюсь, это было ясно. Любая помощь / совет приветствуется.

1 Ответ

1 голос
/ 03 октября 2019

В ООП у вас есть два способа «объединить» объекты: множественное наследование или композиция. В первом случае вы используете класс C, который наследуется от A и B. В последнем случае вы создаете универсальный объект C, который содержит ссылки на объекты, сгенерированные из A и B.

. Для множественного наследования вы можете проверить главу 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 объекта всегда определяется его классом. Вы не можете создавать объекты без определения класса.

...