How do constraints defined in Alloy result in better software?
合金新手。
我真的很喜欢在Alloy中创建约束并让分析器根据约束检查模型是否有效。
但是我问自己:"这些约束定义仅仅是心理体操,还是它们将有助于构建更好的软件?"
让我们举一个具体的例子。在电子邮件客户地址簿的模型中,可以定义此约束,以便在地址簿中添加新条目:
The address mapping in the new book b’ is equal to the address
mapping in the old book b, with the addition of a link from the
name to the address. This constraint is expressed in Alloy as:
b'.addr = b.addr + n->a
那太漂亮了。
但是当在代码中执行添加操作时,我很难看到它的相关性。例如,我在Common Lisp中实现了添加操作:
1 2 3 | (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将列表(n a)添加到b。"
该功能似乎正确实现了一个简单的添加功能。
如何处理我在Alloy中定义的约束?我是否应该编写其他代码来表达约束?用伪代码:[1]
1 2 3 4 5 6 | (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) |
编写这样的代码似乎需要很多工作,没有明显的好处。
所以我的问题是这样的:在代码中实现Alloy模型时,应如何处理Alloy中定义的约束?
此外,是否有一个教程描述如何将Alloy模型转换为代码,包括如何在代码中使用Alloy约束定义的描述?
谢谢。
[1]注意:我意识到在Common Lisp中有一个名为Screamer的语言扩展用于约束编程。
我相信这个问题源于对诸如Alloy之类的某些建模语言的目标和功能的轻微误解,并涉及了形式化方法,验证和软件建模的一些基本方面。可能有很好的资源来使背景故事变得更清晰,其中包括诸如《微积分》之类的书以及您提到的有关Alloy的书。
约束是Alloy建模语言的一等公民。这个想法是约束反映了人们想要建模(并检查属性)的代码的语义。因此,从一个angular来看,Alloy程序代表代码本身,不需要编写其他代码(例如,使用功能语言)或将声明的约束与代码混合。但是,Alloy程序不能直接执行。相反,它们只能用于根据此类程序(即约束集)生成模型。
更具体地说,在适当的解释下,Alloy约束
如前所述,Alloy本身无法生成可执行代码(例如,您使用Common Lisp编写的代码)。但是,有多种方法使用Alloy和Alloy生成的模型来生成代码或测试用例的片段。 (同样,根据手头的具体程序。)此外,可以使用称为Alloy * [2]的Alloy扩展来生成解决Alloy中更高阶约束(对关系的量化)的可能性;执行操作并接受不同输入的实际代码(根据模型,类似于add函数)。同样,此类程序用Alloy模型表示,并且需要(执行额外的工作)以某种所需的编程语言将这些模型转换为程序。
话虽如此,请注意,某些(验证)系统确实允许您将规范与代码混合,其中规范可能是:以与要执行的代码相同的方式编写(例如在验证/综合框架Leon中) [3]);或以不同的语言(与可执行代码的语言)编写,而规范则通过其他某种方式绑定到代码(例如,Dafny [4]中的注释)。
[1]姜恩淑等。"水处理系统的基于模型的安全性分析。"第二届智能网络物理系统软件工程国际研讨会论文集。 ACM,2016年。
[2] Milicevic,Aleksandar等。"合金*:通用的高阶关系约束求解器。"第37届软件工程国际会议论文集(第1卷),IEEE出版社,2015年。
[3] Blanc,Régis等人。" Leon验证系统概述:通过转换为递归函数进行验证。"第四届Scala研讨会论文集。 ACM,2013年。
[4] Leino,K。Rustan M.,"达夫尼:用于功能正确性的自动程序验证器。"人工智能和推理编程逻辑国际会议。 Springer Berlin Heidelberg,2010年。