# Why aren't postfix and primary expressions symmetrical?

Every primary expression is a postfix expression but a postfix expression is not primary expression.

But in mathematics, equality seems to be symmetrical. That is:

If A is B, then B is A

Why isn't this the case for postfix and primary expressions?

• The reason why most purist mathematicians turn out to be lousy C/C++ programmers, is because they expect the language to behave in logical and rational ways. There are very few things in the C/C++ languages' syntax that are rational. – user29079 Nov 18 '11 at 7:29
• I don't follow you. For example, every prime number is an integer, but not every integer is a prime number. The problem may be that you are ambiguous about which logical operator you are talking about. In my example I interpreted 'is' as 'is an element of' or 'is a subset of'. Do you mean equals? In C++ equals is just a function of two parameters. It's generally related to the mathematical equals, but can be overridden to do anything (though the less is acts like the mathematical equals, the more confusing it is). – Charles E. Grant Nov 18 '11 at 7:59
• @CharlesE.Grant: I think you're right, I was reading from this page which says "primary expression is a postfix expression" which got me wondering why the reverse is not true. I think the correct wording should be "primary expression may be a postfix expression". – user873521 Nov 18 '11 at 8:51
• when A is B then B is also A this is not true. Not always at least. You seems to not understand what bijectivity means and that an « is » relation doesn't have to be bijective. – deadalnix Nov 18 '11 at 11:19
• I would say your grasp of mathematics appears to be flawed (or at least limited). You're taking a concept that comes from set theory and attempting to apply an equality comparison to it. – Joel Etherton Nov 18 '11 at 12:33

But In mathematic sense, when A is B then B is also A

From a logical perspective, the verb "to be" is overloaded. In this sentence, "is" means "identity", which is a symmetric, reflexive, transitive relation, so A = B <=> B = A. If Superman is Clark Kent, then Clark Kent is also Superman.

In the example you quoted, "a primary expression is also a postfix expression", "is" means "for every x, if x has property A then x also has property B". This is not a symmetric relation. For example, every human is mortal, but not every mortal is human. (Sometimes, this is shortened to "humans are mortal" or in this case "A human is moral, provided...")

Another common use is "x is F" as in "Socrates is human", where "is" means "exemplifies the property" or "has the property". This is not a relation (not in first order logic, anyway), so the terms reflective/symmetric/transitive don't really apply, but you can't deduce from "Socrates is human" that "human is Socrates" or from "Socrates is human and Mike Tyson is human" that "Socrates is Mike Tyson".

The difference is that Socrates, Clark Kent and Superman are individuals (and A and B are meant to be variables referring to individuals) while "primary expression", "postfix expression", "human", "mortal" are properties.

Things get really weird when you have a sentence like "Socrates was Plato's teacher", because "Plato's teacher" is a property, but only one individual has (had) this property, so it can also be used as a name for that individual (in fact, according to some theories of naming, proper names like "Plato" and "Socrates" are simply properties that are only exemplified by one individual and names of fictional characters like "Clark Kent" and "Superman" are actually properties that aren't exemplified by anything). So you might deduce from "Socrates was Plato's Teacher" and "Plato's teacher was poisoned" that "Socrates was poisoned". But this is really a border case that only works because Plato had only one teacher.

But In mathematic sense, when A is B then B is also A. I don't get this. How come this is not true? what sort of logic is this or am i missing something here?

To give it a mathematical sense, you have to define the meaning of is in the sentence ''A is B'' in a precise, mathematical way.

I will use small letters from now on (''a is b'' instead of ''A is B'') to indicate elements of a set, and capital letters to indicate sets.

Take a set A and a relation R that is a subset of A x A, i.e. a set of pairs {(a1, b1), (a2, b2) ... | a1, a2, b1, b2, ... in A}. Instead of writing "(a1, b1) belongs to R", write "a1 R b1".

If the relation is

• Reflexive: for all a in A, we have a R a.
• Symmetric: for all a, b in A, we have that a R b implies b R a.
• Transitive: for all a, b, c in A, we have that a R b and b R c implies a R c.

then R is called an equivalence relation.

An example of an equivalence relation is the following:

• A is the set of all Java String objects.
• For any two strings s1, s2, define s1 R s2 if and only if s1.equals(s2)

A particular equivalence relation is the identity. R is the identify of a set A, if, for all a, b in A, a R b implies a = b. ('=' is equal in a mathematical sense). An example in Java is the == operator on objects, i.e., for two objects o1, o2, let o1 R o2 if and only if o1 == o2.

Coming back to your question: "A is B then B is also A" refers to a symmetric relation, and the two Java examples above (relations induced by equals(), ==) are example thereof. In this case, a programming language feature corresponds to your "mathematic sense".

There is however, another informal use of "A is B". Let A and B be two sets, and A a subset of B. In this case we say "A is B" (e.g. a Dialog is a Widget) meaning "an element a of A is also an element of B". In general, A is a subset of B does not imply that B is a subset of A. This is only the case when the two sets are equal. Note that the subset relation is a relation between sets and not between their elements.

If A is a subset of B but A is not equal to B, we say that A is a proper subset of B. In your example, the set of primary expressions is a proper subset of the set of postfix expressions.

So, according to the context and the precise definition of "A", "B", and "is" your statement "when A is B then B is also A" can be true or false.

You can look for examples of logic in programs, but the question I think you're answering isn't really appropriate (if you're asking it as a logician), since programs are sets of instructions not logical statements (in the symbolic logic sense).

But In mathematic sense, when A is B then B is also A.

Not necessarily. Any asymmetric relation fails that equation.

What kind of logic is applied in programming?

It depends what is being done. Mathematics logic would fit that best in signal processing.

• What is an asymmetric function? – Giorgio Nov 18 '11 at 8:57
• @Giorgio Opposite of symmetric. If `A==B` is true, then `B==A` is false – BЈовић Nov 18 '11 at 9:36
• This doesn't answer the question at all. – Dipan Mehta Nov 18 '11 at 9:58
• @VJo: Ah, you mean a relation that is not simmetric. A function is a particular relation, and the only simmetric function (function that is a simmetric relation) is the identity. So I think you mean simmetric and non-simmetric relations. – Giorgio Nov 18 '11 at 10:34
• @Giorgio Correct. Edited question – BЈовић Nov 18 '11 at 11:50

The disconnect that you have described can be answered by predicate logic, which deals with relationships between classes of objects.
For example "All ostriches are birds" is a true statement, but "All birds are ostriches" is a false statement.
Therefore in this branch of maths, it is not necessarily true that every relation is symmetric,
e.g. all A's are B's therefore all B's are A's.

the value of A and B are the same but their location in the computer's memory are different

Reading the concept of references would perhaps give your stated logic a satisfaction http://en.wikipedia.org/wiki/Reference_(computer_science)

Every primary expression is a postfix expression but a postfix expression is not primary expression.

(I have my doubts as to the accuracy of that statement. Did you transcribe it correctly?)

But the answer is that since the statement is using the phrase "is a" it is talking about sets and using set logic.

The first part of the statement translates to:

``````ForAll(e In PrimaryExpression | e In PostfixExpression)
``````

the second part doesn't parse as English so I won't attempt to translate it.

What you have here is not a problem with programming or logic, but an English comprehension problem.

The verb “be” has many different meanings in English. Human languages very often omit logical connectives like quantifiers. Sometimes, “be” expresses an equivalence:

A mare is an adult female horse.

Stated semi-formally, this sentence means that the word “mare” means the same thing as “adult female horse”.

Sometimes, “be” expresses that a concept is an instance or example of another concept.

A horse is an animal.

States semi-formally, this sentence means that any entity that has the property of being a horse also has the property of being an animal.

Which meaning is intended is normally clear from context. In everyday situations, humans automatically infer the right context almost all the time; this is why languages tend to omit precise logical connectives unless they are really necessary. Mathematical texts that deal with somewhat abstract notions often need to make logical connectives very clear, and hence use more precise language, often backed with mathematical notations.

The statement “a primary expression is a postfix expression” is of the second kind. Every expression that belongs to the category of primary expressions also belongs to the category of postfix expressions. This statement does not imply that every postfix expression is a primary expression.

In a comment, you suggest the statement “primary expression may be a postfix expression”. This statement, in everyday english, is wrong. It implies that some primary expressions are postfix expressions, and some are not. This is not the case: every primary expression is a postfix expression. On the other hand, it is true that a postfix expression may be a primary expression: there are postfix expressions that are also primary expressions, and postfix expressions that are not.