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!
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
vous n'avez pas besoin des guillemets autour de votre code dans ancestor_datalog_program.dl – user474491
J'ai maintenant testé mon code ci-dessus. Il fallait "==" dans l'appel ask() (était "="). – user474491