Я смотрю, как я могу разделить факты, вставленные в разные скобки в CLIPS?

#clips

#клипы

Вопрос:

Итак, вот мой код CLIPS

 CLIPS> (deftemplate animal
(slot name)
(slot favourite-food)
(slot habitat)
(slot main-prey)
(multislot predators)
(slot distinctive-features))
CLIPS> (deffacts animal
(animal (name Sumatran-Elephant)
(favourite-food grass)
(habitat "Rainforest and tropical woodland")
(main-prey "grass, fruit, roots")
(predators Human Tiger)
(distinctive-features "Long trunk and large feet"))

(animal (name Monkey)
(favourite-food fruit)
(habitat "Tropical forests, grasslands and mountainous plains")
(main-prey "Fruit, Seeds, Insects")
(predators Birds Snakes Wildcats)
(distinctive-features "Long, agile tail and loud vocal calls"))

(animal (name Magpie)
(favourite-food fruit)
(habitat "Open woodland, grasslands and savannas")
(main-prey "Fruit, Nuts, Seeds, Insects")
(predators Foxes Cats Coyote)
(distinctive-features "Black and white markings and long wedge-shaped tail")))
CLIPS> (deftemplate find-predators(slot predators))
CLIPS> (defrule find-predators
(find-predators(predators ?predator_name))
(animal(name ?name)
(predators $?other1 ?predator_name $?other2))
=> (printout t ?predator_name " is the predator of " ?name crlf 
"Other predators are " ?other1 ?other2 crlf))
CLIPS> (reset)
CLIPS> (assert(find-predators(predators Human)))
<Fact-4>
CLIPS> (run)
Human is the predator of Sumatran-Elephant
Other predators are ()(Tiger)
CLIPS> (assert(find-predators(predators Coyote)))
<Fact-5>
CLIPS> (run)
Coyote is the predator of Magpie
Other predators are (Foxes Cats)()
 

Но ответ должен быть таким

Койот — хищник сороки, другие хищники (лисы) (Кошки)

Как мне разделить факты для нескольких слотов выше?

Нужна помощь, если кто-нибудь знает лучшее значение по умолчанию, которое можно заменить из приведенного выше кода

Ответ №1:

Объедините многополевые значения в переменных $?other и $?other2 в одно многополевое значение, а затем используйте функцию implode $ для преобразования этого значения в строку с пробелами между именами predator .

 (defrule find-predators
   (find-predators (predators ?predator_name))
   (animal (name ?name)
           (predators $?other1 ?predator_name $?other2))
   => 
   (printout t ?predator_name " is the predator of " ?name crlf 
               "Other predators are " (implode$ (create$ ?other1 ?other2)) crlf))