On Sun, Oct 9, 2011 at 3:08 AM, Steven D'Aprano <steve+comp.lang.pyt...@pearwood.info> wrote: > Roy Smith wrote: > >> If you want to take it one step further, all the boolean operators can >> be derived from nand (the dualists would insist on using nor). > > Let's define the boolean values and operators using just two functions: > > def true(x, y): > return x > > def false(x, y): > return y > > > That's all we need to define all of Boolean algebra. Unfortunately, it's a > bit ugly in Python: > >>>> true > <function true at 0xb7c3a36c> > > So let's add a helper function to prettify the output: > > def pr(b): > print(b(true, false).__name__) > >>>> pr(true) > true > > Much nicer! > > > Now define NAND: > > def Nand(a, b): > return (lambda c: lambda x, y: c(y, x))(a(b, a)) > > > and we're done. All of boolean algebra can now be derived from Nand. > > >>>> def Not(b): > ... return Nand(b, b) > ... >>>> pr(Not(true)) > false >>>> pr(Not(false)) > true > > >>>> def And(a, b): > ... return Nand(Nand(a, b), Nand(a, b)) > ... >>>> pr(And(true, false)) > false >>>> pr(And(true, true)) > true > > >>>> def Or(a, b): > ... return Nand(Nand(a, a), Nand(b, b)) > ... >>>> pr(Or(true, false)) > true >>>> pr(Or(false, false)) > false > > >>>> def Xor(a, b): > ... return And(Nand(a, b), Or(a, b)) > ... >>>> pr(Xor(true, false)) > true >>>> pr(Xor(true, true)) > false > > > and so forth. > > > > -- > Steven > > -- > http://mail.python.org/mailman/listinfo/python-list >
Awesome -- http://mail.python.org/mailman/listinfo/python-list