首页 > 解决方案 > 有没有办法在 CLIPS 中实现数学表达式的完成器?

问题描述

我再次向这个社区寻求帮助。作为我学习 CLIPS 的另一个项目,我想知道是否有办法解决这个问题。我正在尝试制作一个程序,该程序将数字列表作为输入,并在它们之间添加数学运算符,以使数学表达式有效。例如:输入:5 1 6 11 输出:5*1+6=11

为了让它更有趣,我想在最后两个数字之间总是添加符号“=”,但对于数字之间的其余空格,可以添加任何符号 +、-、/ 和 *。如果无法添加数学运算符以创建有效的数学表达式,则程序将仅输出一条消息,例如“没有可能的数学运算符组合”。我感谢所有答案。

标签: clips

解决方案


         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> 

推荐阅读