我需要帮助比较defrule中的数字和CLIPS中的多槽对象。

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

我有以下代码

(deftemplate choice-evaluation
(slot x_front)
(slot y_left)



(deftemplate es_result
(slot classp)
(slot classr)
(slot nr) )

(defrule MAIN::one
    (x_front ?val)
    (bind ?temp 1)
    (choice-evaluation(y_left -1) (test (<= ?val ?temp ))(class ?x))
?c<-(choice-evaluation(y_left -1) (test(<= ?val ?temp ))(class ?x))
=>
(assert (es_result (classp 0) (classr ?x) (nr 1)))
(retract ?c))  

我得到的错误是: ERROR:(defrule MAIN::one (x_front ?val) (choice-evaluation (y_left -1) (test)

我尝试了很多东西,但我总是会得到上面的错误或defrules的语法错误。我不明白如何才能在defrules中与多槽对象进行比较。

我试着创建一个像这里的例子一样的规则。https:/www.csie.ntu.edu.tw~syleecoursesclipsadvpattern.htm。 它们确实有效,但它不适合我的特殊情况。

clips
1个回答
0
投票

在你的代码中存在几个错误,如果你识别代码,就会更容易看到。

(defrule MAIN::one
   (x_front ?val)
   (bind ?temp 1)
   (choice-evaluation (y_left -1) 
                      (test (<= ?val ?temp)) 
                      (class ?x))
   ?c <- (choice-evaluation (y_left -1) 
                            (test (<= ?val ?temp))
                            (class ?x))
   =>
   (assert (es_result (classp 0) (classr ?x) (nr 1)))
   (retract ?c))

你把测试条件元素放在了选择-评价条件元素里面 所以解析器把测试符号当作槽名来处理 由于选择-评价deftemplate没有名为test的槽,所以你会得到一个错误。你使用class作为槽名也会得到一个错误,因为这个槽在choice-evaluation deftemplate中也没有定义。

另外,(bind ?temp 1)将被视为一个事实模式,而不是一个函数调用。如果你想在规则的条件中检索一个值,可以断言一个包含该值的事实,并使用类似规则中的x_front模式将其赋值给一个变量。重复选择-评价模式没有任何意义--只需保留第二种模式,因为它将事实-地址绑定到与该模式相匹配的模式上,而这个模式是规则的操作中的retract命令所需要的。


0
投票

@Gary Riley 谢谢你的意见,帮了大忙!原来是这样的。

    (choice-evaluation (x_front ?val) (y_left -1) (class ?x))
               (test (<= ?val 1 ))
              ?c <- (choice-evaluation (x_front ?val) (y_left -1) (class ?x))
=>
(assert (es_result (classp 0) (classr ?x) (nr 1)))
(retract ?c))

原来这就是它应该被使用的方式。把它留在这里,以防将来有人遇到类似的问题credits 。I. Xatziligeroudis

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