Corrections:
NB. Proposal - a "set" is a sorted list of boxes, without repetitions.
set =: ([: /:~ ~.) : [: NB. usage set list-of-boxes creates a set
Improvement:
is =: -: NB. usage set is set
Add:
IsSet =: (-: ~.)*.(1 = #...@$)*.(32 = 3!:0) NB. usage IsSet array
Please test these and report errors.
Kip Murray wrote:
> 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
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm