in reply to Re: Re: $a++ allowed by $a-- is not ! why?
in thread $a++ allowed by $a-- is not ! why?

Modern algebra would say that although ++ is one-to-one, it is not onto. As such, it is not a permutation, since a permutation is defined as a one-to-one onto function from a set to itself.

-- OTOH (as it is currently defined) is theoretically a permutation over the set of all finite numbers, provided you run Perl on an architecture capable of storing and representing all numbers in that set. (In practice I am not aware of any such architecture, but nevermind.)

The logical conclusion is that if -- were made the inverse function of ++ it would no longer be one-to-one, because the inverse of a one-to-one function is onto and vice versa, but the inverse of a function that is not one-to-one is not onto and vice versa. Some people strongly prefer to avoid dealing with functions that are not one-to-one. Of course you could redefine the domain of -- so that it is one-to-one, but then you have a function on an apparently very arbitrary set (a set defined in terms of the range of ++ in fact), which could be considered "messy".

I don't know how much of this went into the decision, but I know that Larry knows some set theory, so it is entirely possible he considered this issue. It's also entirely possible that he just "felt" that applying the magic string extension to -- would be messy, without ennumerating all these points; sometimes people who design software for a living have a pretty good feel for which features would result in thorny issues. Sometimes they use the term "well-defined" to refer to a feature that can be implemented and meet most reasonable expectations. Applying the magic extension to -- would probably not be considered well-defined.


$;=sub{$/};@;=map{my($a,$b)=($_,$;);$;=sub{$a.$b->()}} split//,".rekcah lreP rehtona tsuJ";$\=$ ;->();print$/

Replies are listed 'Best First'.
Re: Re: $a++ allowed by $a-- is not ! why?
by kabel (Chaplain) on Sep 01, 2003 at 16:35 UTC
    sorry, i did not mean that permutation ;) it was just meant to be a visual description of the commutitativity law.

    Modern algebra would say that although ++ is one-to-one, it is not onto.
    why? it is a mapping from N to N (if i understand you correctly).
    -- OTOH (as it is currently defined) is theoretically a permutation over the set of all finite numbers ...
    the association is not clear to me. why do you think -- is a permutation? (what is a permutation for you?).

    i think we make too much fuss about nothing. perhaps we should continue this by mail?
      Modern algebra would say that although ++ is one-to-one, it is not onto.
      why? it is a mapping from N to N (if i understand you correctly).

      Given a function F from set S to set T, F is said to be one-to-one if F(s) is equal to a unique t in T for all s in S, and F is said to be onto if for all t in T there exists exactly one s in S such that F(s)=t. In our case both S and T are the same set, the set of all finite numbers and alphanumeric strings. (I believe (Inf)++ is also defined, but that can be considered a special case.)

      ++ as it is defined in Perl is one-to-one because each possible number or alphanumeric string has a unique successor, but it is not onto because it is not true that each number or alphanumeric string has a unique predecessor.

      why do you think -- is a permutation?

      Because, its domain and range are the same set (specifically, the set of all finite numbers; again, (Inf)-- is also defined but can be considered a special case, a polymorphism if you will) and it is both one-to-one and onto.

      You can also consider ++ to be a permutation over the set of all finite numbers, if you consider the string magic to be a polymorphism, but ++ is definitely not a permutation over the set of alphanumeric strings, because it is not onto.


      $;=sub{$/};@;=map{my($a,$b)=($_,$;);$;=sub{$a.$b->()}} split//,".rekcah lreP rehtona tsuJ";$\=$ ;->();print$/
        Your definitions of one-to-one and onto are somewhat incorrect.

        One-to-one (aka injective) means that F(s) = F(s') only happens if s=s'. In other words no more than one value will map to a given target.

        Onto (aka surjective) means that for each t in the target space T there is an s such that F(s)=t.

        The necessity that F(s) not have 2 values (which you gave as a definition of being one-to-one) is required for F to be a function. The requirement of "exactly one" that you stated for onto is wrong.

        Furthermore any function F that is one-to-one has a unique local inverse function G from its image in T back to S such that G(F(s)) is s for all s in S. For G to truly be the inverse of F, you also need F(G(t)) to be t for all t in T, which requires that F be onto.

        Therefore any function which is one-to-one and onto is called invertible (because it has an inverse function).

        And the entire discussion about strings comes down to this. The ++ operation is not onto the set of alphanumeric strings, and therefore does not have an inverse from the set of all strings. Therefore there is no natural way to define a general -- operator for strings, so none has been defined.

        (Exercise for the interested reader - search the archives of p5p for past discussions of the -- operator on strings. I know that it has been discussed extensively there, and am just too lazy to search for it.)