[英]z3py throws parser error for a valid SMT2 file
1 (set-logic UFLIA)
2 (set-info :source | Simple list theorem |)
3 (set-info :smt-lib-version 2.0)
4 (set-info :category "crafted")
5 (set-info :status unsat)
6 (declare-sort List 0)
7 (declare-sort Elem 0)
8 (declare-fun cons (Elem List) List)
9 (declare-fun nil () List)
10 (declare-fun car (List) Elem)
11 (declare-fun cdr (List) List)
12 (declare-fun len (List) Int)
13 (assert (forall ((?x Elem) (?y List)) (= (car (cons ?x ?y)) ?x)))
14 (assert (forall ((?x Elem) (?y List)) (= (cdr (cons ?x ?y)) ?y)))
15 (assert (= (len nil) 0))
16 (assert (forall ((?x Elem) (?y List)) (= (len (cons ?x ?y)) (+ (len ?y) 1))))
17 (declare-fun append (List List) List)
18 (assert (forall ((?y List)) (= (append nil ?y) ?y)))
19 (assert (forall ((?x Elem) (?y1 List) (?y2 List)) (= (append (cons ?x ?y1) ?y2) (cons ?x (append ?y1 ?y2)))))
20 (assert (not (forall ((?x Elem) (?y List)) (= (append (cons ?x nil) ?y) (cons ?x ?y)))))
21 (check-sat)
22 (exit)
對於上述公式, f = z3.parse_smt2_file("UFLIA/misc/list3.smt2")
導致以下錯誤。
(error "line 6 column 14: invalid sort declaration, sort already declared/defined")
(error "line 8 column 24: sort constructor expects parameters")
(error "line 9 column 20: sort constructor expects parameters")
(error "line 10 column 18: sort constructor expects parameters")
(error "line 11 column 18: sort constructor expects parameters")
(error "line 12 column 18: sort constructor expects parameters")
(error "line 13 column 31: sort constructor expects parameters")
(error "line 14 column 31: sort constructor expects parameters")
(error "line 15 column 16: unknown constant nil")
(error "line 16 column 31: sort constructor expects parameters")
(error "line 17 column 21: sort constructor expects parameters")
(error "line 18 column 21: sort constructor expects parameters")
(error "line 19 column 32: sort constructor expects parameters")
(error "line 20 column 36: sort constructor expects parameters")
但是,使用z3-4.3.2.bb56885147e4-x64-osx-10.9.2 CLI處理同一文件會導致結果不穩定。
在Python中使用traceback
,我發現以下內容是引發TypeError: unorderable types: int() < Z3Exception()
異常的根本原因TypeError: unorderable types: int() < Z3Exception()
基於異常堆棧,似乎錯誤源於本機Z3代碼。
知道為什么會這樣以及如何解決嗎?
您將不得不將“列表”重命名為其他名稱。 Z3從API中預加載了“列表”的內置定義。 它忽略了邏輯指令,否則該邏輯指令會縮小預加載的排序范圍。
基於@nikolaj注釋,我使用以下函數通過重命名與使用Z3 API時Z3預加載的定義沖突的標識符來轉換SMT2文件。 [除了List
,該函數還重命名了SMT-LIB公式中常用的標識符。]
import z3
import importlib
def get_formula(src_file_name):
try:
f = z3.parse_smt2_file(src_file_name)
return f
except z3.Z3Exception as e:
lines = open(src_file_name, 'rt').readlines()
tmp1 = ' '.join(lines).replace("max", "c_max")
tmp1 = tmp1.replace("sin", "c_sin")
tmp1 = tmp1.replace("cos", "c_cos")
tmp1 = tmp1.replace("tan", "c_tan")
tmp1 = tmp1.replace("tanh", "c_tanh")
tmp1 = tmp1.replace("atan", "c_atan")
tmp1 = tmp1.replace("min", "c_min")
tmp1 = tmp1.replace("max", "c_max")
tmp1 = tmp1.replace("pi", "c_pi")
tmp1 = tmp1.replace("List", "c_List")
tmp1 = tmp1.replace("subset", "c_subset")
tmp1 = tmp1.replace("difference", "c_difference")
tmp1 = tmp1.replace("union", "c_union")
tmp1 = tmp1.replace("fp", "c_fp")
tmp1 = tmp1.replace("repeat", "c_repeat")
importlib.reload(z3)
f = z3.parse_smt2_string(tmp1)
return f
使用此功能,我能夠成功解析公式,但是程序在退出時出現段錯誤 。 似乎有些參考即使重新加載z3模塊后也無法清除。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.