Here is my latest attempt to model set theory in J. All sets have distinct
elements and are ordered by /:~ so that match -: determines whether two sets
are
the same. Sets must be created by the verb set or by provided operations. The
intention is theoretical not practical! --Kip Murray
]A =: set 0;'b';2 NB. elements 0 'b' 2 are put in boxes preceding the last
┌─┬─┬─┬┐
│0│2│b││
└─┴─┴─┴┘
]B =: set 2;'b';'b';0 NB. same elements so same set
┌─┬─┬─┬┐
│0│2│b││
└─┴─┴─┴┘
A -: B
1
]C =: set 2;'b';'c';'d'
┌─┬─┬─┬─┬┐
│2│b│c│d││
└─┴─┴─┴─┴┘
B sand C NB. intersection, "set and"
┌─┬─┬┐
│2│b││
└─┴─┴┘
B sor C NB. union
┌─┬─┬─┬─┬─┬┐
│0│2│b│c│d││
└─┴─┴─┴─┴─┴┘
(A sand B sor C) -: (A sand B) sor (A sand C) NB. distributive law
1
pwrset A NB. A has 3 elements, power set has 2^3, including the empty set
┌──────┬────────┬────┬──────┬────┬──────┬──┬────┬┐
│┌─┬─┬┐│┌─┬─┬─┬┐│┌─┬┐│┌─┬─┬┐│┌─┬┐│┌─┬─┬┐│┌┐│┌─┬┐││
││0│2││││0│2│b││││0││││0│b││││2││││2│b│││││││b││││
│└─┴─┴┘│└─┴─┴─┴┘│└─┴┘│└─┴─┴┘│└─┴┘│└─┴─┴┘│└┘│└─┴┘││
└──────┴────────┴────┴──────┴────┴──────┴──┴────┴┘
NB. Elements are contained in boxes preceding the last which is always
NB. the Boxed Empty a: (Ace). The use of a: permits a unique and visible
NB. empty set, viz
(,a:) -: E =: A less A NB. see verb less below
1
E
┌┐
││
└┘
a:
┌┐
││
└┘
E -: a:
0
NB. Definitions
E =: ,a: NB. empty set
set =: a: ,~ [: /:~ ~. NB. create set from boxed list y
NB. each box of y encloses an element
get =: { }: NB. get boxed elements (from curtail because
NB. elements are inside boxes of curtail)
isin =: e. }: NB. Do boxes in list x contain elements of y?
less =: a: ,~ -.&}: NB. remove elements of y from x
sand =: [ less less NB. intersection, "set and"
sor =: a: ,~ [: /:~ [: ~. ,&}: NB. union, "set or"
diff =: less sor less~ NB. symmetric difference
card =: [: # }: NB. count elements: cardinality
issubs =: [ -: sand NB. Is x a subset of y?
pwrset =: a: ,~ [: /:~ ] (<@#~) 1 (,~"1) 2 (#"1~ {:)@#:@i...@^ #...@}:
NB. pwrset by Raul Miller, adapted
islist =: 1 = #...@$ NB. islist through isunique from validate.ijs
isboxed =: 0 < L.
issorted =: -: /:~
isunique =: -: ~.
isset =: islist *. isboxed *. (a: -: {:) *. issorted@:}: *. isunique@:}:
NB. isset y asks, is array y a set?
iselement =: <@[ isin ] NB. Is array x an element of set y?
NB. End
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm