我收到错误,我不知道为什么,我什至不知道错误在哪里。这是我的代码:
(deftemplate country-flag-colors
(slot country)
(multislot colors))
(deffacts initial-facts
(country-flag-colors (country "United States") (colors red white blue))
(country-flag-colors (country "Belgium") (colors black yellow red))
(country-flag-colors (country "Poland") (colors white red))
(country-flag-colors (country "Sweden") (colors yellow blue))
(country-flag-colors (country "Jamaica") (colors black yellow green))
(country-flag-colors (country "Colombia") (colors yellow blue red))
(country-flag-colors (country "Italy") (colors green white red))
(country-flag-colors (country "Botswana") (colors blue white black)))
(deftemplate colors-input
(multislot colors))
(defrule get-colors
=>
(printout t "Enter flag colors separated by spaces: ")
(assert (colors-input (colors (explode$ (readline))))))
(defrule match-flags
?input <- (colors-input (colors $?input-colors))
=>
(do-for-all-facts ((?cf country-flag-colors)) TRUE
(bind ?match TRUE)
(progn$ (?color ?input-colors)
(if (not (member$ ?color ?cf:colors)) then
(bind ?match FALSE)
)
)
(if ?match then
(printout t ?cf:country " has a flag with all the specified colors." crlf)
)
)
)
; Start the program
(reset)
(run)
错误:
我在很多页面上寻找解决方案,但无法获得任何帮助。
如果规则中遇到错误,该规则将显示在错误消息中,因此在这种情况下,由于没有引用 match-flags 规则的错误,因此错误必定发生在它之后。
CLIPS (6.31 6/12/19)
CLIPS> (load "rules.clp")
Defining deftemplate: country-flag-colors
Defining deffacts: initial-facts
Defining deftemplate: colors-input
Defining defrule: get-colors +j+j
Defining defrule: match-flags +j+j
[CSTRCPSR1] Expected the beginning of a construct.
FALSE
CLIPS>
在您的代码中,您有一个遵循规则的(重置)命令,因此这是可能出现问题的第一个点。如果您使用较新版本的 CLIPS,行号将包含在错误消息中:
CLIPS (6.4.1 4/8/23)
CLIPS> (load rules.clp)
%$%**
[CSTRCPSR1] bogus.clp, Line 40: Expected the beginning of a construct.
FALSE
CLIPS>
这证实了遇到重置命令时发生了错误。
load 命令仅加载构造(deftemplate、deffacts、defrule 等),因此当它遇到不属于构造的命令或函数调用时,您将收到错误,然后它将尝试继续执行下一个构造。当构造有错误或括号放错位置时,这可以防止错误执行函数或命令的不良行为。
例如,以下规则有一个放错位置的括号,它将删除函数调用置于规则正文之外:
(defrule delete-file
(user-confirmed-deletion)
=>)
(remove "important_file.txt")
在这种情况下,规则和函数调用都具有有效的语法,因此如果加载命令同时处理构造和函数调用,加载这将导致文件“important_file.txt”被删除。
批处理命令将处理构造或命令/函数调用。因此,您可以做的是创建一个文件(例如,rule.clp)并将所有构造放在那里,然后创建另一个文件(例如,run.bat)并在其中放置一系列命令:
(load rules.clp)
(reset)
(run)
然后您可以使用(batch run.bat)命令加载并运行您的程序。