Обратите внимание, что у z3 много функций. Здесь вы можете использовать Sum()
для суммы списка. Внутри списка вы можете поместить простые переменные, но и выражение. Вот пример как простой, так и более сложной суммы:
from z3 import *
a, b, c = Ints('a b c')
x, y = Ints('x y')
s = Solver()
s.add(a==1, b==0, c==1)
s.add(x==Sum([a,b,c]))
s.add(y==Sum([If(a==1,-1,0),If(b==1,-1,0),If(c==1,-1,0)]))
if s.check() == sat:
print ("solution:", s.model())
else:
print ("no solution possible")
Результат: solution: [y = 2, x = 2, c = 1, b = 0, a = 1]
Если ваша проблема более сложная, использование BitVecs вместо Ints может заставить ее выполнитьнемного быстрее.
edit: вместо Sum()
вы также можете просто использовать сложение, как в
s.add (x == a + b + c) s.add (y ==If (a == 1, -1,0) + If (b == 1, -1,0) + If (c == 1, -1,0))
Sum()
имеет смыслк удобочитаемости, когда у вас более длинный список переменных или когда переменные уже есть в списке.