<< Prev | - Up - | Next >> |
Problem Specification
Generate a Hamming code that fits in -bit words to code
symbols where the Hamming distance between every two symbol codes is at least
. The Hamming distance between to words is the number of bit positions where they differ.
Model
A -bit word is modeled by a set
where
means that the bit at position
is set (resp. unset otherwise). The Hamming distance
between two words
and
represented as sets
and
can be computed by subtracting from the word size
the number of elements that is contained (
) resp. is not contained (
) in both sets. Thus, the Hamming distance results in
Solver
The function Hamming
returns a solver to generate a Hamming code for NumSymbols
symbols in words with Bits
bits and a Hamming distance of Distance
. The procedure MinDist
implements the constraint that the Hamming distance does not exceed the value of Distance
. The list Xs
holds the sets representing the single codes. The nested loop (ForAllTail
and ForAll
) imposes MinDist
on all pairwise distinct elements of Xs
. The distribution employs straightforwardly a naive strategy.
declare
fun {Hamming Bits Distance NumSymbols}
proc {MinDist X Y}
Common1s = {FS.intersect X Y}
Common0s = {FS.complIn
{FS.union X Y}
{FS.value.make [1#Bits]}}
in
Bits-{FS.card Common1s}-{FS.card Common0s}>=:Distance
end
in
proc {$ Xs}
Xs = {FS.var.list.upperBound NumSymbols [1#Bits]}
{ForAllTail Xs proc {$ X|Y}
{ForAll Y proc {$ Z}
{MinDist X Z}
end}
end}
{FS.distribute naive Xs}
end
end
The following code generates a Hamming code for 16 symbols using 7 bit words and ensures a Hamming distance of 2.
{Browse
{Map {SearchOne {Hamming 7 2 16}}.1
fun {$ X}
{ForThread 7 1 ~1 fun {$ Is I}
{FS.reified.isIn I X}|Is
end nil}
end}}
Further, the code is nicely formatted displayed in the Oz Browser.
<< Prev | - Up - | Next >> |