Использование логических операторов в pyDatalog
Я попытался создать предикат в pyDatalog, используя ==
оператор, но определение легковоспламеняющихся [X] представляется недействительным:
from pyDatalog import pyDatalog
pyDatalog.create_terms('flammable, notFlammable, X, Y')
flammable[X] = ((X == 'wood') or (X == 'coal'))`
#TypeError: unhashable type: 'Query'
notFlammable[X] = ~flammable[X]
#This doesn't work either.
Я также попытался включить операторы сравнения в предикат pyDataLog, но это тоже не сработало:
threeOrFour[X] = ((X < 3) or (X > 4))
#pyDatalog.util.DatalogError: Error: left hand side of comparison must be bound: </2 in line None of None
Можно ли включить эти операторы сравнения и отрицания в предикаты pyDatalog?
1 ответ
Проблема здесь в том, что вы хотите назначать предикаты (легковоспламеняющиеся и не воспламеняющиеся), но вы используете синтаксис назначения функций. ( Вот полезная ссылка, которую я нашел, чтобы понять различие между предикатами и функциями.) Способ назначения предикатов в pyDatalog заключается в использовании аргументов в скобках и назначении с помощью <=
вот так:
from pyDatalog import pyDatalog
pyDatalog.create_terms('flammable, notFlammable, X, Y')
flammable(X) <= ((X == 'wood') or (X == 'coal'))
notFlammable(X) <= ~flammable(X)
Тогда для вашего второго примера, это обычное явление в логическом программировании, разбивающее дизъюнкции на несколько строк:
from pyDatalog import pyDatalog
pyDatalog.create_terms('threeOrFour,X')
threeOrFour(X) <= (X < 3)
threeOrFour(X) <= (X > 4)
Это работает.