Функция накопления не накапливает факт

Я работаю над сокращением электрической цепи и испытываю трудности с последовательным подключением. Я смоделировал ветку с двумя узлами, и для обнаружения последовательного соединения я написал следующее правило:

(defrule serial
    ?b1 <- (Branch (node2 ?n1) (resistance ?v1))
    ?b2 <- (Branch (node1 ?n1) (resistance ?v2) (node2 ?n3))
    ?c <- (accumulate (bind ?count 0)
          (bind ?count (+ ?count 1))
          ?count
          (Branch (node1 ?n1))
          ) 
    (test (eq ?c 1))
     ?c1 <- (accumulate (bind ?count1 0)
          (bind ?count1 (+ ?count1 1))
          ?count1
          (Branch (node2 ?n1))
          ) 
    (test (eq ?c1 1))
     =>
    (modify ?b1 (node2 ?n3) (resistance (+ ?v1 ?v2)))
    (retract ?b2)
    )

Я хочу подсчитать, сколько ветвей имеют один и тот же начальный узел, если их несколько, то это не последовательное соединение. К сожалению, этот счетчик возвращает 1 для следующих ветвей:

f-1   (MAIN::Branch (name AB) (node1 A) (node2 B) (resistance 2))
f-2   (MAIN::Branch (name BC) (node1 B) (node2 C) (resistance 2))
f-3   (MAIN::Branch (name BC) (node1 B) (node2 T) (resistance 5.0))

и рассматривает f-1 и f-2 как последовательное соединение. Есть ли обходной путь для этой проблемы?


person Sanja    schedule 29.11.2017    source источник


Ответы (1)


Правило не срабатывает для множества AB, BC и BT, и я полагаю, что и не должно, так как B соединяется с C и T. И я думаю, что узел, который можно исключить, не должен иметь более одного предшественника и< /em> не более одного преемника. Поэтому я предлагаю это правило:

(defrule myserial
  ?b1 <- (Branch (node1 ?n1) (node2 ?n2) (resistance ?v1))
  ?b2 <- (Branch (node1 ?n2) (node2 ?n3) (resistance ?v2))
  (not (Branch (node1 ~?n1) (node2 ?n2)))
  (not (Branch (node1 ?n2) (node2 ~?n3)))
=>
  (modify ?b1 (node2 ?n3) (resistance (+ ?v1 ?v2)))
  (retract ?b2)
)
person laune    schedule 30.11.2017
comment
Проблема с кодом, который я написал, заключается в том, что правило срабатывает, а оно не должно срабатывать. Мой вопрос заключался в том, почему он считает, что узел B является узлом 1 для 1 ветви, когда есть две ветви. Я попробую подход, который вы дали. - person Sanja; 30.11.2017
comment
Мне удалось решить проблему с помощью данного кода с дополнительной проверкой имени, так как это правило не будет обнаруживать параллельные ветки с одинаковыми ?n1 и ?n2. Спасибо! - person Sanja; 01.12.2017