<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Alloy_Analyzer</id>
	<title>Alloy Analyzer - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Alloy_Analyzer"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Alloy_Analyzer&amp;action=history"/>
	<updated>2026-06-10T19:09:16Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Alloy_Analyzer&amp;diff=1847689&amp;oldid=prev</id>
		<title>imported&gt;Gak69: Weblink aus Fließtext entfernt</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Alloy_Analyzer&amp;diff=1847689&amp;oldid=prev"/>
		<updated>2022-05-15T22:56:21Z</updated>

		<summary type="html">&lt;p&gt;Weblink aus Fließtext entfernt&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Infobox Software&lt;br /&gt;
| Name = Alloy Analyser&lt;br /&gt;
| Logo = &lt;br /&gt;
| Screenshot = [[Datei:Screenshot of Alloy Analyzer.png|240px]]&lt;br /&gt;
| Beschreibung = Screenshots mit Beispiel&lt;br /&gt;
| Maintainer = [[Daniel Jackson (Informatiker)|Daniel Jackson]]&lt;br /&gt;
| Hersteller = &lt;br /&gt;
| Management = &lt;br /&gt;
| AktuelleVersion = 6.0.0&lt;br /&gt;
| AktuelleVersionFreigabeDatum = 4. November 2021&lt;br /&gt;
| AktuelleVorabVersion = &lt;br /&gt;
| AktuelleVorabVersionFreigabeDatum = &lt;br /&gt;
| Betriebssystem = [[plattformunabhängig]]&lt;br /&gt;
| Programmiersprache = [[Java (Programmiersprache)|Java]]&lt;br /&gt;
| Kategorie = &lt;br /&gt;
| Lizenz = [[MIT-Lizenz]]&lt;br /&gt;
| Deutsch = nein&lt;br /&gt;
| Website = [http://alloytools.org AlloyTools]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Der &amp;#039;&amp;#039;&amp;#039;Alloy Analyzer&amp;#039;&amp;#039;&amp;#039; ist ein in der [[Informatik]] und [[Softwaretechnik]] eingesetztes Programm, das dazu genutzt werden kann, um [[Spezifikation]]en, die in der Sprache &amp;#039;&amp;#039;Alloy&amp;#039;&amp;#039; geschrieben sind, zu analysieren und zu simulieren.&amp;lt;ref name=&amp;quot;jackson2012&amp;quot;&amp;gt;{{Literatur | Autor=Daniel Jackson | Titel=Software Abstrations: Logic, Language, and Analysis | Verlag=[[MIT Press]] | Ort= | Jahr=2012 | ISBN=978-0262017152 }}&amp;lt;/ref&amp;gt; Das Programm kann Modelle der Spezifikation (Modelle im Sinne der [[Modell (Logik)|formalen Logik]]) erzeugen, also Instanzen aller [[Invariante (Informatik)|Invarianten]], die in der Spezifikation definiert wurden.  Die Sprache &amp;#039;&amp;#039;Alloy&amp;#039;&amp;#039; basiert auf relationaler Logik und eignet sich besonders gut dafür, Strukturen zu spezifizieren, wie sie oft im [[Softwareentwurf]] auftreten, also zum Beispiel Architekturen, Datenbankschemata, Netzwerk-Topologien, Ontologien u.&amp;amp;nbsp;ä. &lt;br /&gt;
&lt;br /&gt;
Darüber hinaus ist es in &amp;#039;&amp;#039;Alloy&amp;#039;&amp;#039; möglich, die Dimension Zeit in die Spezifikation einzubeziehen: seit Version 6 kann man in der Sprache unterscheiden zwischen Objekten, die &amp;#039;&amp;#039;statisch&amp;#039;&amp;#039; sind, sich also im Laufe der Zeit nicht ändern und solchen, die &amp;#039;&amp;#039;dynamisch&amp;#039;&amp;#039; sind, deren Struktur sich von Zeitpunkt zu Zeitpunkt unterscheiden kann. Der Alloy Analyzer zeigt dann nicht nur möglichen statische Strukturen an, die der Spezifikation entsprechen, sondern auch mögliche zeitliche Verläufe, die sich aus ihr ergeben. Für die Formulierung von temporalen Bedingungen stehen in Alloy 6 die Operatoren der [[Lineare temporale Logik|linearen temporalen Logik]] zur Verfügung&amp;lt;ref&amp;gt;Diese Erweiterung von Alloy wurde  zunächst unter dem Namen Electrum entwickelt von Julien&lt;br /&gt;
Brunel, David Chemouil, Alcino Cunha und Nuno Macedo; siehe Julien Brunel u. a. „The electrum analyzer: model checking relational first- order temporal specifications“. In: &amp;#039;&amp;#039;Proceedings of the 33rd ACM/IEEE International Conference on Automated Software Engineering, ASE 2018, Montpellier, France, September 3-7, 2018&amp;#039;&amp;#039;. Hrsg. von Marianne Huchard, Christian Kästner und Gordon Fraser. ACM, 2018, S. 884–887. &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Der Alloy Analyzer unterstützt die inkrementelle Entwicklung von Spezifikationen solcher Strukturen, indem er Modelle erzeugt, an denen man überprüfen kann, ob die gewünschten Eigenschaften der Strukturen auch tatsächlich erfüllt werden. Er ist auf diese Weise ein Werkzeug der [[Agile Softwareentwicklung|agilen]] Modellierung.&lt;br /&gt;
&lt;br /&gt;
Die Sprache &amp;#039;&amp;#039;Alloy&amp;#039;&amp;#039; und der Alloy Analyzer werden seit 1997 unter der Leitung von [[Daniel Jackson (Informatiker)|Daniel Jackson]] am [[Massachusetts Institute of Technology]] in den USA entwickelt. Die Bezeichnung „Alloy“ (Deutsch: Legierung) rührt daher, dass &amp;#039;&amp;#039;Alloy&amp;#039;&amp;#039; von Konzepten der [[Z-Notation|Spezifikationssprache Z]] und des [[Model Checking]]s beeinflusst wurde.&lt;br /&gt;
&lt;br /&gt;
== Analyseansatz ==&lt;br /&gt;
&lt;br /&gt;
Die Sprache &amp;#039;&amp;#039;Alloy&amp;#039;&amp;#039; hat die Ausdrucksmächtigkeit der [[Prädikatenlogik erster Stufe]] erweitert um den [[Transitiver Abschluss|transitiven Abschluss]]. Sie ist also nicht entscheidbar. Deshalb wird für die Analyse von Spezifikationen im Alloy Analyzer eine endliche Größe des zu betrachtenden Universums vorgegeben. Dies hat zur Folge, dass die Allgemeingültigkeit der Ergebnisse eingeschränkt ist. Jedoch begründen die Entwickler von Alloy Analyzer die Entscheidung zur Einschränkung des Gültigkeitsbereichs unter Berufung auf die &amp;#039;&amp;#039;small scope hypothesis&amp;#039;&amp;#039;&amp;lt;ref name=&amp;quot;jackson2012&amp;quot;/&amp;gt;, die besagt, dass ein hoher Anteil an [[Programmfehler]]n bereits gefunden werden kann, wenn man das Programm für alle Eingabewerte eines kleinen Gültigkeitsbereichs prüft.&amp;lt;ref&amp;gt;Alexandr Andoni, Dumitru Daniliuc, Sarfraz Khurshid und Darko Marinov (2002), &amp;quot;[http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.8.7702 Evaluating the small scope hypothesis]&amp;quot;&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Durch die Beschränkung auf endliche Universen kann eine Spezifikation in &amp;#039;&amp;#039;Alloy&amp;#039;&amp;#039; in eine Formel der Aussagenlogik transformiert werden. Für das Finden von Modellen für die Spezifikation müssen dann Belegungen dieser Formel gefunden werden. Das heißt, die Aufgabe des Alloy Analyzers kann auf das [[Erfüllbarkeitsproblem der Aussagenlogik]] zurückgeführt werden.&amp;lt;ref name=&amp;quot;jackson2012&amp;quot;/&amp;gt; Programme, die das Erfüllbarkeitsproblem lösen, werden &amp;#039;&amp;#039;SAT Solver&amp;#039;&amp;#039; genannt. Im Alloy Analyzer wird der &amp;#039;&amp;#039;Constraint solver&amp;#039;&amp;#039; Kodkod verwendet, der die Spezifikation in Alloy in die Aussagenlogik transformiert und dann einen SAT-Solver wie z.&amp;amp;nbsp;B. SAT4J verwendet, um erfüllende Belegungen zu finden. Diese werden dann zurücktransformiert in &amp;#039;&amp;#039;Alloy&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
In Alloy 6 können Eigenschaften für die generierten Modell und Ausführungspfade auch &amp;#039;&amp;#039;verifiziert&amp;#039;&amp;#039; werden. Dazu kann man sich auf eine endliche Zahl von möglichen Ausführungsschritten beschränken, also &amp;#039;&amp;#039;bounded model checking&amp;#039;&amp;#039; durchführen. Es gibt aber auch die Möglichkeit, die Verifikation für beliebig viele Ausführungsschritte zu machen. In diesem Fall wird &amp;#039;&amp;#039;symbolisches [[Model Checking]]&amp;#039;&amp;#039; mit [[Symbolic Model Verifier|SMV]] eingesetzt. Der Alloy Analyzer in Alloy 6 verwendet dazu die Komponente &amp;#039;&amp;#039;Pardinus&amp;#039;&amp;#039;, eine Erweiterung von Kodkod, die bounded model checking mit SAT-Solvern unterstützt, aber auch die Model Checker &amp;#039;&amp;#039;NuSMV&amp;#039;&amp;#039; oder &amp;#039;&amp;#039;nuXmv&amp;#039;&amp;#039; als Backend für &amp;#039;&amp;#039;unbounded model checking&amp;#039;&amp;#039; anbinden kann.&lt;br /&gt;
&lt;br /&gt;
== Anwendungen ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Alloy&amp;#039;&amp;#039; und der Alloy Analyzer wurden in einem breiten Spektrum von Untersuchungen eingesetzt. Beispiele sind:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;Kritische Systeme&amp;#039;&amp;#039;, wie etwa in der Medizintechnik.&amp;lt;ref&amp;gt;University of Washington &amp;#039;&amp;#039;PLSE Neutrons&amp;#039;&amp;#039;, [http://neutrons.uwplse.org/ UW PLSE Neutrons]&amp;lt;/ref&amp;gt;&lt;br /&gt;
* &amp;#039;&amp;#039;Netzwerk-Protokolle&amp;#039;&amp;#039;: [[Pamela Zave]] konnte mit Hilfe des Alloy Analyzers Fehler in [[Chord]] finden und Korrekturen vorschlagen.&amp;lt;ref&amp;gt;Pamela Zave: Reasoning about identifier spaces: How to make Chord correct, in: &amp;#039;&amp;#039;IEEE Trans. Software Engineering 43&amp;#039;&amp;#039;, 12 (Dec. 2017), 1144–1156.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* &amp;#039;&amp;#039;Web-Sicherheit&amp;#039;&amp;#039;: Eine Gruppe an den Universitäten UC Berkeley und Stanford verwendeten Alloy und den Alloy Analyzer um verschiedene Aspekte der Sicherheit im Web zu untersuchen.&amp;lt;ref&amp;gt;Akhawe, D., Barth, A., Lam, P.E., Mitchell, J. and Song, D.: Towards a formal foundation of Web security, in: &amp;#039;&amp;#039;Proceedings of the 23rd IEEE Computer Security Foundations&amp;#039;&amp;#039; Symp. Edinburgh, 2010, 290–304.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* &amp;#039;&amp;#039;Code-Verifikation&amp;#039;&amp;#039;: Greg Dennis hat ein Werkzeug namens &amp;#039;&amp;#039;Forge&amp;#039;&amp;#039; entwickelt, das &amp;#039;&amp;#039;Alloy&amp;#039;&amp;#039; verwendet und Java-Code, der mit Spezifikationen der Java Modeling Language JML annotiert ist überprüfen kann. Dieses Werkzeug wurde zur Verifikation von Java-Bibliotheken&amp;lt;ref&amp;gt;Dennis, G., Chang, F. and Jackson, D.: Modular verification of code with SAT, in: &amp;#039;&amp;#039;Proceedings of the Intern. Symp. Software Testing and Analysis&amp;#039;&amp;#039;, Portland, ME, Juli 2006.&amp;lt;/ref&amp;gt; sowie von Code eines elektronischen Wahlsystems&amp;lt;ref&amp;gt;Dennis, G., Yessenov, K. and Jackson, D.: Bounded verification of voting software, in: &amp;#039;&amp;#039;Proceedings of the 2nd IFIP Working Conf. Verified Software: Theories, Tools, and Experiments&amp;#039;&amp;#039;. Toronto,  Okt. 2008.&amp;lt;/ref&amp;gt; eingesetzt.&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
&lt;br /&gt;
Eine Uhr (nur mit Stundenanzeige) in Alloy 6&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
one sig Uhr {&lt;br /&gt;
	var stunde: one Int&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
pred init {&lt;br /&gt;
	Uhr.stunde = 1&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
pred move {&lt;br /&gt;
	Uhr.stunde = 12 implies Uhr.stunde&amp;#039; = 1 else Uhr.stunde&amp;#039; = Uhr.stunde.plus[1]&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fact trans {&lt;br /&gt;
	init&lt;br /&gt;
	always move&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
run {} for 5 int, 12 steps&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auswahl eines ausgezeichneten Knotens in einem Ring von Prozessen, siehe Julien Brunel, David Chemouil, Alcino Cunha, Nuno Macedo: Formal Software Design with Alloy 6.&amp;lt;ref&amp;gt;[https://haslab.github.io/formal-software-design/protocol-design/index.html#making-the-specification-more-abstract Protocol Design with Alloy], auf haslab.github.io&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
open util/ordering[Node]&lt;br /&gt;
&lt;br /&gt;
sig Node {&lt;br /&gt;
  succ : one Node,&lt;br /&gt;
  var inbox : set Node&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fact {&lt;br /&gt;
  some Node                       // at least one node&lt;br /&gt;
  all n : Node | Node in n.^succ  // succ forms a ring&lt;br /&gt;
  no inbox                        // initially inbox is empty&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fun Elected : set Node {&lt;br /&gt;
  { n : Node | n not in n.inbox and once (n in n.inbox) }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
pred initiate[n : Node] {&lt;br /&gt;
  // node n initiates the protocol&lt;br /&gt;
  historically n not in n.succ.inbox          // guard&lt;br /&gt;
  n.succ.inbox&amp;#039; = n.succ.inbox + n            // effect on n.succ.inbox&lt;br /&gt;
  all m : Node - n.succ | m.inbox&amp;#039; = m.inbox  // effect on the inboxes of other nodes&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
pred process[n : Node, i : Node] {&lt;br /&gt;
  // i is read and processed by node n&lt;br /&gt;
  i in n.inbox                                     // guard&lt;br /&gt;
  n.inbox&amp;#039; = n.inbox - i                           // effect on n.inbox&lt;br /&gt;
  gt[i,n] implies n.succ.inbox&amp;#039; = n.succ.inbox + i // effect on n.succ.inbox&lt;br /&gt;
          else    n.succ.inbox&amp;#039; = n.succ.inbox&lt;br /&gt;
  all m : Node - n.succ - n | m.inbox&amp;#039; = m.inbox   // effect on the inboxes of other nodes&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
pred stutter {&lt;br /&gt;
  inbox&amp;#039; = inbox&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fact { // possible events&lt;br /&gt;
  always (&lt;br /&gt;
    stutter or&lt;br /&gt;
    some n : Node | initiate[n] or&lt;br /&gt;
    some n : Node, i : Node | process[n,i]&lt;br /&gt;
  )&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
run example {&lt;br /&gt;
  eventually some Elected&lt;br /&gt;
} for 3 Node&lt;br /&gt;
&lt;br /&gt;
assert AtMostOneLeader {&lt;br /&gt;
  always (lone Elected)&lt;br /&gt;
}&lt;br /&gt;
check AtMostOneLeader for 5 but 1.. steps&lt;br /&gt;
&lt;br /&gt;
pred fairness {&lt;br /&gt;
  all n : Node, i : Node {&lt;br /&gt;
    (eventually always historically n not in n.succ.inbox) implies (always eventually initiate[n])&lt;br /&gt;
    (eventually always i in n.inbox)                       implies (always eventually process[n,i])&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
assert AtLeastOneLeader {&lt;br /&gt;
  fairness implies eventually (some Elected)&lt;br /&gt;
}&lt;br /&gt;
check AtLeastOneLeader for 3 but 1.. steps&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://alloytools.org Homepage von Alloy und Alloy Analyzer] am [[Massachusetts Institute of Technology|MIT]]&lt;br /&gt;
* [https://alloytools.discourse.group Alloy Diskussionsforum]&lt;br /&gt;
* [https://groups.csail.mit.edu/sdg/pubs/2019/alloy-cacm-18-feb-22-2019.pdf Daniel Jackson: &amp;#039;&amp;#039;Alloy: A Language and Tool for Exploring Software Designs&amp;#039;&amp;#039;] in: &amp;#039;&amp;#039;Communications of the ACM&amp;#039;&amp;#039;, September 2019&lt;br /&gt;
* [http://www.doc.ic.ac.uk/project/examples/2007/271j/suprema_on_alloy/Web/ Eine Anleitung für Alloy]&lt;br /&gt;
* [http://emina.github.io/kodkod/ Homepage des Kodkod Constraint Solver]&lt;br /&gt;
* [https://esb-dev.github.io/mat/alloy-intro.pdf Kurze Einführung in Alloy]&lt;br /&gt;
* [https://esb-dev.github.io/mat/echo.pdf Erste Begegnung mit Alloy 6]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Theoretische Informatik]]&lt;br /&gt;
[[Kategorie:Freies Programmierwerkzeug]]&lt;br /&gt;
[[Kategorie:Java-Programm]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Gak69</name></author>
	</entry>
</feed>