Есть ли способ реализовать завершитель для математических выражений в CLIPS? - PullRequest
0 голосов
/ 18 марта 2020

Я снова обращаюсь к этому сообществу за помощью. Как еще один мой побочный проект по изучению CLIPS, мне было интересно, есть ли способ решить эту проблему. Я пытаюсь создать программу, которая принимает в качестве входных данных список чисел и добавляет между ними математические операторы, так что математическое выражение является допустимым. Например: ввод: 5 1 6 11 вывод: 5 * 1 + 6 = 11

Чтобы сделать это более интересным, я думал, что между двумя последними числами всегда будет добавляться знак "=", но для остальных пробелов между числами можно добавить любой из знаков +, -, / и *. Если математические операторы не могут быть добавлены таким образом, чтобы создать допустимое математическое выражение, программа просто выведет сообщение, например «Нет возможных комбинаций математических операторов». Я ценю все ответы.

1 Ответ

1 голос
/ 19 марта 2020
         CLIPS (6.31 6/12/19)
CLIPS> 
(deffacts operators
   (operator +)
   (operator -)
   (operator *)
   (operator /))
CLIPS>    
(deftemplate completer
   (multislot numbers)
   (multislot queue)
   (multislot operators))
CLIPS>    
(deffacts test
   (completer (numbers 3 4 12))
   (completer (numbers 5 1 6 11))
   (completer (numbers 3 4 8 5 20))
   (completer (numbers 1 3 5 7)))
CLIPS> 
(defrule load
   ?f <- (completer (numbers ?n1 ?n2 $?n) (queue))
   =>
   (modify ?f (queue ?n1 ?n2 ?n)))
CLIPS>    
(defrule apply
   ?f <- (completer (queue ?n1 ?n2 $?n ?r)
                    (operators $?ops))
   (operator ?op)
   =>
   (duplicate ?f (queue (funcall ?op ?n1 ?n2) ?n ?r)
                 (operators $?ops ?op)))
CLIPS>                  
(defrule success
   (declare (salience -10))
   (completer (numbers $?n ?r) 
              (queue ?n1 ?n2&:(= ?n1 ?n2))
              (operators $?ops))
   =>
   (printout t (nth$ 1 ?n))
   (loop-for-count (?i (length$ ?ops))
      (printout t " " (nth$ ?i ?ops) " " (nth$ (+ ?i 1) ?n))) 
   (printout t " = " ?r crlf))
CLIPS>   
(defrule failure
   (declare (salience -10))
   (completer (numbers $?n) 
              (queue $?n))
   (not (completer (numbers $?n)
                   (queue ?n1 ?n2&:(= ?n1 ?n2))))
   =>
   (printout t (implode$ ?n) " : no possible combination of mathematical operators" crlf))
CLIPS> (reset)
CLIPS> (run)
3 * 4 = 12
5 * 1 + 6 = 11
5 / 1 + 6 = 11
3 + 4 + 8 + 5 = 20
3 * 4 - 8 * 5 = 20
1 3 5 7 : no possible combination of mathematical operators
CLIPS> 
...