alloy - 合金中的建模状态:所有关系的语法相同,但以下除外
问题描述
在建模状态下,我发现自己经常处于相同的情况。
国家签名中包含一些(更多)关系。在特定的过渡中,我实际上想说的是:“前状态中的所有内容都与后状态相同,除了以下内容”
pred SampleTransition (s, s': State, f: Foo) {
s = s' but
s'.foos = s.foos - f
}
这样的事情存在吗?
解决方案
Alloy 书讨论了各种选项——在索引中查找“框架条件”。
人们经常在事件范式中定义一个不变的谓词,这使得规范更具可读性:
pred Event.unchanged (field: univ -> Time) {
field.(this.pre) = field.(this.post)
}
您还可以像这样定义谓词
pred modifies (es: set Event, field: univ -> Time) {
all e: Event - es | field.(e.pre) = field.(e.post)
}
并在像这样的 Reiter 风格的框架条件下使用它(来自 book's hotel locking example):
sig Room {
key: Key one -> Time,
prev: Key lone -> Time,
occ: Guest -> Time
}
{
Checkin.modifies [prev]
(Checkin + Checkout).modifies [occ]
RecodeEnter.modifies [key]
}
有一次,我们尝试了一种元功能,允许您定义这样的谓词
pred Event.modifies (fs: set field$) {
all f: field$ - fs | f.value.(this.pre) = f.value.(this.post)
}
但并没有多少热情。
推荐阅读
- c++ - 链接库 .a 和库 .lib
- c# - Authorize 和 AllowAnonymous 元数据在应用于控制器时给出不同的行为
- amazon-web-services - 如何使用 AWS Cloudformer 为现有 API Gateway 创建云形成模板?
- mongodb - 如何从数组中获取从索引到末尾的元素
- etl - 简单的“读取文件 > 创建哈希文件作业”中的 mkdbfile 问题
- android - 如何获取不同波特率的事件?
- php - 如何使用 dompdf 或任何其他库生成 pdf,其中 html 和 php 一起编写?
- angular - onClick mat-select 加载数据使屏幕空白
- azure-active-directory - Azure 总线与基于 GO 的应用程序集成
- javascript - 如何将javascript变量传递到另一个地方?