[英]Use of non-ascii strings in defining z3 variablels and types
我在z3py
中定義z3
變量和類型,例如X=Int('X')
或X=EnumSort('X',['Y',...])
以防X,Y,...
ascii 字符串,在我的例子中是日語。
我的系統是MacOs 10.15.7
Python3.7.6
的 Python3.7.6 和z3py 4.8.7.0
4.8.7.0 。 系統的反應是,
File "/usr/local/lib/python3.7/site-packages/z3/z3core.py", line 1588, in Z3_mk_string_symbol
r = _elems.f(a0, _str_to_bytes(a1))
ctypes.ArgumentError: argument 2: <class 'TypeError'>: wrong type
我該如何解決這個問題? 對於可變情況,我發現了一個技巧X=Int('X'.encode())
,盡管這對EnumSort
。
以下似乎有效,但您可能必須在終端上設置適當的編碼設置才能正確打印字符。
(另外,如果這些字符有不恰當的含義,請提前道歉,不幸的是我不會說中文。我只是從互聯網上復制的。)
# coding=utf-8
from z3 import *
E, _ = EnumSort('的', ['是', '不'])
s = Solver()
a = Const('X', E)
b = Const('Y', E)
s.add(a != b)
if s.check() == sat:
m = s.model()
for i in [a, b]:
print(repr(m[i]))
我有一個類似的問題: 'utf-8' codec can't decode byte 0xe9 in position 2: invalid continuation byte
。
z3core.py(第 69 行)中的以下代碼對我來說非常可疑:
def _str_to_bytes(s):
if isinstance(s, str):
try:
return s.encode('latin-1')
except:
# kick the bucket down the road. :-J
return s
else:
return s
也許它是python2的遺留物。 如果我將latin-1
更改為utf-8
,它似乎可以工作......但這更像是一個黑客而不是一個好的解決方案。 也許我們需要提交一個補丁。 我在 Z3 github 存儲庫上提出了一個問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.