나는 문자를 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 행의 모든 위치에서의 존재를 확인하지만, 문제는 조건이 정확한 사실을 주장 만이 아닌 시작하고 다시 확인에 확인하는 것입니다 모든 위치.
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)
수익을 실행하고있는 사실을 수정하지 않습니다.