CLIPS - 预期是构造函数的开始。 [错误]

问题描述 投票:0回答:1

我正在 CLIPS 中锻炼。这是任务:

我收到错误,我不知道为什么,我什至不知道错误在哪里。这是我的代码:

(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)

错误:

我在很多页面上寻找解决方案,但无法获得任何帮助。

clips
1个回答
0
投票

如果规则中遇到错误,该规则将显示在错误消息中,因此在这种情况下,由于没有引用 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)命令加载并运行您的程序。

© www.soinside.com 2019 - 2024. All rights reserved.