2013-04-08 4 views
1

Я разрабатываю экспертную систему, которая будет принимать решения о приеме с использованием PyClips. Однако код продолжал генерировать ошибки «из памяти». Я думаю, что я выделил свою проблему. Это что-то не так с моим файлом CLIPS. Надеясь, что кто-то может увидеть, что я делаю неправильно здесь. Это самая простая версия кода ... Я упростил ее для отладки: вот мой шаблон, и для аргумента есть только 1 правило: если стенограмма получена, то приложение завершено атрибут помечен как ИСТИНА.CLIPS бесконечные факты

; template for application facts 
(deftemplate application "structure of an application" 
(slot app-id (type INTEGER)) 
(slot app-complete (type SYMBOL)) 
(slot transcript-received (type SYMBOL)) 
) 


(defrule complete "rule for app completeness" 

?f <- (application 
     (transcript-received Yes)  
    ) 
=> 
    (modify ?f 
     (app-complete TRUE) 
    ) 
) 
; end. 

Так что, когда я (assert (application (app-id 123) (transcript-received Yes))) затем добавляют I факт. Когда я нажимаю пробел, хотя ... окно в CLIPS начинает перегружаться тысячами фактов ... атрибут app-complete выглядит помеченным как TRUE, однако факты просто продолжают цикл и цикл, но без остановок. Когда становится слишком много фактов, я говорю о 100K или что-то в этом роде ... тогда CLIPS просто уходит ... Любая идея, что я делаю неправильно здесь? Мой синтаксис каким-то образом испорчен? Мои намерения состоят в том, чтобы иметь sqlite db, чтобы читать «факты» из db, чтобы система могла принимать решения .... но я не могу пройти мимо этого!

ответ

1

Важным моментом является то, что при изменении факта deftemplate факт отменяется и утверждается новый (измененный) факт. Ваше правило также соответствует модифицированному факту, который затем снова модифицируется и сопоставляется и т. Д., Что приводит к бесконечному циклу. Если бы вы были смотреть факты и активации при выполнении кода, вы увидите что-то вроде этого:

<== f-1  (application (app-id 123) (app-complete nil) (transcript-received Yes)) 
==> f-2  (application (app-id 123) (app-complete TRUE) (transcript-received Yes)) 
==> Activation 0  complete: f-2 
<== f-2  (application (app-id 123) (app-complete TRUE) (transcript-received Yes)) 
==> f-3  (application (app-id 123) (app-complete TRUE) (transcript-received Yes)) 
==> Activation 0  complete: f-3 
<== f-3  (application (app-id 123) (app-complete TRUE) (transcript-received Yes)) 
==> f-4  (application (app-id 123) (app-complete TRUE) (transcript-received Yes)) 
==> Activation 0  complete: f-4 
(etc.) 

Вы можете предотвратить это только соответствующие приложения, которые уже не завершены. Вот модифицированная версия кода, который добавляет значение по умолчанию FALSE в слот app-complete и соответствует только приложения, которые не являются полными:

(deftemplate application "structure of an application" 
    (slot app-id (type INTEGER)) 
    (slot app-complete (type SYMBOL) (default FALSE)) 
    (slot transcript-received (type SYMBOL))) 

(defrule complete "rule for app completeness" 
    ?f <- (application (transcript-received Yes) (app-complete FALSE)) 
    => 
    (modify ?f (app-complete TRUE))) 

Теперь, если вы смотрите факты и активаций, вы должны увидеть следующее, когда вы подтвердите свой факт и запустите:

CLIPS> (assert (application (app-id 123) (transcript-received Yes))) 
==> f-0  (application (app-id 123) (app-complete FALSE) (transcript-received Yes)) 
==> Activation 0  complete: f-0 
<Fact-0> 
CLIPS> (run) 
<== f-0  (application (app-id 123) (app-complete FALSE) (transcript-received Yes)) 
==> f-1  (application (app-id 123) (app-complete TRUE) (transcript-received Yes)) 
CLIPS> 
+0

Спасибо @bogatron! – engr007

+0

любая идея об этом? http://stackoverflow.com/questions/15963202/how-to-combine-these-two-rules-with-clips – engr007

+0

Он выглядит несколько связанным с этим вопросом. Если мой ответ на этот вопрос является приемлемым, то, пожалуйста, нажмите ссылку «Принять», чтобы я знал, что это правильно, и любой, кто выполняет поиск по вашему вопросу, будет знать, что это приемлемое решение. Затем мы перейдем к соответствующему вопросу. – bogatron