member \ element set -- flag

set= \ set1 set2 -- flag

subset \ set1 set2 -- flag

The parameters on the left sides above are located on the zst-stack. The 'element' could be a single (on the zst-stack) or a set. The flag is true or false on the ordinary stack. To check if a non negative single number on the parameter stack is a member in a set (located on the zst-stack), use the word

smember \ n set -- flag

3 { 1 2 3 4 } smember . -1 ok

Using member

3 >zst { 1 2 3 4 } member . -1 ok

Except from set operations like

union \ s1 s2 -- s3

intersection \ s1 s2 -- s3

diff \ s1 s2 -- s3

powerset \ s1 -- s2 (s2 = set of all subsets of s1)

cartprod \ s1 s2 -- s3 (Cartesian product)

cardinality \ s1 -- n (n = number of elements in s1)

and the possibility to create small sets

{ 10 10000 | prime } cardinality . 1225 ok

there are a lot of cryptic words to manipulate even rather big sets of non negative integers

intcond \ low hi xt -- | -- s "intervall condition"

setcond \ xt -- | s -- s' "set condition"

intimage \ low hi xt -- | -- s "intervall image"

setimage \ xt -- | s -- s' "set image"

paircond \ xt -- | s -- s'

pairimage \ xt -- | s -- s'

int2cond \ low hi n xt -- | -- s "intervall two-condition"

int2image \ low hi n xt -- | -- s "intervall image"

set2cond \ n xt -- | s -- s' "set condition"

set2image \ n xt -- | s -- s' "set image"

Inspired by the idea of orthogonal instructions I created a simple syntax just for set manipulations, to summarize and simplify the use of the words above:

variable zp

variable cf2

: condition ' 0 cf2 ! sp@ zp ! ;

: function ' 2 cf2 ! sp@ zp ! ;

: 2dim ' -1 cf2 ! sp@ zp ! ;

: syntax sp@ zp @ - 0= if 0 0 else 1 then cf2 @ ;

The word syntax check the number of input parameters and put a dummy parameter on the stack when needed.

(I have started to use the ANS-Forth notation for locals and will reform the code and the blog. It's awkward, but "forthish" awkward since it loads the parameters in the reversed direction:

k l m n locals| n m l k |

It has some advantages even if it looks strange.)

The ten cryptic words are now squeezed into the three words

create-set

filter-set

transform-set

\ e.g. 1 20 condition < 7 create-set

: create-set \ m n xt nr -- set

syntax locals| cf k nr xt n m |

k cf or

case 0 of m n xt intcond endof

1 of m n nr xt int2cond endof

2 of m n xt intimage endof

3 of m n nr xt int2image endof

endcase ;

\ e.g. condition > 5 filter-set

: filter-set \ set xt nr -- set'

syntax locals| cf k nr xt |

cf 0< if xt paircond exit then k

case 0 of xt setcond endof

1 of nr xt set2cond endof

endcase ;

\ e.g. 2dim + transform-set

: transform-set \ set xt nr -- set'

syntax locals| cf k nr xt |

cf 0< if xt pairimage exit then k

case 0 of xt setimage endof

1 of nr xt set2image endof

endcase ;

Creating sets:

1 25 condition prime create-set cr zet.

{2,3,5,7,11,13,17,19,23} ok

10 29 condition coprime 6 create-set cr zet.

{11,13,17,19,23,25} ok

1 10 function 2* create-set cr zet.

{2,4,6,8,10,12,14,16,18} ok

1 10 function * 3 create-set cr zet.

{3,6,9,12,15,18,21,24,27} ok

The word after condition/function must be a defined condition or function for one or two parameters.

Filter sets:

{ 1 25 | all } condition odd filter-set cr zet.

{1,3,5,7,9,11,13,15,17,19,21,23} ok

{ 1 25 | all } condition < 10 filter-set cr zet.

{1,2,3,4,5,6,7,8,9} ok

{ 1 2 3 } zdup cartprod zdup cr zet.

{(3,3),(3,2),(3,1),(2,3),(2,2),(2,1),(1,3),(1,2),(1,1)} ok

2dim < filter-set cr zet.

{(1,2),(1,3),(2,3)} ok

Transform sets:

{ 1 100 | prime } function 2* transform-set ok

function 1- transform-set ok

condition prime filter-set cr zet.

{3,5,13,37,61,73,157,193} ok

1 1000000 condition prime create-set ok

condition < 50 filter-set ok

function + 2 transform-set cr zet.

{4,5,7,9,13,15,19,21,25,31,33,39,43,45,49} ok

{ 1 10 | odd } zdup cartprod ok

2dim + transform-set cr zet.

{2,4,6,8,10,12,14,16,18} ok

The word 2dim works like condition and function but acts on a set of pairs and can be used both for 2-dim conditions and 2-dim functions.

So far those instructions don't works in definitions and they just works for numbers and pairs of numbers.

## No comments:

## Post a Comment