2016-07-13 4 views
1

고유 한 고유 인스턴스 쌍에 대해 정확히 한 번 규칙을 트리거하려고 시도하고 있습니다.고유 한 인스턴스 바인딩 순서

일반의 예는 다음과 같습니다

(defclass USER_THING (is-a USER)) 

(definstances KNOWN_THINGS 
    (thing-a of USER_THING) 
    (thing-b of USER_THING) 
    (thing-c of USER_THING)) 

(defrule match-things 
    ?thing0 <- (object (is-a USER_THING)) 
    ?thing1 <- (object (is-a USER_THING)) 
=> 
    (printout t "-------" crlf) 
    (printout t "thing0 " (instance-name ?thing0) crlf) 
    (printout t "thing1 " (instance-name ?thing1) crlf)) 

을 분명히, 우리는 자체 KNOWN_THINGS의 직교 제품을 기대하는, 우리가 무엇을 얻을 정확히 어떤 :

내 원하는 출력이 더
 
CLIPS> (reset) 
CLIPS> (run) 
------- 
thing0 [thing-c] 
thing1 [thing-c] 
------- 
thing0 [thing-c] 
thing1 [thing-b] 
------- 
thing0 [thing-c] 
thing1 [thing-a] 
------- 
thing0 [thing-a] 
thing1 [thing-c] 
------- 
thing0 [thing-b] 
thing1 [thing-c] 
------- 
thing0 [thing-b] 
thing1 [thing-b] 
------- 
thing0 [thing-b] 
thing1 [thing-a] 
------- 
thing0 [thing-a] 
thing1 [thing-b] 
------- 
thing0 [thing-a] 
thing1 [thing-a] 

동안 유사 :

 
CLIPS> (reset) 
CLIPS> (run) 
------- 
thing0 [thing-a] 
thing1 [thing-b] 
------- 
thing0 [thing-a] 
thing1 [thing-c] 
------- 
thing0 [thing-b] 
thing1 [thing-c] 

나는 Apache Jena의 앞으로의 경험이있다.

(defrule match-things 
    ?thing0 <- (object (is-a USER_THING)) 
    ?thing1 <- (object (is-a USER_THING)) 
    (> (str-compare (instance-name ?thing0) (instance-name ?thing1)) 0) 
=> 
    (printout t "-------" crlf) 
    (printout t "thing0 " (instance-name ?thing0) crlf) 
    (printout t "thing1 " (instance-name ?thing1) crlf)) 

이 적절한 클립 규칙되지 않습니다 : 단순히 인스턴스 이름에 임의의 순서를 적용하는 규칙 조항을 추가 할 것 항에있어서, 추론 시스템을 -chaining. 원하는 효과를 얻기 위해 무엇을 할 수 있습니까? 이를 용이하게하기 위해 필요에 따라 인스턴스에 정보 (예 : 임의의 숫자 또는 문자열 식별자)를 추가 할 수 있습니다.

답변

1

시험 조건 요소를 사용하여

(defrule match-things 
    ?thing0 <- (object (is-a USER_THING)) 
    ?thing1 <- (object (is-a USER_THING)) 
    (test (> (str-compare (instance-name ?thing0) (instance-name ?thing1)) 0)) 
=> 
    (printout t "-------" crlf) 
    (printout t "thing0 " (instance-name ?thing0) crlf) 
    (printout t "thing1 " (instance-name ?thing1) crlf)) 
관련 문제