Получите доступ к слоту из мультиполя
У меня есть эта функция, которая вычисляет некоторое значение, основанное на нескольких слотах нескольких фактов мультиполя.
Потому что задействовано довольно много слотов, и все они нужны в функции, о которой я думал, если бы я мог передать весь факт функции и получить доступ к ее слотам в ней, например, так:
(deftemplate a-fact
(slot id)
(slot name)
(slot ...)
...
)
(deffunction a-funciton (?factadr)
(switch ?factadr:name
(case bla then ...)
)
(return ?calculated-value)
)
(defrule a-rule
?factadr <- (a-fact (id ?i))
=>
(if (> **(a-function ?factadr) 20) then ... )
)
Я видел это ? Fact-adrres: slot-name в этом примере и думал, что это будет работать, но это не так. Итак, возможно ли это и как это сделать?
(bind ?facts (find-all-facts ((?f attribute))
(and (eq ?f:name wine)
(>= ?f:certainty 20))))
Клипы 6.3 используется.
1 ответ
Решение
Используйте функцию факт-слот-значение.
CLIPS>
(deftemplate a-fact
(slot id)
(slot name))
CLIPS>
(defrule a-rule
?f <- (a-fact)
=>
(printout t (fact-slot-value ?f id) " " (fact-slot-value ?f name) crlf))
CLIPS> (assert (a-fact (id 3) (name x)))
<Fact-1>
CLIPS> (assert (a-fact (id 7) (name y)))
<Fact-2>
CLIPS> (run)
7 y
3 x
CLIPS>