Использование if-then-else и фактов в CLIPS - PullRequest
0 голосов
/ 29 апреля 2018

Я хочу заказать 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]; но если «а» является вторым, то решение будет [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)
))

Я получаю сообщение об ошибке «Ошибка синтаксиса», однако я просмотрел несколько руководств, и я на 100% уверен, что синтаксис так выглядит, разница с моим кодом в том, что они используют «if» для переменных, и Я хочу использовать «если» как, если у меня есть этот факт -> сделать это. Это возможно?

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

Ваш синтаксис будет правильным, если (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> 
0 голосов
/ 30 апреля 2018

При выполнении операций в CLIPS вы должны помнить, что символ операции - это первый элемент, за которым следуют аргументы.

Например:

(+ 1 2 3)

6

Ваша ошибка связана с (1-a), вы должны написать (- 1 a)

...