Created
January 20, 2022 05:49
-
-
Save asimihsan/b77d5f8da77dbde6ed394760a9d0b598 to your computer and use it in GitHub Desktop.
Formal modeling as a design tool
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
sig Package {} | |
run example {} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
sig Package { | |
name : one Name, | |
version : one Version, | |
requires : set Package, | |
} | |
sig Name {} | |
sig Version {} | |
run example {} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
sig Package { | |
name : one Name, | |
version : one Version, | |
requires : set Package, | |
} | |
sig Name {} | |
sig Version {} | |
fact "only one package version in dependency graph for package" { | |
all p1 : Package, disj p2, p3 : p1.*requires | p2.name != p3.name | |
} | |
run example {} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
sig Package { | |
name : one Name, | |
version : one Version, | |
requires : set Package, | |
} | |
sig Name {} | |
sig Version {} | |
fact "only one package version in dependency graph for package" { | |
all p1 : Package, disj p2, p3 : p1.*requires | p2.name != p3.name | |
} | |
fact "package doesn't require itself at any version" { | |
all p : Package | p.name not in (p.requires).name | |
} | |
run example { | |
// At least 3 Packages | |
#(Package.name) >= 3 | |
// At least two requirements | |
#(Package.requires) >= 2 | |
} for 5 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
sig Package { | |
name : one Name, | |
version : one Version, | |
requires : set Package, | |
} | |
sig InstalledPackage in Package {} | |
sig Name {} | |
sig Version {} | |
fact "only one package version in dependency graph for package" { | |
all p1 : Package, disj p2, p3 : p1.*requires | p2.name != p3.name | |
} | |
fact "package doesn't require itself at any version" { | |
all p : Package | p.name not in (p.requires).name | |
} | |
run example { | |
// At least 3 Packages | |
#(Package.name) >= 3 | |
// At least two requirements | |
#(Package.requires) >= 2 | |
} for 5 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
sig Package { | |
name : one Name, | |
version : one Version, | |
requires : set Package, | |
} | |
var sig InstalledPackage in Package {} | |
sig Name {} | |
sig Version {} | |
fact "only one package version in dependency graph for package" { | |
all p1 : Package, disj p2, p3 : p1.*requires | p2.name != p3.name | |
} | |
fact "package doesn't require itself at any version" { | |
all p : Package | p.name not in (p.requires).name | |
} | |
fact { | |
no InstalledPackage | |
} | |
pred install[p : Package] { | |
// guard | |
p not in InstalledPackage | |
// effects | |
// This enforces only one package with same name installed at any given time | |
InstalledPackage' = p.*requires + {p2 : InstalledPackage | p2.name not in (p.*requires).name} | |
// no frame conditions | |
} | |
pred stutter { | |
// no guard | |
// no effects | |
InstalledPackage' = InstalledPackage // frame condition | |
} | |
fact { | |
always ( | |
stutter or | |
one p : Package - InstalledPackage | install[p] | |
) | |
} | |
run example { | |
// At least 3 Packages | |
#(Package.name) >= 3 | |
// At least two requirements | |
#(Package.requires) >= 2 | |
} for 5 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
sig Package { | |
name : one Name, | |
version : one Version, | |
requires : set Package, | |
} | |
var sig InstalledPackage in Package {} | |
sig Name {} | |
sig Version {} | |
fact "only one package version in dependency graph for package" { | |
all p1 : Package, disj p2, p3 : p1.*requires | p2.name != p3.name | |
} | |
fact "package doesn't require itself at any version" { | |
all p : Package | p.name not in (p.requires).name | |
} | |
fact { | |
no InstalledPackage | |
} | |
enum Event { Stutter, Install } | |
fun install_happens : set Event -> Package { | |
{ e : Install, p: Package | install[p] } | |
} | |
fun stutter_happens : set Event { | |
{ e : Stutter | stutter } | |
} | |
pred install[p : Package] { | |
// guard | |
p not in InstalledPackage | |
// effects | |
// This enforces only one package with same name installed at any given time | |
InstalledPackage' = p.*requires + {p2 : InstalledPackage | p2.name not in (p.*requires).name} | |
// no frame conditions | |
} | |
pred stutter { | |
// no guard | |
// no effects | |
InstalledPackage' = InstalledPackage // frame condition | |
} | |
fact { | |
always ( | |
stutter or | |
one p : Package - InstalledPackage | install[p] | |
) | |
} | |
run example { | |
// At least 3 Packages | |
#(Package.name) >= 3 | |
// At least two requirements | |
#(Package.requires) >= 2 | |
} for 5 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
sig Package { | |
name : one Name, | |
version : one Version, | |
requires : set Package, | |
} | |
var sig InstalledPackage in Package {} | |
sig Name {} | |
sig Version {} | |
fact "only one package version in dependency graph for package" { | |
all p1 : Package, disj p2, p3 : p1.*requires | p2.name != p3.name | |
} | |
fact "package doesn't require itself at any version" { | |
all p : Package | p.name not in (p.requires).name | |
} | |
fact { | |
no InstalledPackage | |
} | |
enum Event { Stutter, Install } | |
fun install_happens : set Event -> Package { | |
{ e : Install, p: Package | install[p] } | |
} | |
fun stutter_happens : set Event { | |
{ e : Stutter | stutter } | |
} | |
pred install[p : Package] { | |
// guard | |
p not in InstalledPackage | |
// effects | |
// This enforces only one package with same name installed at any given time | |
InstalledPackage' = p.*requires + {p2 : InstalledPackage | p2.name not in (p.*requires).name} | |
// no frame conditions | |
} | |
pred stutter { | |
// no guard | |
// no effects | |
InstalledPackage' = InstalledPackage // frame condition | |
} | |
fact { | |
always ( | |
stutter or | |
one p : Package - InstalledPackage | install[p] | |
) | |
} | |
assert PackagesHaveDependencies { | |
always (all p : InstalledPackage | p.*requires in InstalledPackage) | |
} | |
check PackagesHaveDependencies for 3 | |
run example { | |
// At least 3 Packages | |
#(Package.name) >= 3 | |
// At least two requirements | |
#(Package.requires) >= 2 | |
} for 5 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment