簡體   English   中英

在定義 z3 變量和類型時使用非 ascii 字符串

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM