| << Prev | - Up - | Next >> | 
One we have created a DomainProduct object O, we can use it to turn a specification into a set of integers encoding the tuples corresponding to this specification. We want to allow the user to write specifications with the following abstract syntax: 
 A tuple satisfies specification 
 if it contains value 
. It satisfies 
 if it satisfies both 
 and 
. It satisfies 
 if it satisfies either 
 or 
.
Instead of explicit connectives, we will simply allow a specification to consist of arbitrarily nested lists, eventually bottoming out with domain values. The outer level is interpreted disjunctively, and each nesting switches the interpretation of the connective: thus the 2nd level is interpreted conjunctively, the 3rd disjunctively, etc. For example, let us consider agreement information limited to just gender and person. The specification:
[[masc [1 3]] [fem 2]] denotes the 3 tuples [masc 1], [masc 3], [fem 2]. However: 
[[masc 1 3] [fem 2]] just denotes [fem 2] since a tuple cannot contain both 1 and 2. The spec: 
[[masc 1] fem] denotes the 4 tuples [masc 1], [fem 1], [fem 2] and [fem 3]. 
meth encode(Desc $)
   {self Disj(Desc $)}
end 
meth Disj(Desc $)
   case Desc
   of _|_ then {FoldL Desc
                fun {$ Accu Desc}
                   {FS.union Accu
                    {self Conj(Desc $)}}
                end self.empty}
   [] nil then self.empty
   else @value2set.Desc end 
end 
meth Conj(Desc $)
   case Desc
   of _|_ then {FoldL Desc
                fun {$ Accu Desc}
                   {FS.intersect Accu
                    {self Disj(Desc $)}}
                end self.full}
   [] nil then self.full
   else @value2set.Desc end 
end| << Prev | - Up - | Next >> |