防止Alloy中的算术溢出
在Alloy分析中,算术溢出是一个常见的问题。为了解决这个问题,我们需要调整量化器的语义,以避免出现未定义的量化结果。下面我们将详细介绍如何实现这一目标。
1. 背景与动机
在Alloy中,部分函数应用可能会导致超出定义域的情况,这并非源于被建模系统的内在属性,而是分析的局限性所致。当出现越界应用时,传统做法是给出反例,但在我们的场景中,这些反例并不代表模型本身有问题,因此我们希望屏蔽它们。
2. 解决方案概述
我们采用标准的三值逻辑,其中涉及越界算术应用的基本公式被赋予“未定义”( ⊥ )的逻辑值,并且未定义性会通过逻辑连接词按预期方式传播。同时,量化器的语义与标准处理方式不同,量化公式的含义被调整为,绑定变量仅在能使主体计算为真或假的值范围内取值,从而屏蔽会导致未定义量化的绑定,确保量化公式永远不会未定义。
3. 语义层次
我们定义了两个语义层次:
- 用户级语义 :用户需要理解的高层次语义,关键思想是改变量化器的语义,将量化域限制为量化器主体有定义的值。
- 量化公式定义:
- 〈all x: Int | p(x)〉 = ∀x ∈ Int • def〈p(x)〉 ⇒ p(x)
- 〈some x: Int | p(x)〉 = ∃x ∈ Int • def〈p(x)〉 ∧ p(x)
- 整数表达式未定义条件:如果任何参数未定义或计算结果溢出,则整数表达式未定义。
- def〈α(i1
超级会员免费看
订阅专栏 解锁全文
19

被折叠的 条评论
为什么被折叠?



