在 CLIPS 中使用 if-then-else 和事实

Use of if-then-else and facts in CLIPS

我想订购 4 个字母,[a,b,c,d]。我向用户询问一些关于某些字母的问题,根据他的回答,我将构建最终订单。

我的问题是,如果我有 2 个如下所示的规则:

(defrule rule_1
    =>
(assert (1-a))
)

(defrule rule_2
    =>
(assert (2-a))
)

我想构建一个 "if" 语句,其中如果 "a" 必须先行,那么解决方案是 [1-a, 2-b, 3-c, 4-d];但是如果 "a" 是第二个,那么解决方案是 [1-b, 2-a, 3-c, 4-d]。我的规则如下:

(defrule rule_3
    =>
    (if (1-a) 
    then (printout t "[1-a, 2-b, 3-c, 4-d]" crlf)
    else (printout t "[1-b, 2-a, 3-c, 4-d]" crlf)
))

我得到的错误是 "Syntax Error",但是我搜索了几本手册,我 100% 确定语法是这样的,与我的代码不同的是它们使用 "if" 在变量上,我想使用 "if" 作为,如果我有这个事实 -> 这样做。这可能吗?

在CLIPS中做运算时,要记住运算符是第一个元素,后面是参数。

例如:

(+ 1 2 3)

6

你的错误是由于(1-a),你应该写成(- 1 a)

如果 (1-a) 是一个函数调用,您的语法就是正确的。相反,您想将其置于规则的条件中,如下所示:

         CLIPS (6.31 2/3/18)
CLIPS>   
(defrule rule_3_1
  (1-a) 
  =>
  (printout t "[1-a, 2-b, 3-c, 4-d]" crlf))
CLIPS>   
(defrule rule_3_2
  (2-a) 
  =>
  (printout t "[1-b, 2-a, 3-c, 4-d]" crlf)) 
CLIPS> (assert (1-a))
<Fact-1>
CLIPS> (run)
[1-a, 2-b, 3-c, 4-d]
CLIPS> (assert (2-a))
<Fact-2>
CLIPS> (run)
[1-b, 2-a, 3-c, 4-d]
CLIPS>