在 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>
我想订购 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>