; Обявление шаблона фрейма для описания модели предметной области (deftemplate vcard (slot parametr (type SYMBOL)) (slot status (type SYMBOL)) (slot brand (type SYMBOL)) (slot pref (type NUMBER)(default 0))) ; Объявление функций для формулирования дополнительных вопросов (deffunction ask_vram() (printout t "Насколько важен для Вас этот параметр?" crlf "1. Не очень важен. (Ответ-1)" crlf "2. Очень важен. (Ответ-2)" crlf "Ваш ответ: ")) (deffunction ask_cool() (printout t "Укажите важность для Вас этого параметра." crlf "1. Есть параметры и поважней. (Ответ-1)" crlf "2. СО - самый главный атрибут видеокарты. (Ответ-2)" crlf "Ваш ответ: ")) (deffunction ask_mass() (printout t "Насколько важны для Вас эти параметры?" crlf "1. Не очень важны. (Ответ-1)" crlf "2. Очень важны. (Ответ-2)" crlf "Ваш ответ: ")) (deffunction ask_prog_test() (printout t "Насколько важны для Вас результаты тестирования?" crlf "1. Принимаю к сведению. (Ответ-1)" crlf "2. Только тестирование дает представление об истинном" crlf "качестве видеокарты. (Ответ-2)" crlf "Ваш ответ: ")) ; Правила, создающие модель предметной области (defrule overclock (initial-fact) => (printout t crlf "Вы любитель разгона? (yes/no): ") (bind ?overclock (read)) (if (eq ?overclock yes) then (printout t "Насколько важен для Вас этот параметр?" crlf "1. Чистое любопытство. (Ответ-1)" crlf "2. Без разгона не могу. (Ответ-2)" crlf "Ваш ответ: ") (assert (vcard (parametr overclock)(status yes)(brand GeForce) (pref (read)))) else (assert (vcard (parametr overclock)(status no)(brand Radeon)))) (assert (overclock done))) ;-------------------------------------------------------------------------------- (defrule modding ?overclock <- (overclock done) => (printout t crlf "Вы любитель моддинга? (yes/no): ") (bind ?modding (read)) (if (eq ?modding yes) then (printout t "Насколько важен для Вас этот параметр?" crlf "1. Хорошо, если есть. (Ответ-1)" crlf "2. Без моддинга не могу. (Ответ-2)" crlf "Ваш ответ: ") (assert (vcard (parametr modding)(status yes)(brand GeForce) (pref (read)))) else (assert (vcard (parametr modding)(status no)(brand Radeon)))) (retract ?overclock) (assert (modding done))) ;--------------------------------------------------------------------------------- (defrule mount ?modding <- (modding done) => (printout t crlf "Вы будете сами установливать видеокарту? (yes/no): ") (bind ?mount (read)) (if (eq ?mount yes) then (printout t "Насколько важна для Вас эта операция?" crlf "1. Не обижусь, если придется повозиться. (Ответ-1)" crlf "2. Легкость установки - вопрос принципиальный. (Ответ-2)" crlf "Ваш ответ: ") (assert (vcard (parametr mount)(status yes)(brand Radeon) (pref (read)))) else (assert (vcard (parametr mount)(status no)(brand Radeon)))) (retract ?modding) (assert (mount done))) ;--------------------------------------------------------------------------------- (defrule vram ?mount <- (mount done) => (printout t crlf "Какой объем видеопамяти Вас устроит?" crlf "1. 256 MB - это то, что надо. (Ответ-1)" crlf "2. 128 MB - вполне достаточно. (Ответ-2)" crlf "3. Затрудняюсь ответить. (Ответ-3)" crlf "Ваш ответ: ") (bind ?vram (read)) (if (eq ?vram 1) then (ask_vram) (assert (vcard (parametr vram)(status yes)(brand Radeon) (pref (read))))) (if (eq ?vram 2) then (ask_vram) (assert (vcard (parametr vram)(status yes)(brand GeForce) (pref (read))))) (if (eq ?vram 3) then (assert (vcard (parametr vram)(status no)(brand GeForce)))) (retract ?mount) (assert (vram done))) ;--------------------------------------------------------------------------------- (defrule cool ?vram <- (vram done) => (printout t crlf "Ваши требования к системе охлаждения?" crlf "1. Малошумная. (Ответ-1)" crlf "2. Более шумная, но интеллектуальная. (Ответ-2)" crlf "3. Затрудняюсь ответить. (Ответ-3)" crlf "Ваш ответ: ") (bind ?cool (read)) (if (eq ?cool 1) then (ask_cool) (assert (vcard (parametr cool)(status yes)(brand Radeon) (pref (read))))) (if (eq ?cool 2) then (ask_cool) (assert (vcard (parametr cool)(status yes)(brand GeForce) (pref (read))))) (if (eq ?cool 3) then (assert (vcard (parametr cool)(status no)(brand GeForce)))) (retract ?vram) (assert (cool done))) ;--------------------------------------------------------------------------------- (defrule mass ?cool <- (cool done) => (printout t crlf "Ваши требования к габаритам и массе видеокарты?" crlf "1. Носить видеокарту с собой не собираюсь," crlf "но поменьше и полегче - это хорошо. (Ответ-1)" crlf "2. Чем больше и массивней, тем надежней. (Ответ-2)" crlf "3. А черт его знает. (Ответ-3)" crlf "Ваш ответ: ") (bind ?mass (read)) (if (eq ?mass 1) then (ask_mass) (assert (vcard (parametr mass)(status yes)(brand Radeon) (pref (read))))) (if (eq ?mass 2) then (ask_mass) (assert (vcard (parametr mass)(status yes)(brand GeForce) (pref (read))))) (if (eq ?mass 3) then (assert (vcard (parametr mass)(status no)(brand Radeon)))) (retract ?cool) (assert (mass done))) ;--------------------------------------------------------------------------------- (defrule prog_test ?mass <- (mass done) => (printout t crlf "Тестам какой программы Вы отдаете предпочтение" crlf "при выборе видеокарты?" crlf "1. 3DMark. (Ответ-1)" crlf "2. Unreal Tournament. (Ответ-2)" crlf "3. Понятия не имею. (Ответ-3)" crlf "Ваш ответ: ") (bind ?prog_test (read)) (if (eq ?prog_test 1) then (ask_prog_test) (assert (vcard (parametr prog_test)(status yes)(brand GeForce) (pref (read))))) (if (eq ?prog_test 2) then (ask_prog_test) (assert (vcard (parametr prog_test)(status yes)(brand Radeon) (pref (read))))) (if (eq ?prog_test 3) then (assert (vcard (parametr prog_test)(status no)(brand Radeon)))) (retract ?mass) (assert (knowledge done)))