новичок в клипах и не знаю, как справиться с этим элементарным проектом

Я застрял здесь с этим проектом Clips. Я действительно понятия не имею, как решить свои проблемы. Любая помощь? это проект

и вот мой код:

     CLIPS> (assert (saving 30000))
<Fact-1>
CLIPS> (assert (income 50000))
<Fact-2>
CLIPS> (assert (job steady))
<Fact-3>
CLIPS> (assert (expenses 10000))
<Fact-4>
CLIPS> (defglobal ?*s* = 30000)
CLIPS> (defglobal ?*i* = 50000)
CLIPS> (defglobal ?*e* = 10000)
CLIPS> (defglobal ?*x* = 0.5)
CLIPS> (defrule rule1
   (test (> ?*s* (* ?*x* ?*i*)))
   =>
   (assert (savingst good)))
CLIPS> (defrule rule2
(job steady) 
(test(> ?*i* ?*e*))
=> (assert (incomest good))
)
CLIPS> (defrule rule3
(and (savingst good)(incomest good))
=>
(printout t "Advise is invest money in stocks" crlf)
(assert (investment ok))
)
CLIPS> (run)
Advise is invest money in stocks
CLIPS> (bsave "C:/Users/Home/Desktop/pro")
TRUE
CLIPS> (save file.clp)

во-первых, я не знаю, как мне экспортировать файл *.clp. но я сделал это, как показано выше. когда я загружаю этот файл, а затем запускаю его, он запускает только правило 1. есть ли кто-нибудь, кто может мне помочь?


person shaaidaa    schedule 18.12.2016    source источник


Ответы (1)


Если вы откроете file.clp, вы увидите, что операторы assert отсутствуют. Функция сохранения сохраняет только конструкции (такие как defrule, defglobal, deftemplate, ...), а не функции/команды. Используйте конструкцию deffacts для указания фактов, которые должны подтверждаться каждый раз при использовании команды (сброса):

(deffacts initial
   (saving 30000)
   (income 50000)
   (job steady)
   (expenses 10000))

Вам не нужно вводить свои конструкции в командной строке CLIPS, а затем сохранять их. Просто используйте текстовый редактор (либо отдельный текстовый редактор, либо тот, который входит в состав IDE CLIPS для Windows и Mac OS). Это упрощает создание/копирование/редактирование ваших конструкций. Затем вы можете использовать командную строку в первую очередь для выполнения/отладки команд.

Вот лучший подход к вашей проблеме:

CLIPS> 
(deftemplate client
   (slot name)
   (slot income (default 0))
   (slot savings (default 0))
   (slot job (allowed-values steady part-time unemployed unknown))
   (slot expenses (default 0)))
CLIPS> 
(deftemplate analysis
   (slot client)
   (slot attribute)
   (slot value))
CLIPS>          
(deffacts clients
   (client (name "John Doe")
           (income 50000)
           (savings 30000)
           (job steady)))
CLIPS>            
(defrule advise-stock-investment
   (analysis (client ?client)
             (attribute income)
             (value good))
   (analysis (client ?client)
             (attribute savings)
             (value good))
   =>
   (assert (analysis (client ?client)
                     (attribute advice)
                     (value "invest money in stocks"))))   
CLIPS> 
(defrule good-saver
   (client (name ?client)
           (savings ?savings)
           (income ?income))
   (test (> ?savings (* 0.5 ?income)))
   =>
   (assert (analysis (client ?client)
                     (attribute savings)
                     (value good))))
CLIPS>            
(defrule good-income
   (client (name ?client)
           (job ?status)
           (income ?income)
           (expenses ?expenses))
   (test (or (eq ?status steady)
             (> ?income ?expenses)))
   =>
   (assert (analysis (client ?client)
                     (attribute income)
                     (value good))))
CLIPS>                      
(defrule print-advice
   (analysis (client ?client)
             (attribute advice)
             (value ?text))
   =>
   (printout t ?client " should " ?text "." crlf))
CLIPS> (watch rules)
CLIPS> (reset)
CLIPS> (run)
FIRE    1 good-saver: f-1
FIRE    2 good-income: f-1
FIRE    3 advise-stock-investment: f-3,f-2
FIRE    4 print-advice: f-4
John Doe should invest money in stocks.
CLIPS> 
person Gary Riley    schedule 18.12.2016
comment
Большое спасибо :) Это было прекрасно. - person shaaidaa; 19.12.2016
comment
Я использовал этот код, чтобы добавить свои факты: CLIPS> (defrule insertFacts =>(assert (job steady)) (assert (income 50000)) (assert (saving 30000)) (assert (expenses 10000))) но ваш гораздо более логичен. - person shaaidaa; 19.12.2016