Testing 剪辑:测试正确的事实

Testing 剪辑:测试正确的事实,testing,clips,Testing,Clips,我有一系列规则和一组初始(assert)事实。现在,我想添加这些事实,运行规则,然后应用另一组规则来检查(run)之后的当前现有事实是否包含正确的事实,而不必再触发以前的规则,也不必销毁当前事实。然后,我想继续应用新事实,运行新规则,测试新插入的事实,等等 我该怎么做?我的测试(批处理)文件类似于: (clear) ; just in case (load constructs.clp) ; All loaded in the MAIN module. (assert (blabla)) (a

我有一系列规则和一组初始(
assert
)事实。现在,我想添加这些事实,运行规则,然后应用另一组规则来检查
(run)
之后的当前现有事实是否包含正确的事实,而不必再触发以前的规则,也不必销毁当前事实。然后,我想继续应用新事实,运行新规则,测试新插入的事实,等等

我该怎么做?我的测试(批处理)文件类似于:

(clear) ; just in case
(load constructs.clp) ; All loaded in the MAIN module.

(assert (blabla))
(assert (blabla2))
(run)

;; Code (rules/functions... I'm still wondering how to do it) to check
;; current facts

(assert (blabla3))
(assert (blabla4))
(run)

;; More tests.

(exit)
我尝试为每个
defmetlate T
创建一个
defmetlate T-copy
,并使用
(assert(testing))
事实首先制作副本。然后,我启动一组具有测试目的和更高显著性的规则,在执行时“停止”执行
(run)
,以避免触发以前的规则(我正在测试的规则)。这种方法的问题在于,除了需要太多的步骤外,我不知道原始规则的显著性,因此我不能确定测试规则是否具有更高的优先级

我知道
defmodule
结构和焦点堆栈,但我还没有理解它们。如果我的猜测是正确的,我想我可以将我所有的测试规则放在一个特定的模块中,并将重点放在该模块上,以避免执行任何主要规则。如果出现问题,我将
(暂停)
在其中一个测试规则中执行,或仅在批处理脚本中执行
(退出)
。如果一切正常,我弹出测试模块返回MAIN,添加更多assert,
(run)
,然后他们用新的测试再次推送测试模块,看看是否一切正常

但是我不确定我的假设是否正确,我想看一个如何进行测试的例子


PD:此外,我的CLIPS版本不支持事实集查询。

以下是将核心规则组与执行测试的规则分离为单独的模块,然后使用focus命令执行测试规则的总体思路

CLIPS> (defmodule MAIN (export ?ALL))
CLIPS> (deftemplate MAIN::point (slot x) (slot y))
CLIPS> 
(defrule MAIN::r1
   =>
   (assert (point (x 1) (y 2)))
   (assert (point (x 1) (y 5))))
CLIPS> (defmodule TESTING (import MAIN ?ALL))
CLIPS> 
(defrule TESTING::horizontal
   (point (x ?x1) (y ?y))
   (point (x ?x2&:(< ?x2 ?x1)) (y ?y))
   =>
   (printout t "Horizonal issue " ?y crlf))
CLIPS> (reset)
CLIPS> (agenda)
0      r1: *
For a total of 1 activation.
CLIPS> (run)
CLIPS> (facts)
f-0     (initial-fact)
f-1     (point (x 1) (y 2))
f-2     (point (x 1) (y 5))
For a total of 3 facts.
CLIPS> (focus TESTING)
TRUE
CLIPS> (agenda)
CLIPS> (run)
CLIPS> 
(defrule MAIN::r2
   =>
   (assert (point (x 3) (y 2))))
CLIPS> (run)
CLIPS> (facts)
f-0     (initial-fact)
f-1     (point (x 1) (y 2))
f-2     (point (x 1) (y 5))
f-3     (point (x 3) (y 2))
For a total of 4 facts.
CLIPS> (focus TESTING)
TRUE
CLIPS> (run)
Horizonal issue 2
CLIPS> 
(defrule TESTING::vertical
   (point (x ?x) (y ?y1))
   (point (x ?x) (y ?y2&:(< ?y2 ?y1)))
   =>
   (printout t "Vertical issue " ?x crlf))
CLIPS> (focus TESTING)
TRUE
CLIPS> (agenda)
0      vertical: f-2,f-1
For a total of 1 activation.
CLIPS> (run)
Vertical issue 1
CLIPS> 
CLIPS>(defmodule MAIN(导出-全部))
剪辑>(deftemplate MAIN::point(插槽x)(插槽y))
剪辑>
(deframe MAIN::r1
=>
(断言(点(x1)(y2)))
(断言(第(x1)(y5)点)
剪辑>(DEF模块测试(导入主-全部))
剪辑>
(定义规则测试::水平
(点(x?x1)(y?y))
(点(x?x2&:(
(打印输出t“水平问题”?y crlf))
剪辑>(重置)
剪辑>(议程)
0 r1:*
总共激活1次。
剪辑>(运行)
剪辑>(事实)
f-0(初始事实)
f-1(点(x1)(y2))
f-2(点(x1)(y5))
总共有3个事实。
剪辑>(焦点测试)
真的
剪辑>(议程)
剪辑>(运行)
剪辑>
(deframe MAIN::r2
=>
(断言(点(x3)(y2)))
剪辑>(运行)
剪辑>(事实)
f-0(初始事实)
f-1(点(x1)(y2))
f-2(点(x1)(y5))
f-3(第(x 3)(y 2)点)
总共有4个事实。
剪辑>(焦点测试)
真的
剪辑>(运行)
横向问题2
剪辑>
(定义规则测试::垂直
(点(x?x)(y?y1))
(点(x?x)(y?y2&:(
(打印输出t“垂直问题”?x crlf)
剪辑>(焦点测试)
真的
剪辑>(议程)
0垂直方向:f-2,f-1
总共激活1次。
剪辑>(运行)
纵向问题1
剪辑>