CLIPS/clipspy Порядок правил

Итак, я пытаюсь самостоятельно изучить CLIPS и clipspy для задания класса, и я немного застрял. Приведенный ниже код компилируется и работает нормально, но результат немного странный. Я пытаюсь расширить примеры, которые я нашел в руководстве.

import clips
import logging

env = clips.Environment()

logging.basicConfig(level=10, format='%(message)s')
router = clips.LoggingRouter()
router.add_to_environment(env)

env.build("""
(defrule whodunit
  (shoot ?hunter ?who)
  =>
  (printout t ?hunter " shot " ?who crlf)
)""")

env.build("""
(defrule animalGame
  (animal ?ani)
  (shoot $? ?ani)
  =>
  (assert (game ?ani))
)""")

env.build("""
(defrule gameAnimal
  (game ?ani)
  =>
  (assert (animal ?ani))
)""")

env.build("""
(defrule isIllegal
  (shoot ?a ?b)
  (not(game ?b))
  =>
  (assert (criminal ?a))
)""")

env.assert_string("(animal duck)")
env.assert_string("(animal dog)")
env.assert_string("(shoot Brian duck)")
env.assert_string("(shoot Bob rhino)")
env.assert_string("(game deer)")

env.run()

for fact in env.facts():
    print(fact)

Это выводит:

(initial-fact)
(animal duck)
(animal dog)
(shoot Brian duck)
(shoot Bob rhino)
(game deer)
(animal deer)
(criminal Bob)
(criminal Brian)
(game duck)

Похоже, что Брайан назван преступником за стрельбу в животное, не являющееся дичью, несмотря на то, что животное, в которое он стреляет, объявлено дичью на следующем этапе. Есть ли способ переоценить правила, чтобы исправить это противоречие?

1 ответ

Я понял. Ответ - заметность. Я также понял, что есть некоторые логические ошибки / несоответствия, в которых все животные, на которых охотятся, объявляются дичью, а стреляющие животные, которые не являются дичью, считаются преступниками. В любом случае:

env.build("""
(defrule animalGame
  (declare (salience 100))
  (animal ?ani)
  (shoot $? ?ani)
  =>
  (assert (game ?ani))
)""")
Другие вопросы по тегам