Skip to content

Instantly share code, notes, and snippets.

@asimihsan
Created January 20, 2022 05:49
Show Gist options
  • Save asimihsan/b77d5f8da77dbde6ed394760a9d0b598 to your computer and use it in GitHub Desktop.
Save asimihsan/b77d5f8da77dbde6ed394760a9d0b598 to your computer and use it in GitHub Desktop.
Formal modeling as a design tool
sig Package {}
run example {}
sig Package {
name : one Name,
version : one Version,
requires : set Package,
}
sig Name {}
sig Version {}
run example {}
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 {}
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
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
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
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
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