考虑一下这种情况。我有这样的模板:
(deftemplate MAIN::simplecause
(multislot coraxinfo (type INTEGER) (default undefined))
(multislot changeinfo (type SYMBOL) (default undefined)))
(deftemplate MAIN::finalcause
(multislot coraxinfo (type INTEGER) (default undefined))
(multislot changeinfo (type SYMBOL) (default undefined)))我知道,在coraxinfo插槽中,我的值总是不超过14个(可能更少,但永远不会更多)。现在,在changeinfo多时隙中,我将不超过13个值。
我正在努力写一条规则,在我所掌握的任何事实之间找到所有可能的匹配。
例如:
(deffacts start
(simplecause (coraxinfo 1 2 3) (changeinfo a b c))
(simplecause (coraxinfo 7 8 2 3 9) (changeinfo d a b e))
(simplecause (coraxinfo 2 3 10 13) (changeinfo f g a b z))
(simplecause (coraxinfo 77 88 99 66) (changeinfo k m l s))
(simplecause (coraxinfo 88 99 11 22) (changeinfo v k m w))
(simplecause (coraxinfo 13 88 99) (changeinfo k m))
(simplecause (coraxinfo 666 777 888) (changeinfo abc def))
(simplecause (coraxinfo 666 111 222 888 333 444 555 777 999) (changeinfo abc 1a 2a 3a def 4a)))我需要得到这个(每个多时隙中的值顺序并不重要):
(finalcause (coraxinfo 2 3) (changeinfo a b))
(finalcause 88 99) (changeinfo k m))
(finalcause 666 777 888) (changeinfo abc def)) 现在,我已经停止了这个函数:
(defrule cause_generalization_initial1
?f1 <- (simplecause (coraxinfo $?coraxmatch1 $?coraxmatch2 $?coraxmatch3 $?coraxmatch4 $?coraxmatch5 $?coraxmatch6 $?coraxmatch7) (changeinfo $?pricematch1 $?pricematch2 $?pricematch3 $?pricematch4 $?pricematch5 $?pricematch6 $?pricematch7))
?f2 <- (simplecause (coraxinfo $?coraxmatch1 $?coraxmatch2 $?coraxmatch3 $?coraxmatch4 $?coraxmatch5 $?coraxmatch6 $?coraxmatch7) (changeinfo $?pricematch1 $?pricematch2 $?pricematch3 $?pricematch4 $?pricematch5 $?pricematch6 $?pricematch7))
(test (neq ?f1 ?f2))
(not (finalcause (coraxinfo $?coraxmatch1 $?coraxmatch2 $?coraxmatch3 $?coraxmatch4 $?coraxmatch5 $?coraxmatch6 $?coraxmatch7) (changeinfo $?pricematch1 $?pricematch2 $?pricematch3 $?pricematch4 $?pricematch5 $?pricematch6 $?pricematch7)))
=>
(assert (finalcause (coraxinfo $?coraxmatch1 $?coraxmatch2 $?coraxmatch3 $?coraxmatch4 $?coraxmatch5 $?coraxmatch6 $?coraxmatch7) (changeinfo $?pricematch1 $?pricematch2 $?pricematch3 $?pricematch4 $?pricematch5 $?pricematch6 $?pricematch7))))这有点笨拙,但据我所知,$?意思是“零或更多”,所以即使我有比我在搜索模式中指定的更少的字段,它也应该工作。我在每种模式中最多使用7个多时隙,因为拥有14或13个值作为最大值意味着,在最坏的情况下,多时隙中的每一个秒值将与其他事实中的smth匹配。
当我加载deffacts剪辑中指定的事实时,会出现一种无限循环--它在很长一段时间内不会响应,所以我认为我在我的规则中犯了一个错误。此外,这个规则应该关闭引擎,以防我将有几个事实,几乎相同的区别,只有在一个领域。在这种情况下,它将产生可怕的数量之间的匹配。知道我哪里错了吗?我非常感谢你的任何建议。
最新消息。如果我们试图采用constructin (最终原因)的方法,一次向coraxinfo和changeinfo插槽添加一个值,这比我目前在这2条规则上已经停止了:
用两个多插槽中的一个匹配值创建初始最终原因事实:
(defrule cause_generalization_initial
?f1 <- (simplecause (coraxinfo $? ?coraxmatch $?) (changeinfo $? ?changematch $?))
?f2 <- (simplecause (coraxinfo $? ?coraxmatch $?) (changeinfo $? ?changematch $?))
(test (neq ?f1 ?f2))
(not (finalcause (coraxinfo ?coraxmatch) (changeinfo ?changematch)))
=>
(assert (finalcause (coraxinfo ?coraxmatch) (changeinfo ?changematch)))如果我们有任何最终原因事实,我们试着检查它中的所有多时隙值都是在?coraxmatchafter值之前的所有子集,在匹配的简单原因和断言一个扩展的最终原因。我认为这个规则应该能够在匹配的简单词中“跳过空隙”。
(defrule cause_generalization_advanced
?f1 <- (simplecause (coraxinfo $?coraxbefore1 ?coraxmatchafter $?) (changeinfo $?changebefore1 ?changematchafter $?))
?f2 <- (simplecause (coraxinfo $?coraxbefore2 ?coraxmatchafter $?) (changeinfo $?changebefore2 ?changematchafter $?))
(test (neq ?f1 ?f2))
(finalcause (coraxinfo $?finalcoraxbefore) (changeinfo $?finalchangebefore))
(test (and (subsetp $?finalcoraxbefore $?coraxbefore1) (subsetp $?finalcoraxbefore $?coraxbefore2)
(subsetp $?finalchangebefore $?changebefore1) (subsetp $?finalchangebefore $?changebefore2)))
=>
(assert (finalcause (coraxinfo $?finalcoraxbefore ?coraxmatchafter) (changeinfo $?finalchangebefore ?changematchafter))))我在这些deffact中使用规则(请注意,deffact与上面的规则不同):
(deffacts start
(simplecause (coraxinfo 1 2 3) (changeinfo a b c))
(simplecause (coraxinfo 7 8 2 3 9) (changeinfo d a b e))
(simplecause (coraxinfo 2 3 10 13) (changeinfo f g a b z))
(simplecause (coraxinfo 77 88 99 66) (changeinfo k m l s))
(simplecause (coraxinfo 88 99 11 22) (changeinfo v k m w))
(simplecause (coraxinfo 13 88 99) (changeinfo k m))
(simplecause (coraxinfo 666 777 888) (changeinfo abc def))
(simplecause (coraxinfo 666 111 222 777 333 444 555 888 999) (changeinfo abc 1a 2a 3a def 4a)))这里的问题是,我期望它能够为3个匹配字段生成最终原因,但它只产生两个匹配字段的最终原因事实,而我不明白为什么。难道不应该注意到这三个事实属于第二条规则吗?
(simplecause (coraxinfo 666 777 888) (changeinfo abc def))
(simplecause (coraxinfo 666 111 222 777 333 444 555 888 999) (changeinfo abc 1a 2a 3a def 4a))
(finalcause (coraxinfo 666 888) (changeinfo abc def))
Output of both rules is:
f-0 (initial-fact)
f-1 (simplecause (coraxinfo 1 2 3) (changeinfo a b c))
f-2 (simplecause (coraxinfo 7 8 2 3 9) (changeinfo d a b e))
f-3 (simplecause (coraxinfo 2 3 10 13) (changeinfo f g a b z))
f-4 (simplecause (coraxinfo 77 88 99 66) (changeinfo k m l s))
f-5 (simplecause (coraxinfo 88 99 11 22) (changeinfo v k m w))
f-6 (simplecause (coraxinfo 13 88 99) (changeinfo k m))
f-7 (simplecause (coraxinfo 666 777 888) (changeinfo abc def))
f-8 (simplecause (coraxinfo 666 111 222 777 333 444 555 888 999) (changeinfo abc 1a 2a 3a def 4a))
f-9 (finalcause (coraxinfo 666) (changeinfo abc))
f-10 (finalcause (coraxinfo 666 888) (changeinfo abc def))
f-11 (finalcause (coraxinfo 666 777) (changeinfo abc def))
f-12 (finalcause (coraxinfo 666) (changeinfo def))
f-13 (finalcause (coraxinfo 777) (changeinfo abc))
f-14 (finalcause (coraxinfo 777 888) (changeinfo abc def))
f-15 (finalcause (coraxinfo 777) (changeinfo def))
f-16 (finalcause (coraxinfo 888) (changeinfo abc))
f-17 (finalcause (coraxinfo 888) (changeinfo def))
f-18 (finalcause (coraxinfo 88) (changeinfo k))
f-19 (finalcause (coraxinfo 88 99) (changeinfo k m))
f-20 (finalcause (coraxinfo 88) (changeinfo m))
f-21 (finalcause (coraxinfo 99) (changeinfo k))
f-22 (finalcause (coraxinfo 99) (changeinfo m))
f-23 (finalcause (coraxinfo 2) (changeinfo a))
f-24 (finalcause (coraxinfo 2 3) (changeinfo a b))
f-25 (finalcause (coraxinfo 2) (changeinfo b))
f-26 (finalcause (coraxinfo 3) (changeinfo a))
f-27 (finalcause (coraxinfo 3) (changeinfo b))发布于 2014-05-20 00:19:19
使用7个多字段变量,您将在模式匹配的数量上创建一个组合爆炸。看看规则中的第一个模式可以匹配的方式有多少:
CLIPS>
(deftemplate simplecause
(multislot coraxinfo)
(multislot changeinfo))
CLIPS>
(deftemplate finalcause
(multislot coraxinfo)
(multislot changeinfo))
CLIPS>
(defrule cause_generalization_initial1
(simplecause (coraxinfo $?coraxmatch1 $?coraxmatch2 $?coraxmatch3 $?coraxmatch4 $?coraxmatch5 $?coraxmatch6 $?coraxmatch7)
(changeinfo $?pricematch1 $?pricematch2 $?pricematch3 $?pricematch4 $?pricematch5 $?pricematch6 $?pricematch7))
=>)
CLIPS> (assert (simplecause (coraxinfo) (changeinfo)))
<Fact-1>
CLIPS> (agenda)
0 cause_generalization_initial1: f-1
For a total of 1 activation.
CLIPS> (modify 1 (coraxinfo a) (changeinfo 1))
<Fact-2>
CLIPS> (agenda)
0 cause_generalization_initial1: f-2
.
.
.
0 cause_generalization_initial1: f-2
For a total of 49 activations.
CLIPS> (modify 2 (coraxinfo a b) (changeinfo 1 2))
<Fact-3>
CLIPS> (agenda)
0 cause_generalization_initial1: f-3
.
.
.
0 cause_generalization_initial1: f-3
For a total of 784 activations.
CLIPS> (modify 3 (coraxinfo a b c) (changeinfo 1 2 3))
<Fact-4>
CLIPS> (agenda)
0 cause_generalization_initial1: f-4
.
.
.
0 cause_generalization_initial1: f-4
For a total of 7056 activations.
CLIPS> (modify 4 (coraxinfo a b c d) (changeinfo 1 2 3 4))
<Fact-5>
CLIPS> (agenda)
0 cause_generalization_initial1: f-5
.
.
.
0 cause_generalization_initial1: f-5
For a total of 44100 activations.
CLIPS>如果coraxinfo和changeinfo插槽是空的,那么只有一种方式可以匹配模式,并且只有一个激活。如果每个插槽包含一个值,那么每个插槽有7种不同的匹配方式(七个变量中的一个值,其余变量为空)。在这两个插槽之间,这意味着有49种不同的模式可以匹配。
一旦在每个插槽中得到4个值,就有44100种不同的方式可以匹配单个模式。这意味着,通过添加第二个模式,需要比较的组合有44,100 * 44,100。这是1,944,810,000次比较,需要对单个事实进行断言,并且您已经得到了8个事实,其中一个在一个时隙中有9个值,另一个在另一个槽中。
这不是你要用一条规则来解决的问题。最好的方法可能是使用多个规则一次构造一个最终原因事实。例如,首先确定其中包含两个事实,并创建一个(最终原因(coraxinfo 666) (Changeinfo)事实。然后有一个规则,它确定有两个事实,它们都有最终原因中的所有值,加上一个不存在的附加值,并添加这个值。例如,(最终原因(coraxinfo 666 777) (changeinfo))。然后,您可以使用移除中间结果的规则。
您还需要构造规则,这样就不会生成排列。例如,您不希望生成所有不同但等效的事实:
(finalcause (coraxinfo 666 777 888) (changeinfo abc def))
(finalcause (coraxinfo 666 888 777) (changeinfo abc def))
(finalcause (coraxinfo 777 666 888) (changeinfo abc def))
(finalcause (coraxinfo 777 888 666) (changeinfo abc def))
(finalcause (coraxinfo 888 666 777) (changeinfo abc def))
(finalcause (coraxinfo 888 777 666) (changeinfo abc def))
(finalcause (coraxinfo 666 777 888) (changeinfo def abc))
(finalcause (coraxinfo 666 888 777) (changeinfo def abc))
(finalcause (coraxinfo 777 666 888) (changeinfo def abc))
(finalcause (coraxinfo 777 888 666) (changeinfo def abc))
(finalcause (coraxinfo 888 666 777) (changeinfo def abc))
(finalcause (coraxinfo 888 777 666) (changeinfo def abc))要做到这一点,我建议对最后原因插槽中的值进行排序,这样就可以对等效的事实进行唯一的排序。
发布于 2014-05-21 15:47:05
在Gary的帮助下,以下是执行此操作的变体:
(deftemplate MAIN::simplecause
(multislot coraxinfo (type INTEGER) (default 0))
(multislot changeinfo (type SYMBOL) (default undefined)))
(deftemplate MAIN::finalcause
(multislot coraxinfo (type INTEGER) (default 0))
(multislot changeinfo (type SYMBOL) (default undefined)))
(deffacts start
(simplecause (coraxinfo 1 2 3) (changeinfo a b c))
(simplecause (coraxinfo 7 8 2 3 9) (changeinfo d a b e))
(simplecause (coraxinfo 2 3 10 13) (changeinfo f g a b z))
(simplecause (coraxinfo 77 88 99 66) (changeinfo k m l s))
(simplecause (coraxinfo 88 99 11 22) (changeinfo v k m w))
(simplecause (coraxinfo 13 88 99) (changeinfo k m))
(simplecause (coraxinfo 666 777 888) (changeinfo abc def))
(simplecause (coraxinfo 666 111 222 777 333 444 555 888 999) (changeinfo abc 1a 2a 3a def 4a)))
(defrule cause_generalization_advanced_corax
?f1 <- (simplecause (coraxinfo $?coraxbefore1 ?coraxmatchafter $?) (changeinfo $?changebefore1))
?f2 <- (simplecause (coraxinfo $?coraxbefore2 ?coraxmatchafter $?) (changeinfo $?changebefore2))
(test (neq ?f1 ?f2))
(finalcause (coraxinfo $?finalcoraxbefore) (changeinfo $?finalchangebefore))
(test (and (subsetp $?finalcoraxbefore $?coraxbefore1) (subsetp $?finalcoraxbefore $?coraxbefore2)
(subsetp $?finalchangebefore $?changebefore1) (subsetp $?finalchangebefore $?changebefore2)))
=>
(assert (finalcause (coraxinfo $?finalcoraxbefore ?coraxmatchafter) (changeinfo $?finalchangebefore))))
(defrule cause_generalization_advanced_change
?f1 <- (simplecause (coraxinfo $?coraxbefore1) (changeinfo $?changebefore1 ?changematchafter $?))
?f2 <- (simplecause (coraxinfo $?coraxbefore2) (changeinfo $?changebefore2 ?changematchafter $?))
(test (neq ?f1 ?f2))
(finalcause (coraxinfo $?finalcoraxbefore) (changeinfo $?finalchangebefore))
(test (and (subsetp $?finalcoraxbefore $?coraxbefore1) (subsetp $?finalcoraxbefore $?coraxbefore2)
(subsetp $?finalchangebefore $?changebefore1) (subsetp $?finalchangebefore $?changebefore2)))
=>
(assert (finalcause (coraxinfo $?finalcoraxbefore) (changeinfo $?finalchangebefore ?changematchafter))))
(reset)
(run)
(facts)
f-0 (initial-fact)
f-1 (simplecause (coraxinfo 1 2 3) (changeinfo a b c))
f-2 (simplecause (coraxinfo 7 8 2 3 9) (changeinfo d a b e))
f-3 (simplecause (coraxinfo 2 3 10 13) (changeinfo f g a b z))
f-4 (simplecause (coraxinfo 77 88 99 66) (changeinfo k m l s))
f-5 (simplecause (coraxinfo 88 99 11 22) (changeinfo v k m w))
f-6 (simplecause (coraxinfo 13 88 99) (changeinfo k m))
f-7 (simplecause (coraxinfo 666 777 888) (changeinfo abc def))
f-8 (simplecause (coraxinfo 666 111 222 777 333 444 555 888 999) (changeinfo abc 1a 2a 3a def 4a))
f-9 (finalcause (coraxinfo 666) (changeinfo abc))
f-10 (finalcause (coraxinfo 666 888) (changeinfo abc))
f-11 (finalcause (coraxinfo 666 888) (changeinfo abc def))
f-12 (finalcause (coraxinfo 666 777) (changeinfo abc))
f-13 (finalcause (coraxinfo 666 777 888) (changeinfo abc))
f-14 (finalcause (coraxinfo 666 777 888) (changeinfo abc def))
f-15 (finalcause (coraxinfo 666 777) (changeinfo abc def))
f-16 (finalcause (coraxinfo 666) (changeinfo abc def))
f-17 (finalcause (coraxinfo 666) (changeinfo def))
f-18 (finalcause (coraxinfo 666 888) (changeinfo def))
f-19 (finalcause (coraxinfo 666 777) (changeinfo def))
f-20 (finalcause (coraxinfo 666 777 888) (changeinfo def))
f-21 (finalcause (coraxinfo 777) (changeinfo abc))
f-22 (finalcause (coraxinfo 777 888) (changeinfo abc))
f-23 (finalcause (coraxinfo 777 888) (changeinfo abc def))
f-24 (finalcause (coraxinfo 777) (changeinfo abc def))
f-25 (finalcause (coraxinfo 777) (changeinfo def))
f-26 (finalcause (coraxinfo 777 888) (changeinfo def))
f-27 (finalcause (coraxinfo 888) (changeinfo abc))
f-28 (finalcause (coraxinfo 888) (changeinfo abc def))
f-29 (finalcause (coraxinfo 888) (changeinfo def))
f-30 (finalcause (coraxinfo 88) (changeinfo k))
f-31 (finalcause (coraxinfo 88 99) (changeinfo k))
f-32 (finalcause (coraxinfo 88 99) (changeinfo k m))
f-33 (finalcause (coraxinfo 88) (changeinfo k m))
f-34 (finalcause (coraxinfo 88) (changeinfo m))
f-35 (finalcause (coraxinfo 88 99) (changeinfo m))
f-36 (finalcause (coraxinfo 99) (changeinfo k))
f-37 (finalcause (coraxinfo 99) (changeinfo k m))
f-38 (finalcause (coraxinfo 99) (changeinfo m))
f-39 (finalcause (coraxinfo 2) (changeinfo a))
f-40 (finalcause (coraxinfo 2 3) (changeinfo a))
f-41 (finalcause (coraxinfo 2 3) (changeinfo a b))
f-42 (finalcause (coraxinfo 2) (changeinfo a b))
f-43 (finalcause (coraxinfo 2) (changeinfo b))
f-44 (finalcause (coraxinfo 2 3) (changeinfo b))
f-45 (finalcause (coraxinfo 3) (changeinfo a))
f-46 (finalcause (coraxinfo 3) (changeinfo a b))
f-47 (finalcause (coraxinfo 3) (changeinfo b))https://stackoverflow.com/questions/23744038
复制相似问题