我正在尝试在 CLIPS 中做类似“事实概括”的事情(不确定哪个术语最能描述它),我不确定如何以最佳方式做到这一点。
考虑这种情况。我有一组由以下模板描述的事实:
(deftemplate MAIN::simplecause
(slot coraxidcause (type INTEGER) (default 0))
(slot changeidcause (type SYMBOL) (default PF1))
(multislot coraxinfo (type SYMBOL) (default undefined))
(multislot changeinfo (type SYMBOL) (default undefined)))
(deftemplate MAIN::finalcause
(multislot coraxinfo (type SYMBOL) (default undefined))
(multislot changeinfo (type SYMBOL) (default undefined))
(slot casecount (type INTEGER) (default 0)))
Coraxidcause 和 changeidcause 组合是一种关键 - 这两个字段的组合是唯一的。changeinfo 和 coraxinfo 在插槽中有一些符号值(我在每个插槽中的值总是不超过 10 个)
所以我有一些简单的事实。我想要做的是找出 changeinfo 和 coraxinfo 中哪些值相同并断言它们。例如,如果我有这些简单的事实:
(simplecause (coraxidcause id1) (changeidcause id1) (coraxinfo 1 2 3) (changeinfo a b c))
(simplecause (coraxidcause id2) (changeidcause id2) (coraxinfo 2 3 6 7) (changeinfo e a b d f))
(simplecause (coraxidcause id3) (changeidcause id3) (coraxinfo 9 11 2 3 0) (changeinfo g a b))
(simplecause (coraxidcause id4) (changeidcause id4) (coraxinfo 77) (changeinfo z))
我想断言这样的事实:
(finalcause (coraxinfo 2 3) (changeinfo a b))
现在我写了这条规则:
(defrule MAIN::cause_generalization_initial
(simplecause (coraxidcause ?coraxid1) (changeidcause ?factid1) (coraxinfo $? $?coraxdetails $?) (changeinfo $? $?changedetails $?))
(simplecause (coraxidcause ?coraxid2) (changeidcause ?factid2) (coraxinfo $? $?coraxdetails $?) (changeinfo $? $?changedetails $?))
(or (test (<> ?coraxid1 ?coraxid2))
(neq ?factid1 ?factid2))
(not (finalcause (coraxinfo $?coraxdetails) (changeinfo $?changeddetails)))
=>
(assert (finalcause (coraxinfo ?coraxdetails) (changeinfo ?changedetails) (casecount 0))))
问题是,如果我们回到前面提到的这 4 个事实,它会断言:
(finalcause (coraxinfo 2) (changeinfo a))
(finalcause (coraxinfo 3) (changeinfo a))
(finalcause (coraxinfo 2 3) (changeinfo b))
等等
我不需要所有这些“部分匹配”,我只需要完全匹配的部分 - (finalcause (coraxinfo 2 3) (changeinfo ab)),我不知道该怎么做。此外,当我有这样的事情时,会发生非常可怕的事情:
(simplecause (coraxidcause id5) (changeidcause id5) (coraxinfo 0 1 2 3) (changeidcause a b c))
(simplecause (coraxidcause id6) (changeidcause id6) (coraxinfo 6 1 2 3) (changeidcause a b c))
此时 CLIPS 引擎像无限循环一样进入 smth,LHS 列出所有可能的匹配:
(finalcause (coraxinfo 1) (changeidcause a))
(finalcause (coraxinfo 1) (changeidcause a b))
等等
这需要很长时间(正如我之前提到的,我仍然不需要做我不需要的事情)。我是 CLIPS 的新手,所以我认为我错过了一些明显的东西,应该有一些方法来做我需要的事情。我将不胜感激有关如何执行此操作的任何帮助或建议。任何想法都会非常有用。
看起来我还没有澄清我到底想要什么。我需要在所有事实中找到所有可能的“匹配”,例如,如果我有这些事实:
(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) (changeinfo abc def)))
我需要将此作为输出:
(finalcause (coraxinfo 2 3) (changeinfo a b))
(finalcause 88 99) (changeinfo k m))