我用合金创建了一个简单版本的链表 . 现在我想创建一个链表,我可以在其中执行插入和删除 . 我刚开始用合金编码 . 目前我在使用函数和实用程序等复杂操作时遇到了麻烦 . 如果我能得到一些如何使用实用程序和函数以及如何在合金中实际执行插入和删除的示例 . 我很感激你的帮助 .
sig node{}
sig linked
{
ele:set node,
link:ele->lone ele,
head:lone ele
}{
node = ele
all x:ele | x in head.*link && head not in x.link && #x.link <=1
}
fact{
all l:linked| all e:l.ele| e->e not in l.link //no self loop
}
fact
{
all l:linked|no e : l.ele | (e in e.^(l.link )) //acyclic
}
pred a (l:linked,x:node)
{
x in l.ele
}
run a for 6 node,1 linked
2 回答
你的方法有点令人困惑,它可能会简单得多 . 我会这样做的
这个模型是静态的,为了使模型动态化,你需要了解de的概念 . 我建议你阅读Software Abstractions,由Alloy的作者撰写 . 链接列表的动态方法太复杂了,你现在无法理解,你应该做一些简单的练习 .
国家的基本思想是(根据书中的例子进行练习):
静态示例:
动态的例子,在本地状态习语中(=一种表达状态的方式,还有一个全局状态习语和一个事件习语) . 看一下谓词
您还可以查看以下slides .
您不需要创建模型"dynamic"来模拟插入和删除等操作 . 看看这个主题(doubly-linked-list-in-alloy),在那里我给出了如何为双向链表建模反向操作的答案,然后让我们知道是否't helpful enough. The basic idea you' ll看到要创建一个谓词,它接受两个前面的参数州和后州,并断言两者是如何相关的 . 例如,您的插入谓词可能看起来像