From: Larry Evans (cppljevans_at_[hidden])
Date: 2007-04-21 13:01:09


On 04/21/2007 12:21 PM, Maurizio Vitale wrote:
[snip]
>
> I'm not sure I understand zeros and ones:
> the value which is interesting is the identity. In the case of additions
> (and ORs) the identity is a 'zero'. In the case of multiplications
> (and ANDs)
> the identity is a 'one'.
> The 'other' value (zero for multiplications and one for additions)
> seems to
> only be of interest for simplifying expressions, rather than being
> logically
> important, but I might miss something here.
>

I believe you do understand, except that both special values
(one and zero) can be used for simplification. Any expression
with 0 is simplified to 0 and any expression with 1 is simplified
to the subexpression without the 1.

Simplification was one application. For example, there's the
following code:

     // sequence rule folds all >>'s together into a list
     // and wraps the result in a composite<> wrapper
     struct ToySpiritSequence
       : as_composite<
             proto::tag::right_shift
           , proto::trans::reverse_fold_to_list<
                 proto::right_shift<ToySpiritGrammar, ToySpiritGrammar>
>
>
     {};

in the proto/test/toysprit2.cpp file. I'm just guessing, but I'd think
this folding could be accompanied by simplification based on the above
rules.