All Downloads are FREE. Search and download functionalities are using the official Maven repository.

models.examples.case_studies.ins.als Maven / Gradle / Ivy

module examples/case_studies/ins

/*
 * Models an Intentional Naming System (INS), a scheme for
 * dynamic resource discovery in a dynamic environment.
 *
 * For a detailed description, see:
 *   http://sdg.lcs.mit.edu/pubs/2000/INS_ASE00.pdf
 *
 * author: Sarfraz Khurshid
 */

open util/relation as rel

sig Attribute {}
sig Value {}
sig Record {}

one sig Wildcard extends Value {}

sig AVTree {
  values: set Value,
  attributes: set Attribute,
  root: values - Wildcard,
  av: attributes one -> some (values - root),
  va: (values - Wildcard) one -> attributes
}{
  // values (and attributes) of tree are those reachable from root
  values = root.*(va.av)
}

sig Query extends AVTree {} {all a:attributes | one a.av}

sig DB extends AVTree {
  records : set Record,
  recs: (values - root) some -> records,
  lookup : Query -> (values -> records)
}{
  Wildcard !in values
}

fact AddInvariants {
  all db: DB {
    all v: db.values | no v.(db.recs) & v.^(~(db.av).~(db.va)).(db.recs)
    all a: db.attributes | all disj v1, v2: a.(db.av) |
      (some rr: *((db.va).(db.av)).(db.recs) | no v1.rr & v2.rr)
  }
}

pred Get [db: DB, r: Record, q: Query] {
  q.values = r.~(db.recs).*(~(db.av).~(db.va))
  q.attributes = q.values.~(db.av)
  q.root = db.root
  all a : attributes| a.~(q.va) = a.~(db.va)
  all v : values | v.~(q.av) = v.~(db.av)
}

pred Conforms [db: DB, q: Query, r: Record] {
  some p: Query {
    db.Get[r, p]
    q.va in p.va
    (q.av - Attribute -> Wildcard) in p.av
  }
}

pred indSubset[db : DB, q: Query, r: set Record, v: Value] {
  all a : v.(q.va) |
    (a.(q.av) in a.(db.av) => r in (a.(q.av)).(q.(db.lookup))) &&
    (a.(q.av) = Wildcard => r in a.(db.av).*((db.va).(db.av)).(db.recs))
}

pred Lookup[db: DB, q: Query, found: set Record] {
  all v: Value | not v.(q.va) in v.(db.va) => no v.(q.(db.lookup))
  all v: Value | all a : v.(q.va) |
    a.(q.av) != Wildcard && not a.(q.av) in a.(db.av) => no v.(q.(db.lookup))
  all v: Value - Wildcard |
    no v.(q.va) => v.(q.(db.lookup)) = v.*((db.va).(db.av)).(db.recs)
  all v: Value |
    some v.(q.va) => indSubset[db, q, v.(q.(db.lookup)), v] &&
    (no r: Record - v.(q.(db.lookup)) | indSubset[db, q, v.(q.(db.lookup)) + r, v])
  found = db.root.(q.(db.lookup))
}

assert CorrectLookup {
  all db: DB | all q : Query | all r : Record |
    Conforms [db,q,r] <=> db.Lookup[q, r]
}

pred Add [me: DB, adv: Query, r: Record, db: DB] {
  // restricted version - only advertisements with fresh attributes and values added
  no me.attributes & adv.attributes
  me.values & adv.values = me.root
  me.root = adv.root
  Wildcard !in adv.values
  r !in me.records
  db.values = me.values + adv.values
  db.attributes = me.attributes + adv.attributes
  db.root = me.root
  db.av = me.av + adv.av
  db.va = me.va + adv.va
  db.recs = me.recs + ((db.values - dom[db.va]) -> r)
}

pred RemoveWildCard[me: Query, q: Query] {
  q.values = me.values - Wildcard
  q.attributes = me.attributes - Wildcard.~(me.av)
  q.root = me.root
  q.av = me.av - Attribute -> Wildcard
  q.va = me.va - Value -> Wildcard.~(me.av)
}

assert MissingAttributeAsWildcard {
  all db : DB, q, q' : Query, found: set Record |
    db.Lookup[q, found] && q.RemoveWildCard[q'] => db.Lookup[q', found]
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy