2017-10-23 3 views
0

Ich benutze pyDatalog (in Python 2.7). Unter Verwendung einer arithmetischen Funktion wie +, kann ich auf eine frühere gebundene Variable beziehen:Datalog: Warum wird (X == Falsch) & (Y == nicht (X)) nicht ausgewertet?

>>> (X==1) & (Y==X+1) 
[(1, 2)] 

Aber ich kann nicht die Booleschen not Betreiber die gleiche Art und Weise verwenden:

>>> not(False) 
True 
>>> (X==False) & (Y==not(X)) 
    File "<stdin>", line 1 
    (X==False) & (Y==not(X)) 
        ^
SyntaxError: invalid syntax 
>>> 
+2

'not' ist ein Schlüsselwort, * nicht * eine Funktion. Das sollte also "Y == nicht X" sein, aber das wird die Sache wahrscheinlich nicht lösen. –

+0

@WillemVanOnsem Ihr Code löst denselben Syntaxfehler aus. Leute bekommen nicht, was hier vorgeht ... – JBernardo

Antwort

-1

es ist Operatorpräzedenz in Python

(Y == (not(X)) 

oder

(Y == not X) 
+0

Das ist nicht einmal das Problem – JBernardo

+0

@JBernardo geändert – galaxyan

+0

Ihr Code gibt immer noch den gleichen Syntaxfehler. – JBernardo

1

Sie können einen benutzerdefinierten Resolver verwenden:

from pyDatalog import pyDatalog 

@pyDatalog.predicate() 
def not_2(X,Y): 
    if X.is_const(): 
     yield (X.id, not(X.id)) 
    elif Y.is_const(): 
     yield (not(Y.id), Y.id) 

@pyDatalog.program() 
def _(): 
    print ((X==False) & (not_(X,Y))) 
+0

Welche schwarze Magie ist das? Sie definieren 'not_2', dann rufen Sie' not' auf. Der Code läuft, aber wenn ich dann versuche, '(X == Falsch) & (nicht_2 (X, Y)) 'selbst in der REPL auszuwerten, bekomme ich' Name' nicht 'ist nicht definiert'. Wenn ich stattdessen 'not_2' benutze, bekomme ich ein' AttributeError: 'generator'-Objekt hat kein Attribut' literals''. Lesen Sie den Code, es sieht nur aus, wie es funktionieren sollte, wenn X oder Y eine Konstante ist. Um das zu testen, habe ich versucht, die letzte Zeile durch 'print ((X == Falsch) & (nicht_ (X, Y)) & (nicht_ (Y, Z))) 'zu ersetzen. Aber das druckt genau die gleiche Ausgabe, als würde es Z ignorieren. –

+0

Ich verwende ein benutzerdefiniertes Prädikat Resolver für not_. Siehe Erweiterte Themen auf der pyDatalog-Site. – user474491

Verwandte Themen