finding the transpose of a table
I thought for ages that to make a transpose of a table, I would have to write entirely new table code. That would take quite some work, so I put it off. Well, just occurred to me today that maybe that is not the case. At least some of the time. An example below:
Recall the example bots data that you would need as a bare minimum to build a chat-bot.
Now, lets show the standard table, and then its transpose:
sa: load bots.sw
sa: table[bot,*] starts-with |bot: >
+---------+---------+---------+---------+------------+-----------------+-----------------+-----------------+-----------------+---------------------+-------------+------------+------------+------------------------+-------------+--------------+------------------+-----------------+----------+-----+----------+-------------+
| bot | name | mother | father | birth-sign | number-siblings | wine-preference | favourite-fruit | favourite-music | favourite-play | hair-colour | eye-colour | where-live | favourite-holiday-spot | make-of-car | religion | personality-type | current-emotion | bed-time | age | hungry | friends |
+---------+---------+---------+---------+------------+-----------------+-----------------+-----------------+-----------------+---------------------+-------------+------------+------------+------------------------+-------------+--------------+------------------+-----------------+----------+-----+----------+-------------+
| Bella | Bella | Mia | William | Cancer | 1 | Merlot | pineapples | punk | Endgame | gray | hazel | Sydney | Paris | Porsche | Christianity | the guardian | fear | 8pm | 31 | | |
| Emma | Emma | Madison | Nathan | Capricorn | 4 | Pinot Noir | oranges | hip hop | No Exit | red | gray | New York | Taj Mahal | BMW | Taoism | the visionary | kindness | 2am | 29 | | |
| Madison | Madison | Mia | Ian | Cancer | 6 | Pinot Noir | pineapples | blues | Death of a Salesman | red | amber | Vancouver | Uluru | Bugatti | Islam | the performer | indignation | 10:30pm | 23 | starving | Emma, Bella |
+---------+---------+---------+---------+------------+-----------------+-----------------+-----------------+-----------------+---------------------+-------------+------------+------------+------------------------+-------------+--------------+------------------+-----------------+----------+-----+----------+-------------+
Yeah, a line-wrapped mess! Now, this time the transpose:
-- first define some operators:
Bella |*> #=> apply(|_self>,|bot: Bella>)
Emma |*> #=> apply(|_self>,|bot: Emma>)
Madison |*> #=> apply(|_self>,|bot: Madison>)
-- show the table:
sa: table[op,Bella,Emma,Madison] supported-ops starts-with |bot: >
+------------------------+--------------+---------------+---------------------+
| op | Bella | Emma | Madison |
+------------------------+--------------+---------------+---------------------+
| name | Bella | Emma | Madison |
| mother | Mia | Madison | Mia |
| father | William | Nathan | Ian |
| birth-sign | Cancer | Capricorn | Cancer |
| number-siblings | 1 | 4 | 6 |
| wine-preference | Merlot | Pinot Noir | Pinot Noir |
| favourite-fruit | pineapples | oranges | pineapples |
| favourite-music | punk | hip hop | blues |
| favourite-play | Endgame | No Exit | Death of a Salesman |
| hair-colour | gray | red | red |
| eye-colour | hazel | gray | amber |
| where-live | Sydney | New York | Vancouver |
| favourite-holiday-spot | Paris | Taj Mahal | Uluru |
| make-of-car | Porsche | BMW | Bugatti |
| religion | Christianity | Taoism | Islam |
| personality-type | the guardian | the visionary | the performer |
| current-emotion | fear | kindness | indignation |
| bed-time | 8pm | 2am | 10:30pm |
| age | 31 | 29 | 23 |
| hungry | | | starving |
| friends | | | Emma, Bella |
+------------------------+--------------+---------------+---------------------+
Now it is all nice and pretty!
Now, let's tweak it. In the above case I used all known operators supported by our three bot profiles "supported-ops starts-with |bot: >". We can narrow it down to a list of operators of interest. Here is a worked example:
-- define operators of interest:
sa: list-of |interesting ops> => |op: mother> + |op: father> + |op: hair-colour> + |op: eye-colour> + |op: where-live> + |op: age> + |op: make-of-car>
-- show the table:
sa: table[op,Bella,Emma,Madison] list-of |interesting ops>
+-------------+---------+----------+-----------+
| op | Bella | Emma | Madison |
+-------------+---------+----------+-----------+
| mother | Mia | Madison | Mia |
| father | William | Nathan | Ian |
| hair-colour | gray | red | red |
| eye-colour | hazel | gray | amber |
| where-live | Sydney | New York | Vancouver |
| age | 31 | 29 | 23 |
| make-of-car | Porsche | BMW | Bugatti |
+-------------+---------+----------+-----------+
Cool! And it shows some of the power of the BKO scheme, and the usefulness of ket representations of operators (eg: |op: mother>).
Update: I guess they are kind of duals:
foo |Fred> => ...
Fred |op: foo> => apply(|_self>,|Fred>)
Home
previous: brief object orientated vs bko example
next: working towards natural language
updated: 19/12/2016
by Garry Morrison
email: garry -at- semantic-db.org