Please try the following, let me know if you find errors.
NB. Proposal - a "set" is a sorted list of boxes.
NB. An element is the array contained in a box.
set =: /:~ NB. usage set list-of-boxes creates a set
count =: # NB. usage count set
in =: <@[ e. ] NB. usage array in set
index =: i. < NB. usage set index array
get =: {:: NB. usage index get set
is =: =&< NB. usage set is set
u =: [: set -. , ] NB. union
n =: [ -. -. NB. intersection
Less =: -. NB. difference
subset =: [ is n NB. usage set subset set
member =: in NB. usage array member set
E =: set 0$<1 NB. empty set
Applying this to Butch's example, I get
]S =: set 1 ; (set(set 3;4);8;<(set 8;9)) ; 10 NB. for < see next note
+-+--+---------------+
|1|10|+-+-----+-----+|
| | ||8|+-+-+|+-+-+||
| | || ||3|4|||8|9|||
| | || |+-+-+|+-+-+||
| | |+-+-----+-----+|
+-+--+---------------+
The set is given in a standard order that makes it easier to test whether a set
is an element of another set and whether two sets have the same members and
thus
are considered to be the same set. Now let
]one =: 1
1
]two =: set (set 3;4);8;<(set 8;9) NB. < overcomes irregularity in ;
+-+-----+-----+
|8|+-+-+|+-+-+|
| ||3|4|||8|9||
| |+-+-+|+-+-+|
+-+-----+-----+
]three =: 10
10
and we see that
(set one;two;three) is S
1
count S
3
(one member S) *. (two member S) *. (three member S)
1
((set 3;4) member two) *. (8 member two) *. ((set 8;9) member two)
1
To get 8 from two you can notice
two index 8
0
and do
0 get two
8
To get that 8 from S you can similarly do
0 get (2 get S)
8
which can be abbreviated
(2;0) get S NB. Get element 2 then get element 0 from that
8
You can now figure out how to get the other 8 from S.
Puzzle:
two member S
1
two subset S
0
(set <two) subset S
1
[email protected] wrote:
> ----- Original Message Follows -----
> From: [email protected]
> To: Programming forum <[email protected]>
> Subject: Re: [Jprogramming] sets within a set
> Date: Thu, 16 Jul 2009 16:19:23 -0800
>
>> I wanted a set made up from:
>>
>> 1. member 1
>> 2. set { { 3, 4}, 8, { 8, 9}}
>> 3. member 10
>>
>> So, I believe I am creating my desired set correctly.
>>
>> I am struggling with howw to extract the 8 from the middle
>> of the "2. set {{3, 4}, 8, {8,9}}'
>>
>> Given testSet=:1; ((3,4); 8; (8,9)); 10
>>
>> I would have thought it was 1 } 1 } testSet, but is not and
>> I get an index
>> error. I do a '# 1 } testSet' and it returns 1
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm