Buddha Buck wrote:
Secondly, regarding the Bool type, I think it would be useful for Perl 6 to
define the full complement of dyadic logical operators, of which I count a
few that you don't appear to already have.  Probably the best place is in
Synopsis 32.

There are 16 dyadic logical operators, not all of which make sense to
have.    You name 10.

I think you answered your own criticism right there. The ones I didn't mention are ones that don't make sense to have.

2 of the 16 dyadic operators always result in false or true respectively, regardless of the arguments, same as 2 of the 4 monadic operators, and same as the only 2 niladic operators, contradiction/⊥ and tautology/⊤; only the last make sense to have. Another 2 of the 16 always result in a certain one or other of the arguments, respectively, regardless of the value of the second argument; they are like 1 of the 4 monadic operators that always results in its argument, and so isn't useful. Another 2 of the 16 always result in the opposite of the previous 2 I mentioned, and these are like the only 1 useful monadic operator, not/¬, that returns the opposite of its argument.

This then leaves 10 dyadic operators that are actually useful, of which Perl (and most languages) clearly includes 3 as standard infix operators: and, or, xor/!===, === (xnor), which leaves 6 others of which AFAIK implies/→ is the most commonly used of those.

Now, clearly ←,↚ are redundant with →,↛ if you just switch the operands around, but then by the same token <,≤/<= are also redundant with >,≥/>= if you just switch the operands, but it is useful to have both versions regardless.

I'm certain I know the semantics of these (and chooses the minimum of
the two, or the maximum, xor checks for difference, xnor checks for
sameness), but I'm uncertain of some of the rest...

But here are a few more dyadic:
* nand aka ⊼ aka ↑
true unless both operands are true

* nor aka ⊽ aka ↓
true if both operands are false

* implies aka imp aka →
true unless left operand true and right operand false.

* nimp aka ↛
true if left operand true and right operand false?

* if aka ←
true unless left operand false and right operand true

* nif aka ↚
true if left operand false and right operand true?

See these urls which were 2 of my primary references when building my lists:

  http://en.wikipedia.org/wiki/Logical_connective

  http://www.rbjones.com/rbjpub/logic/log048.htm

They should give you all the details.

The other six, which don't depend on the value of both operands, would
(if they existed) have the names false, left, right, nright, nleft,
and true.

I believe traditionally they are called: contradition, p, q, ¬q, ¬p, tautology (where p and q are the names of the arguments).

Thirdly, there are I'm sure a number of other aliases that could be added to
other ops, such as ≤ and ≥ for <= and >=, and ≠ for one of the inequality
operators, although that last one would probably make more sense if = was
the equality test operator, so maybe best to avoid ≠ then.

Perhaps ≡ and ≢ as aliases?

Well that's a thought, since those actually talk about 'identical' rather than 'equal', though I believe for purposes of logic (ignoring geometry say) they mean exactly the same thing, and I prefer the = and ≠ symbols.

For all of that matter, I think that Perl 6 would look a lot prettier if it used = as the generic equality test op (what === is used for now) and used the likes of := for assignment/binding/etc.

I don't know if using = for assignment is actually liked by people because they think it looks better or just because it has momentum say from Perl 5 and C et al. Probably the single main advantage I can see for needing a single character there is it combines easily with infix ops to make =foo ops, not that this still can't be done another way.

Larry, did you choose = for assignment and == etc for comparison because you thought that looked prettier, or because that was the C/etc convention that you decided to copy?

-- Darren Duncan

Reply via email to