That's an interesting topic. And using obverse to represent a 2-ary relation is a good idea.
That said, I think (*: :. ((+,-)@%:)) would be the square relation (assuming I understand what you are getting at)? Thanks, -- Raul On Wed, May 14, 2014 at 4:04 PM, Michal Wallace <[email protected]> wrote: > I've been reading through the following old papers, written by > a fellow named Bruce MacLennan during the 1980's: > > - Introduction to Relational Programming (Jun 1981) > https://archive.org/details/introductiontore00macl > > - Overview of relational programming (Nov 1981) > https://archive.org/details/overviewofrelati00macl > > - A Relational Program for a Syntax Directed Editor (Apr 1982) > https://archive.org/details/relationalprogra00macl > > - Relational Programming (Sep 1983) > https://archive.org/details/relationalprogra83012macl > > - Four Relational Programs (Nov 1986) > https://archive.org/details/fourrelationalpr00macl > > > Like J, this guy's work appears to have been influenced by both APL > and FP (the language proposed by John Backus in his "Can programming > be Liberated from the Von Neumann Style?" talk). > > Also like J, the code tends to be quite terse and expressive. For example, > the syntax directed editor just over 2 pages of typewritten code. > > I've been working on porting the syntax directed editor over to J here: > > https://github.com/tangentstorm/drastic/blob/syndir/syndir.ijs > > I've also got a handful of relational words defined here: > > https://github.com/tangentstorm/tangentlabs/blob/master/j/rel.ijs > > MacLennan's work deals with binary relations, where a relation is > something like a verb/function that may produce more than one result > for a given input, and whose inverse is also a relation. > > For example, whereas (*:) represents the "square function" in J, > (*: :. (+,-)@%:) might represent the "square relation". > > In addition, a binary relation can be defined by creating an array of shape > (n, 2). > > MacLennan's language is untyped, but allows restricting either side of a > relation > by a predicate (which is just a relation mapping objects to boolean > values), so > a relational array might actually contain any number of boxed columns. > > In my code, I've started to implement relations as objects, thinking I > could use > them as a common interface for both the formulaic and tabular varieties. > > I've also created some words that allow you to define relations as a normal > table of values (like you might find in a relational database), plus an > index > at which to "split" the table vertically so it can function as a mapping. > > For example: > > doubles =: (,. +:) i:5 NB. dyadic relation y=2*x, restricted to i:5 > squares =: (,. *:) i:5 NB. dyadic relation y=x^2, restricted to i:5 > > monad ar [a]pplies a (tabular) [r]elation to an input: > > squares ar 4 > 16 > > The converse of a tabular relation is just: > cv =: ( |."_1 ) : ( -@[ |."1 ] ) NB. dydadic case is for n columns + split > > monad ac [a]pplies the [c]onverse of a tabular relation. > > squares ac 4 > _2 > 2 > > Now we can join the two tables on column 0 from each: > > squares 0 0 J doubles > _5 25 _10 > _4 16 _8 > _3 9 _6 > _2 4 _4 > _1 1 _2 > 0 0 0 > 1 1 2 > 2 4 4 > 3 9 6 > 4 16 8 > 5 25 10 > > Applying the converse of this result is something like solving the > following algebra problem: > > NB. Solve for x, given ( 25 = x ^ 2 ) and ( _10 = 2 * x ). > 2 (squares 0 0 J doubles) ac 25 _10 > _5 > > Anyway, this is all in the very early stages but I thought maybe someone > else would find it interesting. The code is all open source under a > permissive > license if anyone's interested in collaborating. > > (It's also what prompted me to look into JDB.) > ---------------------------------------------------------------------- > For information about J forums see http://www.jsoftware.com/forums.htm ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm
