<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Recent changes to Book.als</title><link>https://sourceforge.net/p/alloymda/wiki/Book.als/</link><description>Recent changes to Book.als</description><atom:link href="https://sourceforge.net/p/alloymda/wiki/Book.als/feed" rel="self"/><language>en</language><lastBuildDate>Sun, 25 Mar 2012 20:05:41 -0000</lastBuildDate><atom:link href="https://sourceforge.net/p/alloymda/wiki/Book.als/feed" rel="self" type="application/rss+xml"/><item><title>WikiPage Book.als modified by Alcino Cunha</title><link>https://sourceforge.net/p/alloymda/wiki/Book.als/</link><description>&lt;pre&gt;--- v1 
+++ v2 
@@ -6,19 +6,19 @@
 abstract sig Target { }
 
 sig Addr extends Target { }
-sig Email in Addr { }
-
+sig email in Addr { }
+
 sig Name extends Target { type : one Type }
 enum Type { Alias, Group }
 
 sig Book { names: Name some -&gt; Time, addr: Name -&gt; Target set -&gt; Time }
 
 fact { all t : Time | all b : Book | b.addr.t.Target in b.names.t }
 fact { all t : Time | all b : Book | (Name.(b.addr.t) &amp; Name) in b.names.t }
 fact { all t : Time | all b : Book | all n : b.names.t | some n.(b.addr.t) }
 fact { all t : Time | all b : Book | no n : Name | n in n.^(b.addr.t) }
 fact { all t : Time | all b : Book | all n : type.Alias | lone n.(b.addr.t) }
-fact { all t : Time | all b : Book | all n : Name | lone n.(b.addr.t :&gt; Email) }
+fact { all t : Time | all b : Book | all n : Name | lone n.(b.addr.t :&gt; email) }
 
 run { } for 4 but exactly 1 Book, exactly 1 Time
 
&lt;/pre&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Alcino Cunha</dc:creator><pubDate>Sun, 25 Mar 2012 20:05:41 -0000</pubDate><guid>https://sourceforge.netcf38b77c1a588c8f285c3a749d380d24c6272b8e</guid></item><item><title>WikiPage Book.als modified by Alcino Cunha</title><link>https://sourceforge.net/p/alloymda/wiki/Book.als/</link><description>~~~~~
module AddressBook

sig Time { }

abstract sig Target { }

sig Addr extends Target { }
sig Email in Addr { }

sig Name extends Target { type : one Type }
enum Type { Alias, Group }

sig Book { names: Name some -&gt; Time, addr: Name -&gt; Target set -&gt; Time }

fact { all t : Time | all b : Book | b.addr.t.Target in b.names.t }
fact { all t : Time | all b : Book | (Name.(b.addr.t) &amp; Name) in b.names.t }
fact { all t : Time | all b : Book | all n : b.names.t | some n.(b.addr.t) }
fact { all t : Time | all b : Book | no n : Name | n in n.^(b.addr.t) }
fact { all t : Time | all b : Book | all n : type.Alias | lone n.(b.addr.t) }
fact { all t : Time | all b : Book | all n : Name | lone n.(b.addr.t :&gt; Email) }

run { } for 4 but exactly 1 Book, exactly 1 Time

pred add [b: Book, n: Name, a: Target, t,t': Time] {
  n in b.names.t
  a not in n.(b.addr.t)
  b.addr.t' in b.addr.t + n-&gt;a
  b.names.t' = b.names.t
}

run add for 3 but 1 Book, 2 Time

fun lookup [b: Book, n: Name, t: Time] : set Addr { n.^(b.addr.t) &amp; Addr }

check { all t : Time, b : Book, n : b.names.t | some lookup[b,n,t] } for 4 but 1 Time, 1 Book
~~~~~</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Alcino Cunha</dc:creator><pubDate>Tue, 20 Mar 2012 18:04:44 -0000</pubDate><guid>https://sourceforge.net448071bb40caf09c97597cb1816211495d27ad8e</guid></item></channel></rss>