The thing is, a lot of things you think you need a set-builder for, you can actually do directly.

Let's consider some data:

$ grep "^president-era" early-us-presidents.sw president-era |Washington> => |year: 1789> + |year: 1790> + |year: 1791> + |year: 1792> + |year: 1793> + |year: 1794> + |year: 1795> + |year: 1796> + |year: 1797> president-era |Adams> => |year: 1797> + |year: 1798> + |year: 1799> + |year: 1800> + |year: 1801> president-era |Jefferson> => |year: 1801> + |year: 1802> + |year: 1803> + |year: 1804> + |year: 1805> + |year: 1806> + |year: 1807> + |year: 1808> + |year: 1809> president-era |Madison> => |year: 1809> + |year: 1810> + |year: 1811> + |year: 1812> + |year: 1813> + |year: 1814> + |year: 1815> + |year: 1816> + |year: 1817> president-era |Monroe> => |year: 1817> + |year: 1818> + |year: 1819> + |year: 1820> + |year: 1821> + |year: 1822> + |year: 1823> + |year: 1824> + |year: 1825> president-era |Q Adams> => |year: 1825> + |year: 1826> + |year: 1827> + |year: 1828> + |year: 1829>Now we can ask: "Who was the president in 1825?"

-- initially you might try something like this: |x> in "" |early US Presidents: _list> such that <year: 1825|president-era|x> > 0.5 -- but using inverse we can do it directly: inverse-president-era |year: 1825>Indeed, let's do it:

sa: load early-us-presidents.sw sa: create inverse sa: inverse-president-era |year: 1825> |Monroe> + |Q Adams>Now, let's consider some more data:

$ grep "^president-number" early-us-presidents.sw president-number |Washington> => |number: 1> president-number |Adams> => |number: 2> president-number |Jefferson> => |number: 3> president-number |Madison> => |number: 4> president-number |Monroe> => |number: 5> president-number |Q Adams> => |number: 6>And now we might ask: "What was the party of the third president?"

-- again, you might ask it in set-builder form: party |x> for |x> in "" |early US Presidents: _list> such that president-number|x> == |number: 3> -- but once again, it is cleaner and easier to do it directly: sa: inverse-president-number |number: 3> |Jefferson> sa: party inverse-president-number |number: 3> |party: Democratic-Republican>Anyway, the general proposed form for set-builder in BKO is something like this:

KET in SUPERPOSITION such that TRUTH-STATEMENT

and

OP-SEQUENCE KET for KET in SUPERPOSITION such that TRUTH-STATEMENT

And I'm not 100% sure on using "such that". Also considering "st", "such-that", and "where".

And I guess that is about it.

OK. How about some notes first:

1) notice how easy it is to grep sw files to extract what you are interested in. This is the big win from having no multi-line constructs in BKO. Heh, and also the reason why \r and \n are not allowed inside bras and kets.

2) Note how the direct version always mentions "inverse-OP" (here "inverse-president-era" and "inverse-president-number"). This is probably to be expected because it is replacing a set builder, and set builders are in some sense an inverse. I need to explain this clearer sometime.

3) the BKO set-builder notation is much closer to standard SQL and SPARQL than the direct method.

Update: Let's try and expand note (2).

Consider:

{x in R | f(x) = y }

this is the same as the inverse function:

x = f^-1(y)

Likewise, in BKO:

|x> in "" |number: _list> such that foo |x> == |y>

this is the same as the inverse direct version:

inverse-foo |y>

Here, let me show a quick example in the console:

sa: foo |a1> => |y> sa: foo |a2> => |y> sa: foo |a3> => |y> sa: foo |a4> => |y> sa: foo |a5> => |fish> sa: foo |a6> => |soup> sa: foo |a7> => |fish> sa: create inverse sa: inverse-foo |y> |a1> + |a2> + |a3> + |a4> sa: inverse-foo |fish> |a5> + |a7> sa: inverse-foo |soup> |a6>Update: in note (1) above I noted how easy it is to grep sw files. Well, it just occurred to me that it is easy to find supported operators in a sw file.

eg:

$ sed 's/|.*$//g' early-us-presidents.sw | sort | uniq ---------------------------------------- dissolved founded full-name party president-era president-number supported-ops $ sed 's/|.*$//g' improved-imdb.sw | sort | uniq ---------------------------------------- actors movies supported-ops $ sed 's/|.*$//g' imdb-ratings.sw | sort | uniq imdb-rating imdb-rating-self imdb-votes imdb-votes-selfCool and useful!

Home

previous: simple finite sets and soft intersection

next: algebra

updated: 19/12/2016

by Garry Morrison

email: garry -at- semantic-db.org