【发布时间】:2020-03-18 19:23:22
【问题描述】:
一些背景知识:我的项目是制作一个从类 c 语言编译为 Alloy 的编译器。具有类似 c 语法的输入语言必须支持 contracts。目前,我正在尝试实现支持 pre 和 post condition 语句的 if 语句,类似于以下内容:
int x=2
if_preCondition(x>0)
if(x == 2){
x = x + 1
}
if_postCondtion(x>0)
问题是我对合金的结果有点困惑。
sig Number{
arg1: Int,
}
fun addOneConditional (x : Int) : Number{
{ v : Number |
v.arg1 = ((x = 2 ) => x.add[1] else x)
}
}
assert conditionalSome {
all n: Number| (n.arg1 = 2 ) => (some field: addOneConditional[n.arg1] | { field.arg1 = n.arg1.add[1] })
}
assert conditionalAll {
all n: Number| (n.arg1 = 2 ) => (all field: addOneConditional[n.arg1] | { field.arg1 = n.arg1.add[1] })
}
check conditionalSome
check conditionalAll
在上面的例子中,conditionalAll 不会生成任何Counterexample。但是,conditionalSome会生成Counterexamples。如果我正确理解 all 和 some 量词,那么就有错误了。因为从数学逻辑我们有 Ɐx expr(x) => ∃x expr(x) (即如果表达式 expr(x) 对所有值都为真x 那么存在一个 x 且 expr(x) 为真)
【问题讨论】:
-
我失去了你在这里尝试做的事情,即使在编辑了你的问题之后,因为缺少任何格式很难阅读。你能把问题降到最低吗? IE。你有问题,它有助于减少到绝对最小值。一个提示,不要使用 Int。在学习合金时,您需要避免使用 Int 的一些重大障碍。尝试创建一个小问题来显示您的问题,而无需恢复为 Int。
-
感谢您的时间。我编辑了这个问题,希望它会更好。