合金新手在这里。
我真的很喜欢在 Alloy 中创建约束并让分析器根据约束检查模型是否有效。
但我问自己,“这些约束定义仅仅是心理体操,还是有助于构建更好的软件?”</p>
让我们举一个具体的例子。在电子邮件客户端地址簿的模型中,可以定义此约束以将新条目添加到地址簿中:
新书 b' 中的地址映射与旧书 b 中的地址映射相同,但增加了从名称到地址的链接。该约束在合金中表示为: b'.addr = b.addr + n->a
那个好漂亮。
但是当在代码中实现添加操作时,我很难看到它的相关性。例如,我在 Common Lisp 中实现了add操作:
(defun add (b n a)
"Add a new entry, (n a), to address book b"
(adjoin (list n a) b :key #'first))
用文字来说:“这是一个名为add的函数的定义,它具有三个参数:b、n和a(书、姓名、地址)。使用 Common Lisp 集合函数adjoin将列表 ( na ) 添加到b。”</p>
该函数似乎正确地实现了一个简单的添加函数。我如何处理我在 Alloy 中定义的约束?我应该编写额外的代码来表达约束吗?在伪代码中:[1]
(defun add (b n a)
"Add a new entry, (n a), to address book b"
(adjoin (list n a) b :key #'first)
Check that nothing has changed in the
address book except that it now has
a n->a mapping)
编写这样的代码似乎需要做很多工作,而且没有明显的好处。
所以我的问题是:在代码中实现合金模型时,我应该如何处理合金中定义的约束?
此外,是否有描述如何将合金模型转换为代码的教程,包括如何在代码中使用合金约束定义的描述?
谢谢你。
[1] 注意:我意识到 Common Lisp 中有一个名为 Screamer 的语言扩展,用于约束编程