Могу ли я получить информацию о факте, если у меня есть индекс факта? - PullRequest
0 голосов
/ 24 мая 2018

Я новичок в этом, так что это может звучать глупо, но здесь мы идем.

(deftemplate player
    (slot nume)
    (slot pozitie)
    (slot goluri)
)

(deftemplate team
    (slot nume)
    (multislot players)
    (slot plasamet)
    (slot goluri (default 0))
)
(defrule goluriEchipa
    ?id <- (echipa (nume ?n) (players $?x ?y $?z)(goluri ?ge))
    (player (nume ?y) (goluri ?gj))
    =>
    (modify ?id (goluri (+ ?gj ?ge)))
)

Я знаю, почему он застрял в цикле, потому что сумма в "goluri" всегда меняется.Так что, если я удаляю это так,

(defrule goluriEchipa
    ?id <- (echipa (nume ?n) (jucatori $?x ?y $?z))
    (jucator (nume ?y) (goluri ?gj))
    =>
    (modify ?id (goluri (+ ?gj ?ge)))
)

цикл останавливается, но мне все равно нужно значение из него.У меня есть индекс факта, могу ли я получить значения?Я видел несколько примеров того, как ?id:goluri работает для циклов, но здесь это не работает.

Редактировать: я забыл упомянуть, моя цель - добавить сумму всех целей игрока в цели команды.

1 Ответ

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

Функция, которую вы ищете - это значение фактического слота, но вы все равно получите циклическое поведение, потому что шаблоны фактов могут быть повторно запущены путем изменения слотов, даже если слот отсутствует в шаблоне.

(defrule goluriEchipa
    ?id <- (echipa (nume ?n) (players $?x ?y $?z))
    (jucator (nume ?y) (goluri ?gj))
    =>
    (bind ?ge (fact-slot-value ?id goluri))
    (modify ?id (goluri (+ ?gj ?ge))))

Вместо этого вы можете использовать функции запроса фактов:

         CLIPS (6.31 2/3/18)
CLIPS> 
(deftemplate jucator
   (slot nume)
   (slot pozitie)
   (slot goluri))
CLIPS> 
(deftemplate echipa
   (slot nume)
   (multislot players)
   (slot plasamet)
   (slot goluri (default 0)))
CLIPS>    
(deffacts start
   (echipa (nume 1) (players Fred Bill Greg))
   (jucator (nume Fred) (goluri 2))
   (jucator (nume Bill) (goluri 1))
   (jucator (nume Greg) (goluri 3))
   (echipa (nume 2) (players Sam John Ralph))
   (jucator (nume Sam) (goluri 2))
   (jucator (nume John) (goluri 4))
   (jucator (nume Ralph) (goluri 5)))
CLIPS>    
(defrule goluriEchipa
    =>
    (delayed-do-for-all-facts ((?id echipa)) TRUE
       (bind ?sum 0)
       (foreach ?p ?id:players
          (bind ?sum (+ ?sum (do-for-fact ((?j jucator)) (eq ?j:nume ?p) ?j:goluri))))
       (modify ?id (goluri ?sum))))
CLIPS> (reset)
CLIPS> (run)
CLIPS> (facts)
f-0     (initial-fact)
f-2     (jucator (nume Fred) (pozitie nil) (goluri 2))
f-3     (jucator (nume Bill) (pozitie nil) (goluri 1))
f-4     (jucator (nume Greg) (pozitie nil) (goluri 3))
f-6     (jucator (nume Sam) (pozitie nil) (goluri 2))
f-7     (jucator (nume John) (pozitie nil) (goluri 4))
f-8     (jucator (nume Ralph) (pozitie nil) (goluri 5))
f-9     (echipa (nume 1) (players Fred Bill Greg) (plasamet nil) (goluri 6))
f-10    (echipa (nume 2) (players Sam John Ralph) (plasamet nil) (goluri 11))
For a total of 9 facts.
CLIPS> 
...