2013-02-06 2 views
1

pyDatalog.load() 메서드를 사용하여 작은 pyDatalog 프로그램을로드하려고합니다. 내가 잘못파일의 데이터 로그 프로그램을 pyDatalog에로드

""" 
+ (factorial[1]==1) 
(factorial[N] == F) <= (N > 1) & (F == N*factorial[N-1]) 
""" 

을 뭐하는 거지 예를 들어, 나는 https://sites.google.com/site/pydatalog/

from pyDatalog import pyDatalog 
pyDatalog.create_atoms('factorial, N, F') # gives datalog capability to these words 

def run_program(): 

    N = pyDatalog.Variable() 
    F = pyDatalog.Variable() 
    file_in = open("sample_datalog_program.dl", 'r') 
    mc = file_in.read() 
    print mc 
    @pyDatalog.program() 
    def _(): # the function name is ignored 
     pyDatalog.load(mc) 
     #pyDatalog.load(""" 
     #+ (factorial[1]==1) 
     #(factorial[N] == F) <= (N > 1) & (F == N*factorial[N-1]) 
     #""") 
     print(pyDatalog.ask('factorial[4]==F')) 
    file_in.close() 
    pass 


if __name__ == "__main__": 
    run_program() 

에서 계승 샘플 파일 sample_datalog_program.dl는 다음과 같은 포함로드는 무엇입니까? pyDatalog.load (mc) 행을 다음 4 개의 주석 처리 된 행으로 바꾸면 제대로 작동합니다.

내가 오류는 다음과 같습니다

/usr/local/Cellar/python/2.7.3/Frameworks/Python.framework/Versions/2.7/bin/python2.7 run_datalog_program.py 
pyDatalog version 0.12.0 
Traceback (most recent call last): 
    File "run_datalog_program.py", line 25, in <module> 
    run_program() 
    File "run_datalog_program.py", line 11, in run_program 
    @pyDatalog.program() 
    File "/usr/local/lib/python2.7/site-packages/pyDatalog/pyParser.py", line 191, in add_program 
    load(source_code, newglobals, defined, function=func_name) 
    File "/usr/local/lib/python2.7/site-packages/pyDatalog/pyParser.py", line 154, in load 
six.exec_(code, newglobals) 
    File "/usr/local/lib/python2.7/site-packages/six.py", line 308, in exec_ 
    exec("""exec code in globs, locs""") 
    File "<string>", line 1, in <module> 
    File "_", line 1, in <module> 
    File "/usr/local/lib/python2.7/site-packages/pyDatalog/pyDatalog.py", line 115, in load 
    return pyParser.load(code) 
    File "/usr/local/lib/python2.7/site-packages/pyDatalog/pyParser.py", line 133, in load 
    spaces = r.match(line).group() 
TypeError: expected string or buffer 
""" 
+ (factorial[1]==1) 
(factorial[N] == F) <= (N > 1) & (F == N*factorial[N-1]) 
""" 

Process finished with exit code 1 

감사합니다!

답변

0

pyDatalog.load() API와 인라인 API를 함께 사용하지 마십시오. 여기

(페이지의 하단에있는) Dynamic Datalog statements 당신이 당신의 프로그램을 작성할 수있는 방법입니다 참조 : sample_datalog_program.dl에서

from pyDatalog import pyDatalog 

def run_program(): 

    file_in = open("sample_datalog_program.dl", 'r') 
    mc = file_in.read() 
    print mc 
    pyDatalog.load(mc) 
    file_in.close() 
    print(pyDatalog.ask('factorial[3]==N')) 

if __name__ == "__main__": 
    run_program() 

코드는 (삼중 따옴표없이)해야한다 :

+ (factorial[1]==1) 
(factorial[N] == F) <= (N > 1) & (F == N*factorial[N-1]) 
+0

감사합니다. 그러나 불행하게도하지 않습니다 매우 work.from pyDatalog 수입 pyDatalog 데프 run_program() : pyDatalog.assert_fact ('부모', '빌', '존 아담스 (John Adams)') file_in = 개방 ("ancestor_datalog_program.dl ','R ' (X, Y) <= 부모 (X, Y) <0123> Y) # "" " MC = file_in.read() 인쇄 MC pyDatalog.load (MC) file_in.close() 인쇄 (pyDatalog.ask ('부모 (법안, X)')) if __name__ == "__mai n__ ": run_program() – Andres

+0

ancestor_datalog_program.dl에서 코드 주위에 트리플 따옴표가 필요하지 않습니다. – user474491

+0

위 코드를 테스트했습니다. ask() 호출에서 "=="이 필요했습니다 ("="). – user474491