CLIPS instance <> и []? Экземпляр сам по себе ЛОЖЬ? - PullRequest
0 голосов
/ 14 мая 2018

У меня есть онтология, в которой я определяю два класса следующим образом:

(defclass A
    (is-a USER)
    (role concrete)
    (single-slot TheB
            (type INSTANCE)
            (allowed-classes B)
            (create-accessor read-write)))
(defclass B
    (is-a USER)
    (role concrete)
    (single-slot Id
        (type STRING)
        (create-accessor read-write)))

Итак, я создаю экземпляр B [b] и другой экземпляр A [a], ссылающийся на [b]. Тогда у меня есть следующее правило:

(defrule myrule
    ?b <- (object (is-a B))
    ?a <- (object (is-a A)
                    (TheB ?y&:(= (str-compare (send ?b get-Id) (send ?y get-Id)) 0)))
    =>
    (printout t ?y " " ?b crlf)
    (printout t (type ?y) " " (type ?b) crlf)
    (printout t (eq ?y ?b) crlf)
    (printout t ?a "->" (send ?a get-TheB) crlf)
)

Когда я бегу, я получаю следующий вывод:

[b] <Instance-b>
B B
FALSE
<Instance-a>->[b]

Может кто-нибудь объяснить мне, в чем разница между одним и другим? Почему у одного "<>", а у другого "[]", но тип одинаковый? Обязательно ли сравнивать идентификаторы? Я не могу получить <> из []?

Большое спасибо за внимание.

1 Ответ

0 голосов
/ 14 мая 2018

Вы можете ссылаться на экземпляры либо по имени (строка), либо по адресу (указатель на экземпляр).Отправка сообщения на адрес экземпляра выполняется немного быстрее, чем отправка сообщения на имя экземпляра, поскольку для преобразования имени в адрес не требуется поиск.Независимо от того, используете ли вы имя или адрес для определения типа допустимого экземпляра, результат будет одинаковым (класс экземпляра).В вашем примере [b] это имя экземпляра иэто адрес экземпляра.В отличие от имен экземпляров, адреса экземпляров не могут быть заданы в текстовом виде (хотя адрес может быть напечатан), поскольку они ссылаются на ячейку памяти.

Вместо того, чтобы определять свой собственный слот идентификатора, чтобы один экземпляр указывал на другой, простоиспользуйте имя экземпляра:

         CLIPS (6.31 2/3/18)
CLIPS> 
(defclass A
    (is-a USER)
    (role concrete)
    (single-slot TheB
            (type INSTANCE)
            (allowed-classes B)
            (create-accessor read-write)))
CLIPS> 
(defclass B
    (is-a USER)
    (role concrete))
CLIPS> 
(defrule myrule
   ?b <- (object (is-a B) (name ?name))
   ?a <- (object (is-a A) (TheB ?name))
   =>
   (printout t ?a " " ?b crlf)
   (printout t ?name crlf)
   (printout t (eq ?b ?name) crlf)
   (printout t (eq ?b (instance-address ?name)) crlf))
CLIPS> (make-instance [b] of B)
[b]
CLIPS> (make-instance [a] of A (TheB [b]))
[a]
CLIPS> (agenda)
0      myrule: [b],[a]
For a total of 1 activation.
CLIPS> (run)
<Instance-a> <Instance-b>
[b]
FALSE
TRUE
CLIPS>
...