簡體   English   中英

Alloy中定義的約束如何產生更好的軟件?

[英]How do constraints defined in Alloy result in better software?

合金新手在這里。

我真的很喜歡在Alloy中創建約束,並讓分析器根據約束檢查模型是否有效。

但是我問自己:“這些約束定義僅僅是心理體操,還是它們將有助於構建更好的軟件?”

讓我們舉一個具體的例子。 在電子郵件客戶地址簿的模型中,可以定義此約束以在地址簿中添加新條目:

新書b'中的地址映射與舊書b'中的地址映射相同,並增加了從名稱到地址的鏈接。 該約束在Alloy中表示為:b'.addr = b.addr + n-> a

那個好漂亮。

但是,當在代碼中執行添加操作時,我很難看到它的相關性。 例如,我在Common Lisp中實現了添加操作:

(defun add (b n a)
   "Add a new entry, (n a), to address book b"
   (adjoin (list n a) b :key #'first))

換句話說:“這是一個名為add的函數的定義,該函數具有三個參數: bna (書,名稱,地址)。 使用Common Lisp設置函數adjoin將列表( na )添加到b中 。”

該函數似乎正確實現了一個簡單的添加函數。 如何處理我在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)

編寫此類代碼似乎需要很多工作,並且沒有明顯的好處。

所以我的問題是:在代碼中實現Alloy模型時,應如何處理Alloy中定義的約束?

另外,是否有一個教程描述如何將Alloy模型轉換為代碼,包括如何在代碼中使用Alloy約束定義的描述?

謝謝。

[1]注意:我意識到在Common Lisp中有一個名為Screamer的語言擴展用於約束編程

我相信這個問題源於對諸如Alloy之類的某些建模語言的目標和功能的輕微誤解,並涉及了形式化方法,驗證和軟件建模的一些基本方面。 可能有很好的資源來使背景故事更清晰,其中包括諸如《 微積分》之類以及您提到的有關Alloy

約束是Alloy建模語言的一等公民。 這個想法是約束反映了人們想要建模(並檢查屬性)的代碼的語義。 因此,從一個角度看,Alloy程序代表代碼本身,不需要編寫其他代碼(例如,以功能語言編寫)或將聲明的約束與代碼混合。 但是,Alloy程序不能直接執行。 相反,它們只能用於根據此類程序(即約束集)生成模型。

更具體地說,根據適當的解釋,Alloy約束b'.addr = b.addr + n->a確實可以捕獲Lisp中add操作的行為,因此檢查涉及約束的某些屬性與檢查這些屬性是否適用於Lisp中的給定操作。 這是Alloy用於軟件建模和驗證的標准(並且可能是預期的)用途。 (此外,Alloy通常用於對沒有明確映射到程序的系統進行建模,例如某些類型的網絡物理系統[1]。)請注意,這當然意味着必須在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.“ Dafny:用於功能正確性的自動程序驗證器。” 人工智能和推理編程邏輯國際會議。 施普林格·柏林·海德堡,2010年。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM