CLIPS程序测试字符串



试图询问恒星的光谱类别并返回符合要求的光谱类别。我的p1规则中出现语法错误。

(deftemplate star
(slot name)
(slot spectral)
(slot magnitude)
(slot distance))
(deffacts stars
(star (name "Sirius") (spectral "A") (magnitude 1) (distance 8.8))
(star (name "Canopus") (spectral "F") (magnitude -3) (distance 98)) 
(star (name "Arcturus") (spectral "K") (magnitude 0) (distance 36)) 
(star (name "Vega") (spectral "A") (magnitude 1) (distance 26)) 
(star (name "Capella") (spectral "G") (magnitude -1) (distance 46)) 
(star (name "Rigel") (spectral "B") (magnitude -7) (distance 880)) 
(star (name "Procyon") (spectral "F") (magnitude 3) (distance 11)) 
(star (name "Betelgeuse") (spectral "M") (magnitude -5) (distance 490)) 
(star (name "Altair") (spectral "A") (magnitude 2) (distance 16)) 
(star (name "Aldebaran") (spectral "K") (magnitude -1) (distance 68)) 
(star (name "Spica") (spectral "B") (magnitude -3) (distance 300)) 
(star (name "Antares") (spectral "M") (magnitude -4) (distance 250))
(star (name "Pollux") (spectral "K") (magnitude 1) (distance 35))
(star (name "Deneb") (spectral "A") (magnitude -7) (distance 1630)) )
(defrule start-up 
?i <- (initial-fact) 
=> 
(printout t "Stars spectral class?: ") 
(bind ?y (read)) 
(assert (spectral ?y)) 
(retract ?i))
(defrule P1
?char <- (star (name ?n) (spectral ?s) (magnitude ?m) (distance ?d))
(spectral ?y)
(test (eq ?s ?y)
=> 
(printout t ?n ", " ?s ", " ?m ", " ?d crlf)
(retract ?char)
(assert (found)))

Defining deftemplate: star
Defining deffacts: stars
Defining defrule: start-up +j+j
Defining defrule: P1
[PRNTUTIL2] Syntax Error:  Check appropriate syntax for test conditional element.
ERROR:
(defrule MAIN::P1
?char <- (star (name ?n) (spectral ?s) (magnitude ?m) (distance ?d))
(spectral ?y)
(test (eq ?s ?y)=>
FALSE
CLIPS>

测试条件元素末尾缺少右括号:

(defrule P1 
?char <- (star (name ?n) (spectral ?s) (magnitude ?m) (distance ?d))
(spectral ?y) 
(test (eq ?s ?y)) ;; <--
=> 
(printout t ?n ", " ?s ", " ?m ", " ?d crlf) 
(retract ?char)
(assert (found)))

你的谱类在deffacts中被指定为字符串,而不是符号,所以你必须输入";A"B";,等。将deffacts中的值从字符串更改为符号(例如,"A"更改为A(,然后您只需输入一个字母即可响应读取。

最初事实的使用在CLIPS 6.3中已被弃用,在CLIPS 6.4中不再支持,因此您应该将其从启动规则中删除:

(defrule start-up 
=> 
(printout t "Stars spectral class?: ") 
(bind ?y (read)) 
(assert (spectral ?y)))

最新更新