Использование логических операторов в 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)

Это работает.

Другие вопросы по тегам