Доступ к нескольким (?) Значениям в CLIPS - PullRequest
0 голосов
/ 19 января 2019

Предположим, у меня есть следующий набор определений, которые показывают входы и выходы различных ступеней электрической цепи. Я не включаю все классы и экземпляры, так как не думаю, что это имеет отношение к моей проблеме. Я включу фотографию, которая поможет вам понять, как эта проблема работает. enter image description here

Здесь input1 поступает на сумматор A1 в качестве обоих входов. Input3 и input4 переходят к множителю Π2 в качестве входов.

definstances facts(      
([command_10_inp1] of  command_data

    (clock 10)
    (object [input_1])
    (value 6))

([command_10_inp2] of  command_data

    (clock 10)
    (object [input_2])
    (value 4))

([command_10_inp3] of  command_data

    (clock 10)
    (object [input_3])
    (value 25))

([command_10_inp4] of  command_data

    (clock 10)
    (object [input_4])
    (value 12))

([command_1_inp1] of  command_data

    (clock 1)
    (object [input_1])
    (value 21))

([command_1_inp2] of  command_data

    (clock 1)
    (object [input_2])
    (value 28))

([command_1_inp3] of  command_data

    (clock 1)
    (object [input_3])
    (value 10))

([command_1_inp4] of  command_data

    (clock 1)
    (object [input_4])
    (value 25))

([command_2_inp1] of  command_data

    (clock 2)
    (object [input_1])
    (value 7))

([command_2_inp2] of  command_data

    (clock 2)
    (object [input_2])
    (value 25))

([command_2_inp3] of  command_data

    (clock 2)
    (object [input_3])
    (value 13))

([command_2_inp4] of  command_data

    (clock 2)
    (object [input_4])
    (value 15))

([command_3_inp1] of  command_data

    (clock 3)
    (object [input_1])
    (value 11))

([command_3_inp2] of  command_data

    (clock 3)
    (object [input_2])
    (value 17))

([command_3_inp3] of  command_data

    (clock 3)
    (object [input_3])
    (value 24))

([command_3_inp4] of  command_data

    (clock 3)
    (object [input_4])
    (value 31))

([command_4_inp1] of  command_data

    (clock 4)
    (object [input_1])
    (value 18))

([command_4_inp2] of  command_data

    (clock 4)
    (object [input_2])
    (value 11))

([command_4_inp3] of  command_data

    (clock 4)
    (object [input_3])
    (value 28))

([command_4_inp4] of  command_data

    (clock 4)
    (object [input_4])
    (value 21))

([command_5_inp1] of  command_data

    (clock 5)
    (object [input_1])
    (value 25))

([command_5_inp2] of  command_data

    (clock 5)
    (object [input_2])
    (value 24))

([command_5_inp3] of  command_data

    (clock 5)
    (object [input_3])
    (value 30))

([command_5_inp4] of  command_data

    (clock 5)
    (object [input_4])
    (value 10))

([command_6_inp1] of  command_data

    (clock 6)
    (object [input_1])
    (value 12))

([command_6_inp2] of  command_data

    (clock 6)
    (object [input_2])
    (value 19))

([command_6_inp3] of  command_data

    (clock 6)
    (object [input_3])
    (value 11))

([command_6_inp4] of  command_data

    (clock 6)
    (object [input_4])
    (value 19))

([command_7_inp1] of  command_data

    (clock 7)
    (object [input_1])
    (value 1))

([command_7_inp2] of  command_data

    (clock 7)
    (object [input_2])
    (value 31))

([command_7_inp3] of  command_data

    (clock 7)
    (object [input_3])
    (value 7))

([command_7_inp4] of  command_data

    (clock 7)
    (object [input_4])
    (value 22))

([command_8_inp1] of  command_data

    (clock 8)
    (object [input_1])
    (value 0))

([command_8_inp2] of  command_data

    (clock 8)
    (object [input_2])
    (value 31))

([command_8_inp3] of  command_data

    (clock 8)
    (object [input_3])
    (value 3))

([command_8_inp4] of  command_data

    (clock 8)
    (object [input_4])
    (value 23))

([command_9_inp1] of  command_data

    (clock 9)
    (object [input_1])
    (value 31))

([command_9_inp2] of  command_data

    (clock 9)
    (object [input_2])
    (value 1))

([command_9_inp3] of  command_data

    (clock 9)
    (object [input_3])
    (value 6))

([command_9_inp4] of  command_data

    (clock 9)
    (object [input_4])
    (value 8))


([reading_10_m1] of  reading_data

    (clock 10)
    (object [m1])
    (value 12))

([reading_10_m2] of  reading_data

    (clock 10)
    (object [m2])
    (value 31))

([reading_10_m3] of  reading_data

    (clock 10)
    (object [m3])
    (value 12))

([reading_10_out] of  reading_data

    (clock 10)
    (object [out1])
    (value 28))

([reading_1_m1] of  reading_data

    (clock 1)
    (object [m1])
    (value 10))

([reading_1_m2] of  reading_data

    (clock 1)
    (object [m2])
    (value 24))

([reading_1_m3] of  reading_data

    (clock 1)
    (object [m3])
    (value 26))

([reading_1_out] of  reading_data

    (clock 1)
    (object [out1])
    (value 18))

([reading_2_m1] of  reading_data

    (clock 2)
    (object [m1])
    (value 0))

([reading_2_m2] of  reading_data

    (clock 2)
    (object [m2])
    (value 0))

([reading_2_m3] of  reading_data

    (clock 2)
    (object [m3])
    (value 3))

([reading_2_out] of  reading_data

    (clock 2)
    (object [out1])
    (value 3))

([reading_3_m1] of  reading_data

    (clock 3)
    (object [m1])
    (value 22))

([reading_3_m2] of  reading_data

    (clock 3)
    (object [m2])
    (value 6))

([reading_3_m3] of  reading_data

    (clock 3)
    (object [m3])
    (value 8))

([reading_3_out] of  reading_data

    (clock 3)
    (object [out1])
    (value 14))

([reading_4_m1] of  reading_data

    (clock 4)
    (object [m1])
    (value 4))

([reading_4_m2] of  reading_data

    (clock 4)
    (object [m2])
    (value 12))

([reading_4_m3] of  reading_data

    (clock 4)
    (object [m3])
    (value 12))

([reading_4_out] of  reading_data

    (clock 4)
    (object [out1])
    (value 0))

([reading_5_m1] of  reading_data

    (clock 5)
    (object [m1])
    (value 18))

([reading_5_m2] of  reading_data

    (clock 5)
    (object [m2])
    (value 16))

([reading_5_m3] of  reading_data

    (clock 5)
    (object [m3])
    (value 12))

([reading_5_out] of  reading_data

    (clock 5)
    (object [out1])
    (value 12))

([reading_6_m1] of  reading_data

    (clock 6)
    (object [m1])
    (value 8))

([reading_6_m2] of  reading_data

    (clock 6)
    (object [m2])
    (value 24))

([reading_6_m3] of  reading_data

    (clock 6)
    (object [m3])
    (value 17))

([reading_6_out] of  reading_data

    (clock 6)
    (object [out1])
    (value 9))

([reading_7_m1] of  reading_data

    (clock 7)
    (object [m1])
    (value 2))

([reading_7_m2] of  reading_data

    (clock 7)
    (object [m2])
    (value 0))

([reading_7_m3] of  reading_data

    (clock 7)
    (object [m3])
    (value 26))

([reading_7_out] of  reading_data

    (clock 7)
    (object [out1])
    (value 26))

([reading_8_m1] of  reading_data

    (clock 8)
    (object [m1])
    (value 0))

([reading_8_m2] of  reading_data

    (clock 8)
    (object [m2])
    (value 0))

([reading_8_m3] of  reading_data

    (clock 8)
    (object [m3])
    (value 0))

([reading_8_out] of  reading_data

    (clock 8)
    (object [out1])
    (value 0))

([reading_9_m1] of  reading_data

    (clock 9)
    (object [m1])
    (value 30))

([reading_9_m2] of  reading_data

    (clock 9)
    (object [m2])
    (value 30))

([reading_9_m3] of  reading_data

    (clock 9)
    (object [m3])
    (value 12))

([reading_9_out] of  reading_data

    (clock 9)
    (object [out1])
    (value 28))
)
)

Используя следующие правила утверждения, я могу получить список всех фактов, к которым относятся вход или датчик:

(defrule assert-inputs
    (object (is-a command_data) (clock ?clock) (object ?object) (value ?value))
    =>
    (assert (fact ?clock ?object ?value)))

(defrule assert-outputs
    (object (is-a reading_data) (clock ?clock) (object ?object) (value ?value))
    =>
    (assert (fact ?clock ?object ?value)))

Я хочу каким-то образом иметь возможность обрабатывать все входные данные в фактах и ​​видеть, что происходит после того, как они передают сумматор или множитель. Мне удалось сделать это для A1, потому что он принимает в качестве входных данных только input1 два раза, как это:

(defrule check_a1
    (fact ?clock ?object ?value)
    (test (eq ?object [input_1]))
    =>
    (assert (fact ?clock [m1t] (mod(+ ?value ?value)(** 2 5)))))

Однако множитель Π2 принимает в качестве входных данных два разных значения input3 и input4. Используя следующее, я могу распечатать все факты из input3 или input4. Проблема в том, что я не знаю, как использовать их таким же образом, как я использовал их выше, когда они были только один, так как для каждого нового факта, который я хочу создать, у меня есть два разных значения. Есть ли простой способ получить доступ к этим значениям? Я попытался привязать их к другой переменной и получить к ним доступ, например, к nth $ 1 и nth $ 2, но не смог заставить его работать.

 (defrule check_p2
    (fact ?clock ?object ?value)
    (test (or (eq ?object [input_3]) (eq ?object [input_4])))
    =>
    (printout t ?clock " " ?object " " ?value crlf))

1 Ответ

0 голосов
/ 19 января 2019

Если вы хотите получить два разных факта с одним и тем же значением часов, разными значениями и объектами [input_3] и [input_4], используйте это правило:

(defrule check_p2
   (fact ?clock [input_3] ?value3)
   (fact ?clock [input_4] ?value4)
   =>
   ; Your action here
)
...