【发布时间】:2012-06-13 05:32:35
【问题描述】:
我有一个小型 Scala 程序,可以将 Scala^Z3 DSL 表达式转换为 Latex 以便于阅读。但我看不到如何使用 DSL 声明未解释的函数。有很多方法可以使用其他构造来破解函数的行为,并且很容易打印被破解的函数,因此它看起来像乳胶中的普通函数。但我宁愿只声明一个未解释的函数,如果可以的话。
【问题讨论】:
我有一个小型 Scala 程序,可以将 Scala^Z3 DSL 表达式转换为 Latex 以便于阅读。但我看不到如何使用 DSL 声明未解释的函数。有很多方法可以使用其他构造来破解函数的行为,并且很容易打印被破解的函数,因此它看起来像乳胶中的普通函数。但我宁愿只声明一个未解释的函数,如果可以的话。
【问题讨论】:
解决未解释函数的一种方法是在 Val[_] 类型构造函数中使用 Scala 函数类型。例如:
import z3.scala._
import z3.scala.dsl._
choose(
(x : Val[Int], f : Val[Int=>Int]) => x < f(x)
)
> res0: (Int, Int=>Int) = (0,<function1>)
然后该函数由实际的 Scala 函数建模:
val f = res0._2
f(0)
> 1
【讨论】:
new Eq(function, new IntConstant(3))。除此之外的任何东西都是 scala 和/或 Z3 的一个黑暗而神秘的区域......感谢您的帮助。
ValHandler的定义吗?它定义了一个类型需要的“支持类”,以便在 DSL 中与find、findAll 等一起使用。这是“类型类”概念的一个示例。