Python 如何在z3py中将Int向量转换为Int

Python 如何在z3py中将Int向量转换为Int,python,z3,smt,z3py,Python,Z3,Smt,Z3py,我正在使用z3py,我有一个大小为3的IntVector。我需要将IntVector中的每个数字解析为一个整数。也就是说,如果我有一个IntVector,它有如下约束: myIntVector = IntVector('iv', 3) s = Solver() s.add(iv[0] == 5) s.add(iv[1] == 2) s.add(iv[2] == 6) …. 我需要能够在z3中将数字526作为Int排序进行操作,因为我需要添加适用于IntVector(数字)的每个单独成员的约束和

我正在使用z3py,我有一个大小为3的
IntVector
。我需要将
IntVector
中的每个数字解析为一个整数。也就是说,如果我有一个
IntVector
,它有如下约束:

myIntVector = IntVector('iv', 3)
s = Solver()
s.add(iv[0] == 5)
s.add(iv[1] == 2)
s.add(iv[2] == 6)
….
我需要能够在z3中将数字526作为
Int
排序进行操作,因为我需要添加适用于
IntVector
(数字)的每个单独成员的约束和适用于整数的约束,在本例中为526。我不能这样做:

s.add(iv[0]/iv==55)


因为这是两种不同的类型
iv[0]
是一个
Int
,而
iv
是一个
IntVector

,这里有一个例子,它将IntVector的概念用作独立的数字和由这些数字组成的数字。 它解决了传统的谜题,将“发送+更多=金钱”的每个字母替换为不同的数字

from z3 import *

# trying to find different digits for each letter for SEND+MORE=MONEY
letters = 'SENDMOREMONEY'
iv = IntVector('iv', len(letters))
send = Int('send')
more = Int('more')
money = Int('money')

s = Solver()

# all letters to be replaced by digits 0..9
s.add([And(i >= 0, i <= 9) for i in iv])

# the first digit of a number can not be 0
s.add(And(iv[0] > 0, iv[4] > 0, iv[8] > 0))

# distinct letters need distinct digits
s.add(Distinct([i for k, i in enumerate(iv) if letters[k] not in letters[:k]]))

# "send" is the number formed by the first 4 digits, "more" the 4 next, "money" the last
s.add(send == Sum([10**(3-k)*i for k,i in enumerate(iv[:4])]))
s.add(more == Sum([10**(3-k)*i for k,i in enumerate(iv[4:8])]))
s.add(money == Sum([10**(4-k)*i for k,i in enumerate(iv[8:])]))

# the numbers for "send" and "more" sum together to "money"
s.add(send + more == money)

if s.check() == sat:
    m = s.model()

    # list each digit of iv
    print([m[i].as_long() for i in iv])

    # show the sum as "send" + "more" = "money"
    print("{} + {} = {}".format(m[send].as_long(), m[more].as_long(), m[money].as_long()))
从z3导入*
#尝试为发送+更多=金钱的每个字母找到不同的数字
字母='SENDMOREMONEY'
iv=IntVector('iv',len(字母))
send=Int('send')
more=Int('more')
money=Int(‘money’)
s=解算器()
#将所有字母替换为数字0..9
s、 加上([和(i>=0,i0,iv[4]>0,iv[8]>0))
#不同的字母需要不同的数字
s、 添加(不同([i代表k,i在枚举(iv)中,如果字母[k]不是字母[:k]]))
#“send”是由前4位数字组成的数字,“more”是第4位数字,money是最后一位数字
s、 加法(send==和([10**(3-k)*i代表k,i在枚举(iv[:4]))
s、 加法(more==和([10**(3-k)*i代表k,i在枚举中(iv[4:8]))
s、 加法(money==总和([10**(4-k)*i代表k,i在枚举中(iv[8:]))
#“发送”和“更多”的数字加起来就是“钱”
s、 添加(发送+更多==金钱)
如果s.check()==sat:
m=s.模型()
#列出iv的每个数字
打印([m[i]。作为i在iv中的_long())
#将总和显示为“发送”+“更多”=“货币”
打印(“{}+{}={}.”格式(m[send].as_long(),m[more].as_long(),m[money].as_long())

下面是一个例子,它将IntVector的概念用作独立的数字以及由这些数字组成的数字。 它解决了传统的谜题,将“发送+更多=金钱”的每个字母替换为不同的数字

from z3 import *

# trying to find different digits for each letter for SEND+MORE=MONEY
letters = 'SENDMOREMONEY'
iv = IntVector('iv', len(letters))
send = Int('send')
more = Int('more')
money = Int('money')

s = Solver()

# all letters to be replaced by digits 0..9
s.add([And(i >= 0, i <= 9) for i in iv])

# the first digit of a number can not be 0
s.add(And(iv[0] > 0, iv[4] > 0, iv[8] > 0))

# distinct letters need distinct digits
s.add(Distinct([i for k, i in enumerate(iv) if letters[k] not in letters[:k]]))

# "send" is the number formed by the first 4 digits, "more" the 4 next, "money" the last
s.add(send == Sum([10**(3-k)*i for k,i in enumerate(iv[:4])]))
s.add(more == Sum([10**(3-k)*i for k,i in enumerate(iv[4:8])]))
s.add(money == Sum([10**(4-k)*i for k,i in enumerate(iv[8:])]))

# the numbers for "send" and "more" sum together to "money"
s.add(send + more == money)

if s.check() == sat:
    m = s.model()

    # list each digit of iv
    print([m[i].as_long() for i in iv])

    # show the sum as "send" + "more" = "money"
    print("{} + {} = {}".format(m[send].as_long(), m[more].as_long(), m[money].as_long()))
从z3导入*
#尝试为发送+更多=金钱的每个字母找到不同的数字
字母='SENDMOREMONEY'
iv=IntVector('iv',len(字母))
send=Int('send')
more=Int('more')
money=Int(‘money’)
s=解算器()
#将所有字母替换为数字0..9
s、 加上([和(i>=0,i0,iv[4]>0,iv[8]>0))
#不同的字母需要不同的数字
s、 添加(不同([i代表k,i在枚举(iv)中,如果字母[k]不是字母[:k]]))
#“send”是由前4位数字组成的数字,“more”是第4位数字,money是最后一位数字
s、 加法(send==和([10**(3-k)*i代表k,i在枚举(iv[:4]))
s、 加法(more==和([10**(3-k)*i代表k,i在枚举中(iv[4:8]))
s、 加法(money==总和([10**(4-k)*i代表k,i在枚举中(iv[8:]))
#“发送”和“更多”的数字加起来就是“钱”
s、 添加(发送+更多==金钱)
如果s.check()==sat:
m=s.模型()
#列出iv的每个数字
打印([m[i]。作为i在iv中的_long())
#将总和显示为“发送”+“更多”=“货币”
打印(“{}+{}={}.”格式(m[send].as_long(),m[more].as_long(),m[money].as_long())

100*iv[0]+10*iv[1]+iv[2]有什么问题?我想到了这个想法,但我不确定是否有更惯用的转换。我想我也可以用python编写一个扩展函数来处理这个问题。
100*iv[0]+10*iv[1]+iv[2]有什么问题
?我想到了这个想法,但我不确定是否有更惯用的转换。我想我可以用python编写一个扩展函数来处理这个问题。这个答案有用吗?这个答案有用吗?