КЛИПСЫ: Как сравнить равенство одного значения поля с несколькими значениями поля в 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> 
Другие вопросы по тегам