Вы не делаете ничего плохого. Просто метод Sum
, экспортируемый API z3py, поддерживает только битовые векторы, целые числа и вещественные числа. В частности, он не допускает значения с плавающей точкой.
Нет причин, по которым это не следует делать, и вы можете зарегистрировать это как отсутствующую функцию в их системе отслеживания ошибок: https://github.com/Z3Prover/z3/issues
(Если вы сделаете это, вы также можете упомянуть, что у функции Product
есть тот же недостаток, поэтому они могут исправить это вместе.)
Тем временем я рекомендую определить собственный метод. Примерно так:
from z3 import *
import functools
def MySum(lst):
return functools.reduce(lambda a, b: a + b, lst, 0);
l = [FP('x', Float32()), FP('y', Float32()), FP('z', Float32())]
s = Solver()
s.add(MySum(l) == 100)
s.check()
print(s.model())
Обратите внимание, что MySum
является достаточно полиморфным c: его можно использовать для типов Int
s, Real
s, Float
s, BitVec
, и все будет работать Что он не делает, конечно, проверяет, чтобы убедиться, что вы передаете действительно то, что вы можете суммировать, например, не перечисления или какой-то другой тип данных. (И по сути, именно это пытается сделать внутренний метод API: он проверяет, имеет ли смысл то, что вы передаете, суммировать, за исключением того, что они пропустили регистр для чисел с плавающей запятой.)