下面的模型表示二进制搜索算法模型的一部分。
二进制搜索算法的关键步骤之一是计算low
和high
之间的中间值。通过将low
添加到high
然后除以2来计算。
因此,我的模型的字段low
类型为Int
,high
类型为Int
,mid
类型为Int
。
运行模型时,Int的默认大小是4位有符号整数,其值范围介于-8和+7之间。如果low
的值为6且high
的值为6,则6 + 6 = 12,这太大而且总和溢出到-4。除以2得到-2而mid
有一个负值......哎哟!
我想断言mid
总是积极的。但是,如上所述,如果Int未设置为足够大的大小,则可能为负。有没有办法动态设置Int的大小?
我希望我的断言说出这样的话:
for some size of Int
mid_is_low_plus_high_div_2 =>
Test.mid >= 0
有没有办法表达出来?
one sig Test {
low: Int,
high: Int,
mid: Int
} {
low in {i: Int | i >= 0 }
high in {i: Int | i >= 0 }
}
pred mid_is_low_plus_high_div_2 {
Test.mid = div[plus[Test.low, Test.high], 2]
}
assert mid_is_always_positive {
mid_is_low_plus_high_div_2 =>
Test.mid >= 0
}
check mid_is_always_positive