使用函数在z3中创建列表
我试图将这段伪代码转换为SMT-LIB语言,但我被卡住了使用函数在z3中创建列表,z3,smt,Z3,Smt,我试图将这段伪代码转换为SMT-LIB语言,但我被卡住了 List function my_fun(int x) { list = nil for(i in 1 to x): if(some_condition_on_i) list.concat(i) return list } 到目前为止,我所做的是: (declare-const l1 (List Int)) (define-fun my_fun ((x Int)) (Lis
List function my_fun(int x)
{
list = nil
for(i in 1 to x):
if(some_condition_on_i)
list.concat(i)
return list
}
到目前为止,我所做的是:
(declare-const l1 (List Int))
(define-fun my_fun ((x Int)) (List Int)
(forall ((t Int))
(ite (and (some_condition_on_t) (< t x)) (insert t l1) l1 )
)
)
)
(声明常量l1(列表Int))
(定义乐趣我的乐趣((x Int))(列表Int)
(对于所有((t Int))
(ite(和(t上的某些条件)(
我知道这是错误的,而且不起作用。你能帮我理解我该怎么做吗?SMT-LIB模型逻辑,其中变量总是不可变的;另一方面,您的代码似乎是强制性的,即
list
和i
等变量是可变的。这一关键性差异将是编码程序的最大挑战,而对命令式程序进行推理的挑战已经引发了研究工具,如,或
以下是几点建议:
表示通过将(insert t l1)
插入t
获得的新列表。它不会修改l1
(由于l1是逻辑变量,因此无法修改)l1
- 逻辑forall是一个布尔公式(其计算结果为true或false),它不是您可以执行的语句(例如,它的副作用)
- 如果
的值是静态已知的(即x
),则可以展开循环(此处为伪代码):5
- 如果
的值不是静态已知的,那么您很可能需要一个循环不变量,或者使用固定点来解释未知的循环迭代次数x
list
和i
等变量是可变的。这一关键性差异将是编码程序的最大挑战,而对命令式程序进行推理的挑战已经引发了研究工具,如,或
以下是几点建议:
表示通过将(insert t l1)
插入t
获得的新列表。它不会修改l1
(由于l1是逻辑变量,因此无法修改)l1
- 逻辑forall是一个布尔公式(其计算结果为true或false),它不是您可以执行的语句(例如,它的副作用)
- 如果
的值是静态已知的(即x
),则可以展开循环(此处为伪代码):5
- 如果
的值不是静态已知的,那么您很可能需要一个循环不变量,或者使用固定点来解释未知的循环迭代次数x
l0 := Nil
l1 := ite(condition(1), insert(1, l0), l0)
l2 := ite(condition(2), insert(2, l1), l1)
...
l4 := ite(condition(4), insert(4, l3), l3)