私は文字A、B、C、D、Eで5x5の行列を埋めなければならない問題を解決しようとしています。各行は各行と各列に複数回出現することはできません。いくつかの最初の文字位置が与えられています。 私はすべてのポジションを別々の事実として作成しました。 "M 1 1 X"。 私は正しい文字で事実を表明し、条件をもう一度確認するために喧嘩をループする方法を苦労しています。例えば上記CLIPSのルーピングディフルー
(defrule solveA5
?a <-(M 5 ?c X)
(not (M ?x ?c A))
=>
(retract ?a)
(assert (M 5 ?c A))
)
コードは、5行目のどの位置にAの存在を確認することですが、問題は条件が始まったばかり、代わりに正しい事実を主張して、もう一度チェックのそれは中をアサートでチェックされていることですあらゆる位置。
deffunctionを使用してループを解消しようとしました。
(deffunction solve (?letter)
(loop-for-count (?x 1 5) do
(loop-for-count (?y 1 5) do
(build (str-cat"defrule costam
?a <-(M ?x ?y X)
(not (and(M ?x ?a ?letter) (M ?b ?y ?letter))
=>
(retract ?a)
(assert (M ?x ?y ?letter))")
)
)
)
)
は、残念ながら "FALSE"
(solve A)
リターンを実行し、すべての事実を変更しません。