首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CLIPS程序测试字符串

CLIPS程序测试字符串
EN

Stack Overflow用户
提问于 2022-03-27 17:19:27
回答 1查看 37关注 0票数 1

试图要求一颗恒星的光谱等级,并返回那些符合要求的。我的p1规则中有语法错误。

代码语言:javascript
复制
(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)))

代码语言:javascript
复制
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>
EN

回答 1

Stack Overflow用户

发布于 2022-03-27 18:36:48

在test条件元素的末尾缺少一个右括号:

代码语言:javascript
复制
(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中不再支持,因此您应该从启动规则中删除它:

代码语言:javascript
复制
(defrule start-up 
   => 
   (printout t "Stars spectral class?: ") 
   (bind ?y (read)) 
   (assert (spectral ?y)))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71638584

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档