КЛИПСЫ: Как сравнить равенство одного значения поля с несколькими значениями поля в defrule?
У меня есть (letterarray $?la)
и (numberarray $?na)
, В моей новой дефруле у меня есть один слот (letter ?fn)
связано со значением (digit ?d1)
,
Новое правило (называется equality
) должен срабатывать, если это произойдет:
Если ?fn
равно любому значению в letterarray
(скажем по индексу i
), а также ?d1
это будет числовое значение из numberarray
по этому конкретному индексу, то он должен выстрелить. Если буквы не равны, то связанные числа также не должны быть равными.
Пример: если у меня есть (letterarray A B C)
а также (numberarray 1 2 3)
, а также (letter C)
связан с (digit 3)
, затем equality
будет стрелять Однако если (letter C)
связан с (digit 2)
или же (digit 1)
тогда не сработает
Если у меня есть (letterarray A B C)
а также (numberarray 1 2 3)
, а также (letter D)
связан с (digit 4)
, затем equality
будет стрелять
Если у меня есть (letterarray A B C)
а также (numberarray 1 2 3)
, а также (letter D)
связан с (digit 3)
, затем equality
НЕ будет стрелять.
Мой блок кода выглядит следующим образом -
(letterarray $?la)
(numberarray $?na)
(length ?l)
(test (loop-for-count (?i 1 ?l) do
(test (if (eq ?fn (nth$ ?i ?la))
then
(eq ?d1 (nth$ ?i ?na))
else
(neq ?d1 (nth$ ?i ?na))))
))
Мое правило не стрельба, однако. Есть ли более чистый / лучший способ сделать это?
Спасибо!
1 ответ
CLIPS (6.31 2/3/18)
CLIPS>
(deffacts initial
(letterarray a b c)
(numberarray 1 2 3))
CLIPS>
(defrule equality
(associated ?fn ?d1)
(letterarray $?la)
(numberarray $?na)
(test (eq (member$ ?fn ?la) (member$ ?d1 ?na)))
=>
(printout t "equality " ?fn " " ?d1 crlf))
CLIPS> (reset)
CLIPS> (assert (associated c 3))
<Fact-3>
CLIPS> (run)
equality c 3
CLIPS> (reset)
CLIPS> (assert (associated c 2))
<Fact-3>
CLIPS> (run)
CLIPS> (reset)
CLIPS> (assert (associated d 4))
<Fact-3>
CLIPS> (run)
equality d 4
CLIPS> (reset)
CLIPS> (assert (associated d 3))
<Fact-3>
CLIPS> (run)
CLIPS>