удаление многослотовой переменной в JESS

У меня есть deftemplate, который содержит мультислот в JESS, и я хочу удалить переменную в мультилоте, если правило запущено. Например:

(deftemplate Person (slot name)
                    (multislot friends))
(assert (Person (name John)(friends Jimmy Joe Jessica)))

Теперь я хочу удалить Джимми из списка друзей.

Большое спасибо Али


person Alireza Khamesipour    schedule 28.10.2014    source источник


Ответы (1)


Я исправил некоторые упущения в вашем вопросе, предполагая, что имя шаблона Person.

Это правило исключает Джимми из всех friends всех лиц.

(defrule KillJimmy
    ?p <- (Person (friends $?a Jimmy $?b))
=>
    (modify ?p (friends (create$ $?a $?b)))
)
person laune    schedule 28.10.2014
comment
Эй, большое спасибо, Laune, но если я захочу удалить более одного из друзей, мне написать отдельное правило для каждого? - person Alireza Khamesipour; 06.11.2014
comment
Это зависит от того, как вы хотите/должны указать имена, что зависит от того, как и когда (время компиляции, время выполнения) они известны или введены и т. д. - person laune; 06.11.2014
comment
Могу ли я добавить возраст каждого друга в этом deftemplate? например иметь (Человека (друзей (джимми 33)))??? Есть ли в этом смысл? - person Alireza Khamesipour; 02.12.2014
comment
Возраст человека должен храниться вместе с объектом Person. Если требуется возраст друга, вы можете найти его, просмотрев факт о человеке этого друга и получить из него возраст. - person laune; 02.12.2014
comment
Можно ли сохранить возраст каждого друга, используя список сумок? в случае, если мы просто хотим возраст друзей? что-то вроде ?*Bag*= (bag create Person) (набор сумок ?*Bag* Fred 22) и сделать это для всех друзей? Спасибо большое - person Alireza Khamesipour; 03.12.2014