2013-02-06 35 views
1

我想使用pyDatalog.load()方法加載一個小型的pyDatalog程序。例如,我加載從https://sites.google.com/site/pydatalog/將一個文件中的數據記錄程序加載到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包含以下內容:

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

我在做什麼錯?當我用接下來的4條註釋行替換pyDatalog.load(mc)這行時,它工作正常。

我得到的錯誤是:

/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(在頁面底部)

這裏是你如何可以寫你的程序:

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

在sample_datalog_program.dl的代碼應該是(不含三引號):

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

感謝。不幸的是,這並不完全work.from pyDatalog import pyDatalog def run_program(): pyDatalog.assert_fact('parent','bill','John Adams') file_in = open(「ancestor_datalog_program.dl」,'r' (X,Y)<=父(X,Y) # 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

相關問題