clips - 有没有办法在 CLIPS 中实现数学表达式的完成器?
问题描述
我再次向这个社区寻求帮助。作为我学习 CLIPS 的另一个项目,我想知道是否有办法解决这个问题。我正在尝试制作一个程序,该程序将数字列表作为输入,并在它们之间添加数学运算符,以使数学表达式有效。例如:输入:5 1 6 11 输出:5*1+6=11
为了让它更有趣,我想在最后两个数字之间总是添加符号“=”,但对于数字之间的其余空格,可以添加任何符号 +、-、/ 和 *。如果无法添加数学运算符以创建有效的数学表达式,则程序将仅输出一条消息,例如“没有可能的数学运算符组合”。我感谢所有答案。
解决方案
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>
推荐阅读
- javascript - 无法在本机反应中设置图像路径
- java - 整数中第一个和最后一个数字的总和
- javascript - 基于浏览器的在线游戏的安全注意事项
- vue.js - 如何在创建 VueJS 应用程序之前加载数据?
- java - SQL 查询在 PHPMyAdmin 中有效,但在 Java (JDBC) 中无效
- ios - 如何在设置页面中检查我的应用程序是否禁用了 Face ID
- visual-studio-code - VSC 中的 SML REPL
- java - 如何通过 Intent.ACTION_SEND 共享一个 Arraylist
- javascript - 如何打印出对象的所有键和子键
- python - 有效地复制数据框数据