FiniteMap (M, D, R): trait
  % An M is a map from D's to R's.
    {}: -> M
    update: M, D, R -> M
    apply: M, D -> R
    defined: M, D -> Bool
    M generated by {}, update
    M partitioned by apply, defined
    forall m: M, d, d1, d2: D, r: R
      apply(update(m, d2, r), d1) ==
        if d1 = d2 then r else apply(m, d1);
      ~defined({}, d);
      defined(update(m, d2, r), d1) ==
        d1 = d2 \/ defined(m, d1)
    Array1 (update for assign, apply for __[__],
            M for A, D for I, R for E)
    converts apply, defined
      exempting forall d: D apply({}, d)
[Table of Contents] [Index]