У меня есть программа с логикой, как описано в псевдокоде ниже. x
является строкой, а x[k]
вернет десятичный код символа в индексе k
. Оператор ^
возвращает десятичный результат XOR операндов.
x = input
int checksum = x[0] ^ x[1] ^ x[2]
int sum = 0
sum += x[36] ^ x[23] == 111
sum += x[23] ^ x[29] == 101
sum += x[29] ^ x[30] == 116
sum += x[30] ^ x[9] == 115
sum += x[9] ^ x[25] == 0
return sum == checksum and x[0] ^ x[29] == 100 and x[1] ^ x[30] == 200
Я хочу найти входные данные, которые возвращают эту программу true
. Если я хочу решить эту проблему в Z3Py, есть ли способ для меня это сделать? Мне нужно некоторое ограничение K из N, которое позволяет мне выражать ограничения как выражения, но я не нашел поддержки для этого.
Psedocode для того, что я хотел бы сделать с Z3:
int checksum = x[0] ^ x[1] ^ x[2]
bools = []
bools.append(Bool(x[36] ^ x[23] == 111))
bools.append(Bool(x[23] ^ x[29] == 101))
bools.append(Bool(x[29] ^ x[30] == 116))
bools.append(Bool(x[30] ^ x[9] == 115))
bools.append(Bool(x[9] ^ x[25] == 0))
state.add(bools[0])
state.add(bools[1])
state.add(bools[2])
state.add(bools[3])
state.add(bools[4])
state.add(x[0] ^ x[29] == 100)
state.add(x[1] ^ x[30] == 200)
state.add(PbEq([boolean for boolean in bools], checksum))