合金 - 这个/ Univ的范围,订购,"打开"声明

时间:2016-05-27 09:09:18

标签: alloy

我在以下类型的Alloy(4.2)规格中有错误:

You must specify a scope for sig "this/Univ"

这个问题很容易通过玩具示例重现:

open util/ordering[State]
open util/integer

sig State { value : Int }

fact {
  first.value = 0
  all s:State, s': s.next | s'.value = plus[s.value, 1]
}

run { } for 5 State, 3 Int

以上所有都很好。现在,当我在外部文件中定义State并使用open语句导入它时,我得到了" Univ范围"错误:

open util/ordering[State]
open util/integer
open State

fact {
  first.value = 0
  all s:State, s': s.next | s'.value = plus[s.value, 1]
}

run { } for 5 State, 3 Int

我尝试了以上几种变体而没有成功。 为什么会发生这种情况,如何解决? 在我的项目中,对我来说,在不同的文件中定义订购模块的目标sig会很有用。

谢谢, 爱德华

1 个答案:

答案 0 :(得分:2)

这是一个Alloy“设计bug”。 决定在模块中没有定义签名时出现Univ签名,以便通过内置关系检查某些属性(例如,unit,iden,none)。

你有很多方法可以解决这个问题,这是一个选择:

  • 您可以在运行命令的末尾添加“,0 Univ
  • 您可以在Alloy模块中添加签名
  • 您可以指定全局范围为零(run { } for 0 but 5 State, 3 Int

有关其他信息,请参阅this question