2017-11-29 10 views
0

전기 회로 감소 및 직렬 연결에 어려움이 있습니다. 나는 두 개의 노드로 분기를 모델로 한 시리얼 연결을 감지하기 위해 나는 다음과 같은 규칙을 작성했습니다 :누적 함수가 사실을 누적하지 않음

나는이 둘 이상있는 경우,이 것보다, 같은 시작 노드가 몇 가지 계산 할
(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를 처리합니다. 이 문제에 대한 해결 방법이 있습니까?

답변

1

규칙은 AB, BC 및 BT 세트에 대해 실행되지 않으며 B는 C 및 T에 연결되기 때문에 규칙을 적용하지 않아야한다고 가정합니다. 제거 할 수있는 노드는 하나 이상의 전임자가 없어야합니다. 후임자가 하나 이상이 아닌 그러므로 나는이 규칙을 제안한다 :

(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) 
) 
+0

필자가 작성한 코드의 문제점은 규칙이 작동하지 않아야한다는 것이다. 제 질문은 두 개의 분기가있을 때 노드 B가 1 개의 분기에 대해 node1이라는 이유입니다. 당신이 준 접근 방식을 시도 할 것입니다. – Sanja

+0

이 규칙은 동일한 n1과 n2를 갖는 병렬 분기를 감지하지 않기 때문에 추가 이름 확인과 함께 주어진 코드를 사용하여 문제를 해결할 수있었습니다. 감사! – Sanja