在剪辑中找到最适合的汽车

时间:2017-05-15 17:16:38

标签: clips expert-system

所以我们有一个项目,我们需要建立一个专家系统,通过给它一些汽车的事实,它为用户选择最适合的。

首先,在课堂上我们学习了一些关于剪辑的东西,比如我们的deftemplate,deffacts和defrule。没什么(!!!) 因此,我认为我的项目不能包含模块或功能等代码。

其次,根据给定的数据,代码应该像我正在写下来的那样。

事情是:  1.我们没有学习其他方式来解除(收回)。  如果我是对的:     2A。我的代码有什么方法可以找到应该收回的内容而不需要专家写下不相关的事实?     2B。我该怎么写才能每次都有结果? (例如,如果我们给类型族和价格高,我们就不会有ruselt)。     2C。是否有任何方式,在那之后,“减法方法”我,虽然,程序打印,问题后,剩余的事实,但没有“(事实)”方式?

非常感谢你。

代码是:

(deftemplate car_template
(slot brand_name (type STRING))
(slot type (type STRING)(allowed-symbols family city super))
(slot price (type SYMBOL) (allowed-symbols low mid high))
;;; low = 0-10000 mid = 10001-20000 high = 20001-10000 
(slot performance (type SYMBOL) (allowed-symbols low mid high))
(slot equipment (type SUMBOL) (allowed-symbols low mid high))
)

(deffacts car_facts
(car (brand_name "Opel Astra")(type family)(price mid)(performance low)
(car (brand_name "Peugeot 106a")(type city)(price low)(performance high)
(car (brand_name "Mercedes E200")(type super)(price high)(performance mid)
(car (brand_name "Rover 25")(type family)(price mid)(performance mid)
(car (brand_name "Ferrari F40")(type super)(price high)(performance high)
)


(defrule type_rule
(initial-fact)

=>

(printout t "Give the Type you want (possible options: family city super): "
    (bind ?response (read))
    (if (eq ?response family) then
        ;;;retracting city               
        (retract 2)
        ;;;rectarting super
        (retract 3 5)
    else (if (eq ?response city) then
        ;;;retracting family
        (retract 1 4)
        ;;;rectarting super
        (retract 3 5) 
          else
                ;;;retracting city
        (retract 2)
        ;;;retracting family               
        (retract 1 4)
    ))))

(defrule price_rule
(initial-fact)

=>

(printout t "Give the price you want (possible options: low mid high): "
    (bind ?response (read))
    (if (eq ?response low) then
        ;;;retracting mid               
        (retract 1 4)
        ;;;rectarting high
        (retract 3 5)
    else (if (eq ?response mid) then
        ;;;retracting low
        (retract 2)
        ;;;rectarting high
        (retract 3 5) 
          else
                ;;;retracting mid
        (retract 1 4)
        ;;;retracting low               
        (retract 2)
    ))))

(defrule performance_rule
(initial-fact)

=>

(printout t "Give the performance you want (possible options: low mid high): "
    (bind ?response (read))
    (if (eq ?response low) then
        ;;;retracting mid               
        (retract 3 4)
        ;;;rectarting high
        (retract 2 5)
    else (if (eq ?response mid) then
        ;;;retracting low
        (retract 1)
        ;;;rectarting high
        (retract 2 5) 
          else
                ;;;retracting mid
        (retract 3 4)
        ;;;retracting low               
        (retract 1)
    ))))

(defrule print_facts
(initial-fact)

=>

(printout t "The car that fits you is: "
    (facts)
))

1 个答案:

答案 0 :(得分:0)

这是收回事实的更好方法:

(deftemplate car
   (slot brand_name (type STRING))
   (slot type (type SYMBOL)(allowed-symbols family city super))
   (slot price (type SYMBOL) (allowed-symbols low mid high))
   (slot performance (type SYMBOL) (allowed-symbols low mid high))
   (slot equipment (type SYMBOL) (allowed-symbols low mid high)))

(deffacts car_facts
   (car (brand_name "Opel Astra") (type family) (price mid) (performance low))
   (car (brand_name "Peugeot 106a") (type city) (price low) (performance high))
   (car (brand_name "Mercedes E200") (type super) (price high) (performance mid))
   (car (brand_name "Rover 25") (type family) (price mid) (performance mid))
   (car (brand_name "Ferrari F40") (type super) (price high) (performance high)))

(defrule questions
   =>
   (printout t "Give the Type you want (possible options: family city super): ")
   (assert (type (read)))
   (printout t "Give the price you want (possible options: low mid high): ")
   (assert (price (read)))
   (printout t "Give the performance you want (possible options: low mid high): ")
   (assert (performance (read))))

(defrule type_rule
   (type ?type)
   ?c <- (car (type ~?type))
   =>
   (retract ?c))

(defrule price_rule
   (price ?price)
   ?c <- (car (price ~?price))
   =>
   (retract ?c))

(defrule performance_rule
   (performance ?performance)
   ?c <- (car (performance ~?performance))
   =>
   (retract ?c))

(defrule match
   (declare (salience -100))
   (car (brand_name ?name))
   =>
   (printout t "The car that fits you is: " ?name crlf))

以下是根据匹配条件的数量打印汽车列表的方法:

(deftemplate car
   (slot brand_name (type STRING))
   (slot type (type SYMBOL)(allowed-symbols family city super))
   (slot price (type SYMBOL) (allowed-symbols low mid high))
   (slot performance (type SYMBOL) (allowed-symbols low mid high))
   (slot equipment (type SYMBOL) (allowed-symbols low mid high))
   (multislot matches))

(deffacts car_facts
   (car (brand_name "Opel Astra") (type family) (price mid) (performance low))
   (car (brand_name "Peugeot 106a") (type city) (price low) (performance high))
   (car (brand_name "Mercedes E200") (type super) (price high) (performance mid))
   (car (brand_name "Rover 25") (type family) (price mid) (performance mid))
   (car (brand_name "Ferrari F40") (type super) (price high) (performance high)))

(defrule questions
   =>
   (printout t "Give the Type you want (possible options: family city super): ")
   (assert (type (read)))
   (printout t "Give the price you want (possible options: low mid high): ")
   (assert (price (read)))
   (printout t "Give the performance you want (possible options: low mid high): ")
   (assert (performance (read))))

(defrule type_rule
   (type ?type)
   ?c <- (car (type ?type) (matches $?m))
   (test (not (member$ type ?m)))
   =>
   (modify ?c (matches ?m type)))

(defrule price_rule
   (price ?price)
   ?c <- (car (price ?price) (matches $?m))
   (test (not (member$ price ?m)))
   =>
   (modify ?c (matches ?m price)))

(defrule performance_rule
   (performance ?performance)
   ?c <- (car (performance ?performance) (matches $?m))
   (test (not (member$ performance ?m)))
   =>
   (modify ?c (matches ?m performance)))

(defrule match-header
   (declare (salience -100))
   =>
   (printout t "Cars matching your criteria: " crlf))

(defrule match-3
   (declare (salience -200))
   (car (brand_name ?name) (matches $?m))
   (test (= (length$ ?m) 3))
   =>
   (printout t "   " ?name " : " (implode$ ?m) crlf))

(defrule match-2
   (declare (salience -300))
   (car (brand_name ?name) (matches $?m))
   (test (= (length$ ?m) 2))
   =>
   (printout t "   " ?name " : " (implode$ ?m) crlf))

(defrule match-1
   (declare (salience -400))
   (car (brand_name ?name) (matches $?m))
   (test (= (length$ ?m) 1))
   =>
   (printout t "   " ?name " : " (implode$ ?m) crlf))

(defrule match-none
   (declare (salience -200))
   (not (and (car (brand_name ?name) (matches $?m))
             (test (> (length$ ?m) 0))))
   =>
   (printout t "   None" crlf))

使用sort和find-all-fact函数来帮助打印结果:

(deftemplate car
   (slot brand_name (type STRING))
   (slot type (type SYMBOL)(allowed-symbols family city super))
   (slot price (type SYMBOL) (allowed-symbols low mid high))
   (slot performance (type SYMBOL) (allowed-symbols low mid high))
   (slot equipment (type SYMBOL) (allowed-symbols low mid high))
   (multislot matches))

(deffacts car_facts
   (car (brand_name "Opel Astra") (type family) (price mid) (performance low))
   (car (brand_name "Peugeot 106a") (type city) (price low) (performance high))
   (car (brand_name "Mercedes E200") (type super) (price high) (performance mid))
   (car (brand_name "Rover 25") (type family) (price mid) (performance mid))
   (car (brand_name "Ferrari F40") (type super) (price high) (performance high)))

(defrule questions
   =>
   (printout t "Give the Type you want (possible options: family city super): ")
   (assert (type (read)))
   (printout t "Give the price you want (possible options: low mid high): ")
   (assert (price (read)))
   (printout t "Give the performance you want (possible options: low mid high): ")
   (assert (performance (read))))

(defrule type_rule
   (type ?type)
   ?c <- (car (type ?type) (matches $?m))
   (test (not (member$ type ?m)))
   =>
   (modify ?c (matches ?m type)))

(defrule price_rule
   (price ?price)
   ?c <- (car (price ?price) (matches $?m))
   (test (not (member$ price ?m)))
   =>
   (modify ?c (matches ?m price)))

(defrule performance_rule
   (performance ?performance)
   ?c <- (car (performance ?performance) (matches $?m))
   (test (not (member$ performance ?m)))
   =>
   (modify ?c (matches ?m performance)))

(defrule match-header
   (declare (salience -100))
   =>
   (printout t "Cars matching your criteria: " crlf))

(deffunction sort-cars (?f1 ?f2)
   (< (length$ (fact-slot-value ?f1 matches)) 
      (length$ (fact-slot-value ?f2 matches))))

(defrule match-some
   (declare (salience -200))
   (exists (and (car (matches $?m))
                (test (> (length$ ?m) 0))))
   =>
   (bind ?cars (find-all-facts ((?c car)) (> (length$ ?c:matches) 0)))
   (bind ?cars (sort sort-cars ?cars))
   (progn$ (?c ?cars)
      (printout t "   " (fact-slot-value ?c brand_name) " : " (implode$ (fact-slot-value ?c matches)) crlf)))

(defrule match-none
   (declare (salience -200))
   (not (and (car (matches $?m))
             (test (> (length$ ?m) 0))))
   =>
   (printout t "   None" crlf))

运行程序时的最终结果:

CLIPS> (reset)
CLIPS> (run)
Give the Type you want (possible options: family city super): super
Give the price you want (possible options: low mid high): high
Give the performance you want (possible options: low mid high): mid
Cars matching your criteria: 
   Mercedes E200 : performance type price
   Ferrari F40 : price type
   Rover 25 : performance
CLIPS>