u :. v Obverse Conjunction
append1 =: , :. }. NB. Like , but obverse is }. 'ab' append1 'cd' abcd append1^:_1 'abcd' NB. This executes the obverse bcd
The obverse of u is called by u^:_1 or u&.v or u&.:v .
Normally the obverse is the same as the inverse, i.e. a verb that undoes the action of u . But u:.v can be used to assign an obverse when the default inverse is undefined or incorrect.
1. Supply or correct the obverse of a verb so that it can be used as the v of u&.v
verbname =: definition :. correct_inverse
Consider a system that knows two formats for time:
- a 3-atom list of hours/minutes/seconds (hms form)
- an atom containing seconds from midnight (time form)
Verbs to convert between the two formats:
hmstotime =: 24 60 60&#."1 timetohms =: 24 60 60&#:"0 ]hmss =: 2 3 $ 9 30 0 16 0 0 NB. two times in hms... 9 30 0 16 0 0 ]ts =: hmstotime hmss NB. ...and in seconds from midnight 34200 57600
We would like to be able to compute in either format. So we should be able to add times in hms by converting to time and then converting back
hmss +&.hmstotime 0 45 0 NB. go to time form to handle overflow of minutes: 45 minutes after the times 10 15 0 16 45 0
We should be able to add in hms form too:
ts +&.timetohms 60 NB. add 60 seconds to ts... catastrophe! 32949 113491 0 58576 3661 0
What happened!?? We were expecting two times!
u b. _1 shows the inverse of the verb u. That quickly reveals the problem
timetohms b. _1 24 60 60&#."0 hmstotime b. _1 24 60 60&#:"1
Those ranks are incorrect. The inverse of timetohms, which should convert an hms to a time, needs to have rank 1, and the inverse of hmstotime needs to have rank 0. The fix is easy - we assign the correct obverse to each verb
hmstotime =: 24 60 60&#."1 :. timetohms timetohms =: 24 60 60&#:"0 :. hmstotime
ts +&.timetohms 60 34260 57660
- . The default inverses are most ingenious and worth a look.
- . To see the obverse of the verb u, execute u b. _1 .
1. The obverse of u :. v is v :. u. This is not obvious.
u =: + v =: + :. - uv =: u :. v
Now, consider the obverse of uv -- is it v? The definition seems to say so. Since the obverse of uv is defined as v, and v is + :. -, the obverse of the obverse of uv would be -.
Not so. The obverse of uv is actually v :. u rather than simply v
uv b. _1 v :.u
So the obverse of the obverse of uv is u :. v.
uv^:_1^:_1 (5) NB. It uses u (+) instead of v^:_1 (-) 5
It follows that the obverse of the v in u :. v is immaterial because it can never be executed.