Alloy 未找到简单列表示例的实例

Alloy 未找到简单列表示例的实例,alloy,Alloy,我在研究Alloy,我试图指定一个通用的简单数组列表。我的规范基于Alloy的书和在线教程的第一个示例。我只是通过测试它的基本特性来探索这门语言,我想做的很简单,但不起作用,我不知道为什么,因为它与示例非常相似。这是我的说明: module FileSystem/Lists[A] open util/ordering[List] sig List { content: Int ->one A, size: Int }{ size = #content al

我在研究Alloy,我试图指定一个通用的简单数组列表。我的规范基于Alloy的书和在线教程的第一个示例。我只是通过测试它的基本特性来探索这门语言,我想做的很简单,但不起作用,我不知道为什么,因为它与示例非常相似。这是我的说明:

module FileSystem/Lists[A]
open util/ordering[List]

sig List {
    content: Int ->one A,
    size: Int
}{
    size = #content
    all i : Int, e : A | i -> e in content => i >= 0
    all i : Int | i in content.univ =>  i >= 0 and i < size
}

pred init [l: List]  { (no l.content) && l.size = 0}

fact traces {
    init[first]
    all l: List-last |
      let l' = l.next |
        some e: A |
          add [l, l', e]
}

pred add [l, l': List, e: A] {
    l'.content = l.content + (l.size -> e)      
    l'.size = l.size + 1
}
run add for 3 but 2 List

assert listSize {
    all l: List - last, l': l.next, e: A |
        add[l,l',e] => l'.size = (l.size + 1) and
        e in univ.(l'.content)
}
check listSize for 10
模块文件系统/列表[A]
打开util/ordering[列表]
信号列表{
内容:Int->one A,
大小:Int
}{
大小=#内容
内容中的所有i:Int,e:A | i->e=>i>=0
所有i:Int | i in content.univ=>i>=0和ie)
l'.尺寸=l.尺寸+1
}
为3但2列表运行add
断言列表大小{
所有l:List-last,l:l.next,e:A|
添加[l,l',e]=>l'.size=(l.size+1)和
大学英语(l.内容)
}
检查列表大小是否为10

当我执行runadd时,Alloy分析器说:找不到实例。加上我的观点可能不一致。但当我运行checklistsize时,它没有找到任何反例,这表明listSize是有效的。有人知道为什么Alloy Analyzer找不到add的一个实例吗?我尝试更改元素的数量,但不起作用。我认为这个模块非常简单,但我真的不知道为什么我会有这样的问题

我注意到一件事。您的内容声明

content: Int ->one A,
表示映射了每个int,然后添加一个约束,表示只映射了一些int

all i : Int, e : A | i -> e in content => i >= 0
这是不一致的

更一般的一点是:尽可能不使用整数作为索引,创建具有关系的结构(即图形)。因为Alloy是有界的,所以整数是非常微妙的。

p.S.:我知道存在seq类型,但我正在尝试指定我自己的序列。