试图要求一颗恒星的光谱等级,并返回那些符合要求的。我的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>发布于 2022-03-27 18:36:48
在test条件元素的末尾缺少一个右括号:
(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)))您的谱类被指定为deffact中的字符串,而不是符号,因此您必须在read函数提示下输入"A“、"B”等,这样才能使P1规则工作。将数字从字符串更改为符号(例如,"A“到A),然后您只需输入一个字母来响应读取。
最初事实的使用在CLIPS 6.3中被废弃,在CLIPS 6.4中不再支持,因此您应该从启动规则中删除它:
(defrule start-up
=>
(printout t "Stars spectral class?: ")
(bind ?y (read))
(assert (spectral ?y)))https://stackoverflow.com/questions/71638584
复制相似问题