(Прежде всего, извините за мой английский :)) Я пытаюсь создать систему пересмотра для своего проекта (простая классификация естественных растений), я не хочу вставлять весь свой код , но только важные части, поэтому я попытаюсь объяснить, что делает система. Я сделал функцию (которую я называю revise-attribute), когда система находит растения, которые должны соответствовать ответам от пользователя, которые спрашивают пользователя, хочет ли он изменить некоторые атрибуты, если он отвечает «да», он может выбрать какие атрибуты хотят изменить, тогда система набирает факт-атрибут атрибутов и убирает их, поэтому начинается с начала и должна переоценивать правила. Например, у меня есть эти два правила:Clips revise system
(defrule month
(not(attribute (name month)))
=>
(bind ?allow (create$ january february march april mamy june july august september october november december))
(bind ?answer (ask-question "what month is it?" ?allow))
(assert (attribute (name month) (value ?answer)))
)
(defrule flowering
(not (attribute (name flowering)))
(attribute (name month) (value ?month))
=>
(assert (attribute (name flowering) (value ?month)))
)
Если, в конце концов, пользователь хочет изменить атрибут месяца, этот последний будет втянут и правило месяц должен быть пересмотрен и обжигает, потому что ISN» t no month, поэтому таким образом он может изменить значение месяца, однако атрибут цветения также должен быть изменен, но это не сделано, есть атрибут с именем colorering, который был подтвержден. Имея это в виду, я создал модуль, который является «фокус» после Пересмотреть-функции:
(defmodule REVISITING (import MAIN ?ALL))
(defrule REVISITING::retract-month
(not (attribute(name month)))
?f <- (attribute(name flowering))
=>
(retract ?f)
)
Так что если месяц убирается, цветение убирается тоже. Однако мне интересно, если есть возможность сделать то же самое в лучшем способе, потому что у меня есть сомнения по следующему правилу
(defrule petal-apex-toothed
(not (attribute (name petal-apex-toothed)))
(attribute (name petal-color) (valore blue | unknown))
(attribute (name habitat) (valore sea | montain | edge_of_the_road |camp | unknow))
(attributo (name flowering) (valore may | june | july | august))
=>
(bind ?allow (create$ yes no unknow))
(bind ?answer (ask-question "The petal's apex is toothed?" ?allow))
(assert (attribute (name petal-apex-toothed) (value ?answer)))
)
Например, если пользователь хочет изменить атрибут среды обитания, я мог бы создать следующее правило в Перепосещении модуля
(defrule retract-habitat
(not(attribute(name habitat)))
?f <- (attribute (name petal-apex-toothed)))
=>
(retract ?f)
)
но если первое значение, введенное пользователем было гора, а затем он изменил его edge_of_road лепестка-апекс-зубчатая атрибут будет втянута слишком и снова выстрелила, но я вещь, может быть излишне запросить вопрос о лепестковой вершине. Итак, как я могу улучшить свой код?
P.S. Надеюсь, я был ясен, иначе я могу попытаться объяснить mysef лучше :)