Working on a problem posed in this thread
https://www.statalist.org/forums/for...other-variable
I discovered to my shock that triple conditions such as relimp==relat==1 and relimp==relat==3 do not do what I expect them to do.

In my mind, (relimp==relat==1) should be equivalent to (relimp==relat & relat==1). But it is not so, as the example below demonstrates.

To have some data to work with

Code:
* Example generated by -dataex-. To install: ssc install dataex
clear
input long id byte wave float(relimp relat)
110 1 1 1
116 1 1 1
116 2 1 1
116 3 1 1
123 1 3 3
123 2 3 3
123 3 3 2
123 4 3 3
123 5 3 2
126 2 3 3
126 3 3 3
126 4 3 3
138 3 3 2
end
I want to generate two dummies, dummy1 equal to one when relimp==relat==1, and dummy3 equal to one when relimp==relat==3. And the triple condition fails me in both cases:

Code:
. gen dummy1 = relimp==relat==1

. gen dummy11 = relimp==relat & relat==1

. gen dummy3 = relimp==relat==3

. gen dummy33 = relimp==relat & relat==3

. compare dummy1 dummy11

                                        ---------- difference ----------
                            count       minimum      average     maximum
------------------------------------------------------------------------
dummy1=dummy11                  7
dummy1>dummy11                  6             1            1           1
                       ----------
jointly defined                13             0     .4615385           1
                       ----------
total                          13

. compare dummy3 dummy33

                                        ---------- difference ----------
                            count       minimum      average     maximum
------------------------------------------------------------------------
dummy3<dummy33                  6            -1           -1          -1
dummy3=dummy33                  7
                       ----------
jointly defined                13            -1    -.4615385           0
                       ----------
total                          13

. list, sep(0)

     +-------------------------------------------------------------------+
     |  id   wave   relimp   relat   dummy1   dummy11   dummy3   dummy33 |
     |-------------------------------------------------------------------|
  1. | 110      1        1       1        1         1        0         0 |
  2. | 116      1        1       1        1         1        0         0 |
  3. | 116      2        1       1        1         1        0         0 |
  4. | 116      3        1       1        1         1        0         0 |
  5. | 123      1        3       3        1         0        0         1 |
  6. | 123      2        3       3        1         0        0         1 |
  7. | 123      3        3       2        0         0        0         0 |
  8. | 123      4        3       3        1         0        0         1 |
  9. | 123      5        3       2        0         0        0         0 |
 10. | 126      2        3       3        1         0        0         1 |
 11. | 126      3        3       3        1         0        0         1 |
 12. | 126      4        3       3        1         0        0         1 |
 13. | 138      3        3       2        0         0        0         0 |
     +-------------------------------------------------------------------+
Does anybody know why Stata does not interpret (relimp==relat==1) as equivalent to ( relimp==relat & relat==1), and where this behaviour is explained?