2016-09-20 7 views
0

이상한 행동 :클립이 바인딩 식 대화에서 잘 해석 아니지만 defrule 내부하는 이유 이해가 안

CLIPS> (bind ?test (nth$ 1 (create$ 1))) 

1 

새로운 창 제목이 윈도우의 후

(defrule testrule 
    (bind ?test2 (nth$ 1 (create$ 1))) 
=> 
    (assert (nothing here))) 

출력 " 로드 버퍼 ":

CLIPS> Loading Selection... 
Defining defrule: testrule 
[PRNTUTIL2] Syntax Error: Check appropriate syntax for defrule. 

ERROR: 
(defrule MAIN::testrule 
(bind ?test2 (
CLIPS> 

두 경우 모두 어떻게 동일하게 실패 할 수 있습니까?

필자는이 문제를 여러 번 테스트 했으므로 바인딩 라인에서 구문 분석 단절을 살펴봄으로써 확인할 수있는 나머지 오류 구문에서 문제가 없음을 분명히 알 수 있습니다.

감사합니다.

답변

1

불편을 끼쳐 드려 죄송합니다. 테스트 조건부 요소를 사용하여 규칙 조건에서 표현식을 평가합니다. 사용 된 구문은 fact를 relation name bind와 일치 시키려고한다는 것을 나타냅니다. 명령 줄에서 무슨 일을하는지에 아날로그 규칙의 행동에서 결합 할 수있는 함수 호출을 실행하는 것입니다

CLIPS> (bind ?test (nth$ 1 (create$ 1))) 
1 
CLIPS> 
(defrule testrule 
    => 
    (bind ?test (nth$ 1 (create$ 1))) 
    (printout t ?test crlf)) 
CLIPS> (run) 
1 
CLIPS> 

괄호가 광범위 클립에서 구분 기호로 사용되기 때문에이 많은 경우 어디 컨텍스트가 있습니다 코드 조각의 의미를 결정합니다. 규칙의 조건에 출력 코드를 이동

CLIPS> 
(defrule hello 
    => 
    (printout t Hello crlf)) 
CLIPS> (run) 
Hello 
CLIPS> 

: 여기

CLIPS> (printout t Hello crlf) 
Hello 
CLIPS> 

규칙의 행동에서 유사한 전화는 다음과 같습니다 예를 들어, 다음 명령 프롬프트에서 출력 명령을 호출입니다

CLIPS> 
(defrule hello 
    (printout t Hello crlf) 
    =>) 
CLIPS> (agenda) 
CLIPS> (facts) 
f-0  (initial-fact) 
For a total of 1 fact. 
CLIPS> (assert (printout t Hello crlf)) 
<Fact-1> 
CLIPS> (agenda) 
0  hello: f-1 
For a total of 1 activation. 
CLIPS> (facts) 
f-0  (initial-fact) 
f-1  (printout t Hello crlf) 
For a total of 2 facts. 
CLIPS> 

조건 요소는 규칙의 조건에서 사용할 수있는 테스트가 산업사하기 : 사실과 일치하도록 패턴에 함수 호출에서 코드의 의미를 변경

CLIPS> 
(defrule hello (test (printout t Hello crlf)) =>) 
Hello 
CLIPS> 

일부 규칙 기반 언어 그러나, 클립이하는, 당신은 규칙의 조건에서 파생 된 값으로 변수를 결합 할 수 있습니다 : 동봉 된 코드는 함수 호출이 아닌 사실과 일치하는 패턴이다 icate 아니이 기능을 지원하므로 테스트 조건 요소 내에 바인드 기능 호출을 배치하여이 문제를 해결받을 수 없습니다 : 응답에 대한

CLIPS> (defrule hello (test (bind ?x 1)) => (printout t ?x crlf)) 

[PRCCODE3] Undefined variable x referenced in RHS of defrule. 

ERROR: 
(defrule MAIN::hello 
    (test (bind ?x 1)) 
    => 
    (printout t ?x crlf)) 
CLIPS> 
+0

감사합니다,하지만 난 그것을 바인딩을 할당 할 수 없습니다 이해가 안 돼요 이 문제와 관련하여, 왜 (bind? test 1)와 같은 간단한 바인드가 대신 작동할까요? –

+0

몇 가지 추가 clari 약. –

+0

나에게 이해가가는 것처럼 보입니다. 테스트를 제외한 왼쪽의 모든 것은 패턴 매칭을 위해서만 해석되며 바인딩의 n 번째 $/create $/등의 표준 함수는 실패합니다. 해당 컨텍스트에서 사용할 수 없습니다. –