2013-02-06 5 views
1

J'essaie d'utiliser la méthode pyDatalog.load() pour charger un petit programme pyDatalog. Par exemple, je suis le chargement de l'échantillon factoriel de https://sites.google.com/site/pydatalog/Chargement d'un programme datalog dans un fichier dans 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() 

le fichier sample_datalog_program.dl contient les éléments suivants:

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

Qu'est-ce que je fais mal? Lorsque je remplace la ligne pyDatalog.load (mc) par les 4 lignes commentées suivantes cela fonctionne très bien.

L'erreur que je reçois est:

/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 

Merci!

Répondre

0

Vous ne devez pas mélanger l'API pyDatalog.load() et l'API en ligne. Voir Dynamic Datalog statements (en bas de page)

Voici comment vous pouvez écrire votre programme:

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

Le code sample_datalog_program.dl devrait être (sans les guillemets triples):

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

Merci. Malheureusement, cela ne fonctionne pas tout à fait work.from pyDatalog importation pyDatalog def run_program(): pyDatalog.assert_fact ('parent', 'projet', 'John Adams') file_in = open ("ancestor_datalog_program.dl", 'r' # ancestor_datalog_program.dl contient: # "" " #ancestor (X, Y) <= parent (X, Y) # ancêtre (X, Y) <= parent (X, Z) & ancêtre (Z, Y) # "" » mc = file_in.read() print mc pyDatalog.load (mc) file_in.close() impression (pyDatalog.ask ('parent (projet de loi, X)')) if __name__ == "__mai n__ ": run_program() – Andres

+0

vous n'avez pas besoin des guillemets autour de votre code dans ancestor_datalog_program.dl – user474491

+0

J'ai maintenant testé mon code ci-dessus. Il fallait "==" dans l'appel ask() (était "="). – user474491

Questions connexes