合金阵列模型

时间:2018-09-23 04:59:02

标签: testing modeling alloy

我刚刚开始学习Alloy模型语言,并试图在Alloy中编写自己的数组模型。但是,我无法从关系中提取索引。这是我的信号和事实:

sig Element {}

one sig Array {
  // Map index to element
  IdxEle: Int -> Element,
  // Length of the array.
  length: Int
}

fact Index {
    all r : IdxEle | r.Int >= 0 and r.Int < length
}

我遇到的错误是

This must be an integer expression.
Instead, it has the following possible type(s):
{none->none}

我查看了参考指南,但是找不到提取关系的idx字段的方法。有人可以帮我吗? 谢谢

1 个答案:

答案 0 :(得分:0)

首先,模型中的r类型为Array->Int->Element,因此无法计算(Array->Int->Element).Int,因为元组中的最后一列的类型为Element,而不是您期望的Int类型。 (当您加入Alloy时,左侧的最后一列必须与右侧的第一列相同。)

第二,有更简单,更灵活和更具可读性的方式来表达您想要的内容:

sig Element {}

let range[start,end] = {  i : Int | i >= start and i < end }

one sig Array { index : Int -> Element } {
    index.Element = range[ 0, len[this] ]
}

fun len[ array : Array ] : Int { # array.index }

第三...为您提供了一个内置类型,称为seq。它拥有您想要的一切,还有更多。

相关问题