2010-07-14 2 views
4

PyClips를 사용하여 파이썬 인터프리터에서 데이터를 동적으로 검색하는 룰을 클립에 작성하려고합니다. 이를 위해 the manual에 설명 된대로 외부 함수를 등록합니다.클립 전문가 시스템에서 파이썬 함수 사용

아래의 코드는 문제의 장난감 예입니다. 필자는 클립을 사용하여 추론하고 싶은 SQL 데이터베이스의 형태로 데이터의 큰 코퍼스를 가진 응용 프로그램을 가지고 있기 때문에이 작업을 수행하고 있습니다. 그러나 클립을 파이썬의 네임 스페이스에 직접 "플러그인"할 수 있다면이 모든 데이터를 클립 어서션으로 변환하는 데 시간을 낭비하고 싶지는 않습니다.

그러나 규칙을 만들려고하면 오류가 발생합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

import clips 

#user = True 

#def py_getvar(k): 
# return globals().get(k) 
def py_getvar(k): 
    return True if globals.get(k) else clips.Symbol('FALSE') 

clips.RegisterPythonFunction(py_getvar) 

print clips.Eval("(python-call py_getvar user)") # Outputs "nil" 

# If globals().get('user') is not None: assert something 
clips.BuildRule("user-rule", "(neq (python-call py_getvar user) nil)", "(assert (user-present))", "the user rule") 
#clips.BuildRule("user-rule", "(python-call py_getvar user)", "(assert (user-present))", "the user rule") 

clips.Run() 
clips.PrintFacts() 

답변

3

PyClips 지원 그룹에 대한 도움을 받았습니다. 해결책은 Python 함수가 clips.Symbol 객체를 반환하고 규칙 (test ...)을 사용하여 규칙의 LHS에있는 함수를 평가하는 것입니다. 특정 규칙을 활성화하려면 Reset()을 사용해야합니다.

import clips 
clips.Reset() 

user = True 

def py_getvar(k): 
    return (clips.Symbol('TRUE') if globals().get(k) else clips.Symbol('FALSE')) 

clips.RegisterPythonFunction(py_getvar) 

# if globals().get('user') is not None: assert something 
clips.BuildRule("user-rule", "(test (eq (python-call py_getvar user) TRUE))", 
       '(assert (user-present))', 
       "the user rule") 

clips.Run() 
clips.PrintFacts() 
1

문제는 (neq (python-call py_getvar user) 'None')과 관련이 있습니다. 분명히 클립은 중첩 된 문장을 좋아하지 않습니다. 평등 선언문에서 함수 호출을 감싸려고하면 나쁜 일을하는 것처럼 보입니다. 그러나 함수가 Nil 또는 값을 리턴 할 때 절대 값을 어설 션하지 않습니다.

def py_getvar(k): 
    return clips.Symbol('TRUE') if globals.get(k) else clips.Symbol('FALSE') 

그럼 그냥 "(python-call py_getvar user)"

"(neq (python-call py_getvar user) 'None')"을 변경하고 그 일을해야 대신 싶은 것 것은 이것이다. Pyclips를 사용하기 전에 pyclips를 사용하지 마십시오.하지만 원하는대로해야합니다.

HTH!

>>> import clips 
>>> def py_getvar(k): 
...  return clips.Symbol('TRUE') if globals.get(k) else clips.Symbol('FALSE') 

... 
>>> clips.RegisterPythonFunction(py_getvar) 
>>> clips.BuildRule("user-rule", "(python-call py_getvar user)", "(assert (user- 
present))", "the user rule") 
<Rule 'user-rule': defrule object at 0x00A691D0> 
>>> clips.Run() 
0 
>>> clips.PrintFacts() 
>>> 
+0

죄송합니다. 그러나 해결책은 작동하지 않습니다. 같은 오류가 발생합니다. 목표는 임의의 Clips 표현식에서 파이썬 함수의 결과를 사용하므로 (neq ...)를 제거하는 것이 허용되지 않았 음을 참고하십시오. – Cerin

+0

'(neq ...)'는 기호 TRUE 또는 FALSE를 반환합니다. Null (get_var에 의해 반환 됨)과 문자열 "None"의 비교를 무효화 한 결과는 항상 false가 아니거나 TRUE가 아니지만 어떤 세계가 포함되어 있습니다. 그러나 함수에 대한 입력을 기반으로 기호 TRUE 또는 FALSE를 원하면 해당 함수의 값을 반환하십시오. –

+0

코드를 실행 했습니까? 솔루션에서 오류를 반환합니다. – Cerin