Finite Sets


spec
     Elem =
     sort
          Elem
end

spec
     GenerateFiniteSet [Elem with sort Elem] =
free
{
     type
           FinSet[Elem]::= {} | set(Elem) |
                           __ union __ (FinSet[Elem];FinSet[Elem])
     op
           __ union __: FinSet[Elem] * FinSet[Elem] -> FinSet[Elem],
                        assoc, comm, idem, unit {}
}
%%     intended system of representatives:
%%     {} and
%%     set(x1) union ... union set(xn),
%%     where n >= 1, xi in Elem, xi =/= xj for i =/= j, and
%%     x1 < x2 < ...< xn (< is an arbitrary order on Elem)
end

spec
     FiniteSet [Elem with sort Elem] =
     GenerateFiniteSet [Elem]
     with sort FinSet[Elem] , ops {}, set, __ union __
then
     preds
           __  elemOf __:    Elem * FinSet[Elem];
           __ isSubsetOf __: FinSet[Elem] * FinSet[Elem]
     ops
           add:                Elem * FinSet[Elem] -> FinSet[Elem];
           __ without __:      FinSet[Elem] * Elem -> FinSet[Elem];
           __ intersection __,
           __ - __,
           __ symmDiff __:     FinSet[Elem] * FinSet[Elem] -> FinSet[Elem]
     vars
          x,y : Elem; S,T,U,V:FinSet[Elem]
     %%          x  elemOf S:
     .          not x  elemOf {}
     .          x  elemOf set(y) <=> (x=y)
     .          x  elemOf (S union T) <=> (x  elemOf S) \/ (x  elemOf T)
     %%          S isSubsetOf T:
     .          {} isSubsetOf S
     .          set(x) isSubsetOf S <=> x  elemOf S
     .          (S union T) isSubsetOf U <=> S isSubsetOf U /\ T isSubsetOf U
     %%          add(x,S):
     .          add(x,S) = set(x) union S
     %%          S without x:
     .          {} without x = {}
     .          set(y) without x = set(y) if not x = y
     .          set(y) without x = {} if x = y
     .          (S union T) without x = (S without x) union (T without x)
     %%          S intersection T:
     .          {} intersection S = {}
     .          set(x) intersection S = {} if not x  elemOf S
     .          set(x) intersection S = set(x) if x  elemOf S
     .          (S union T) intersection U = ( S intersection U ) union (T
          intersection U)
     %%          S - T:
     .          {} - S = {}
     .          set(x) - S = set(x) if not x  elemOf S
     .          set(x) - S = {} if x  elemOf S
     .          (S union T) - U = (S - U ) union (T - U)
     %%          S symmDiff T:
     .          S symmDiff T = (S - T) union (T - S)

then
     %%cons
     ops
           __ intersection __: FinSet[Elem] * FinSet[Elem] -> FinSet[Elem],
                               assoc, comm, idem;
           __ symmDiff __ :    FinSet[Elem] * FinSet[Elem] -> FinSet[Elem],
                               comm;
     vars
          x: Elem; S,T: FinSet[Elem]
     .          S isSubsetOf T <=> ( forall x: Elem . x  elemOf S => x  elemOf T )

end

view
     PartialOrder_in_FiniteSet [Elem]:
PartialOrder
     to FiniteSet [Elem] =
     sort
          Elem |-> FinSet[Elem] ,
     pred
          __ <= __ |-> __ isSubsetOf __
end

spec
     FinitePowerSet3
     [FiniteSet [Elem with sort Elem]
      with preds __  elemOf __,__ isSubsetOf __,
           ops __ union __, __ intersection __, add, __ without __, __ -
           __, __ symmDiff __ ]
     [op X: FinSet[Elem]] =
     sorts
           FinitePowerSet[X]= { Y: FinSet[Elem] . Y isSubsetOf X };
           Elem[X] =          {x : Elem . x  elemOf X }
     preds
           __  elemOf __ :   Elem[X] * FinitePowerSet[X];
           __ isSubsetOf __: FinitePowerSet[X] * FinitePowerSet[X]
     ops
           {}:                 FinitePowerSet[X];
           set :               Elem[X] -> FinitePowerSet[X];
           add:                Elem[X] × FinitePowerSet[X] ->
                               FinitePowerSet[X];
           __ union __,
           __ intersection __,
           __ - __,
           __ symmDiff __:     FinitePowerSet[X] * FinitePowerSet[X]
                               -> FinitePowerSet[X]
     %%          These predicates and operations
     %%          are determined by overloading.end

view
     DefineBooleanAlgebra_in_FinitePowerSet
     [FiniteSet[Elem]] [op X: FinSet[Elem]]:
DefineBooleanAlgebra
     to
FinitePowerSet
     [FiniteSet[Elem]] [ op X: FinSet[Elem]] =
     sort
          Elem |-> FinitePowerSet[X],
     ops
           0 |-> {},
           1 |-> X,
           __ cap __ |-> __ intersection __,
           __ cup __ |-> __ union __
end


Back to the Basic Datatypes in CASL
Markus Roggenbach last update March 5, 1999.