Not logged in
Log in now
Create an account
Subscribe to LWN
Pencil, Pencil, and Pencil
Dividing the Linux desktop
LWN.net Weekly Edition for June 13, 2013
A report from pgCon 2013
Little things that matter in language design
> This doesn't fit any definition of "commutative" I was able to find.
> Every case I could locate involved the order of _operands_ to a single _binary_ function.
The elusive binary operator here is function composition ;)
PHP: a fractal of bad design (fuzzy notepad)
Posted Apr 19, 2012 23:14 UTC (Thu) by mmorrow (subscriber, #83845)
A reference for the interested being:
Posted Apr 20, 2012 0:03 UTC (Fri) by nybble41 (subscriber, #55106)
I thought you were presenting a general version of the commutative property, not a specialized version for function composition. That explains why I couldn't reconcile your example with other commutative operators (equality, addition, multiplication) without making "x" the operator and "A" and "B", in essence, the parameters.
Writing "(A . B)(x) == (B . A)(x)" or "A . B == B . A" would make the commutative part of the formula a bit more visible--not that it was really hidden. I just wasn't looking at it from the right perspective.
Posted Apr 20, 2012 0:29 UTC (Fri) by mmorrow (subscriber, #83845)
(I wasn't the author of the original comment.)
> Writing "(A . B)(x) == (B . A)(x)" or "A . B == B . A" would make the commutative part of the formula a bit more visible..
It definitely would have made it clearer.
> ..a general version of the commutative property, not a specialized version for function composition..
Ah, but actually the case where a binary operator is commutative over its entire domain is the special case (in the mathematical sense, blah).
It's just that in programming we don't often (explcitly) deal with non-commutative binary operators, and even less often with non-commutative operators which are commutative when restricted to a subset of their domain.
Here's a quick roughly-phrased example:
Consider a rubik's cube. Think of a "move" as a function which maps a cube configuration to another configuration. This is a non-commutative group with elements these cube-config-maps and binary operator function composition. Now, for any two moves f and g which don't "interfere" (e.g. rotate top, rotate bottom), (f . g) == (g . f).
Posted Apr 20, 2012 1:13 UTC (Fri) by mmorrow (subscriber, #83845)
The "elements" are C stmts thought of as mappings of memory configurations, and the binary operator is `;`. This is a monoid with identity element the empty C stmt.
modify(S) := the set of memory locations statement S *may* modify.
So now, `;` is commutative for every pair of statements S,T which *must not* (i.e. cannot under any possible dynamic execution path) modify one or more of the same memory locations.
(S ; T)===(T ; S) <==> modify(S)/\modify(T)==empty_set
(where "===" := equivalence wrt effect on memory)
Posted Apr 20, 2012 1:37 UTC (Fri) by mmorrow (subscriber, #83845)
(S ; T)===(T ; S)
or something along these lines, but the idea is clear.
Posted Apr 20, 2012 8:19 UTC (Fri) by mpr22 (subscriber, #60784)
Copyright © 2013, Eklektix, Inc.
Comments and public postings are copyrighted by their creators.
Linux is a registered trademark of Linus Torvalds