object types: superposition

        ket1 + ket2 + ... + ketn
        a superposition is the sum of one or more kets
        superpositions are equal regardless of the order of the kets
        though it is useful in practice to treat superpositions as ordered
        especially if you need to sort the superposition, using either ket-sort, coeff-sort, or sort-by[], etc
        superpositions are intended to be very general in what they can represent
        if a single ket corresponds to say a single synapse, then a superposition corresponds to several synapses active at the same time
        if the coefficients of all the kets in a superposition are either 0 or 1 then the superposition corresponds to a set
        if the coefficients of all the kets in a superposition are positive integers, then the superposition corresponds to a multi-set
        if the coefficients of all the kets in a superposition are floats in range [0,1] then the superposition corresponds to a fuzzy-set
        if the coefficients of all the kets are floats, then the superposition corresponds to a (real valued) vector in some abstract space
        if the superposition has just the right properties, then it is equivalent to a NuPIC Sparse Distributed Representation, ie, a SDR
        however, the most common interpretation of a superposition is just a list
        NB: complex valued coefficients of kets are not supported, and not currently planned to be
        |> is the identity element for superposition addition: sp + |> == |> + sp == sp
        a shuffled superposition is equal to the original superposition: shuffle sp == sp
        superpositions can be: added, subtracted, unioned and intersected
        we also have operators for fuzzy is-membership, and is-subset
        and we have a similarity measure, that compares the similarity of two superpositions
        simm(sp1, sp2), with values in [0,1]. 1 for equality, 0 for completely disjoint, and values in between otherwise

        -- the simplest superposition is a single ket:
        |Fred Smith>

        -- the next simplest superposition is a list:
        -- eg, a list of fruit:
        |apple> + |banana> + |orange> + |pear> + |avocado> + |cherry> + |plum>

        -- however, a list is also a mathematical set:
        {apple, banana, orange, pear, avocado, cherry, plum}

        -- then a list with positive integer coefficients, eg a shopping list:
        5|apple> + 7|orange> + |bread> + |coffee> + |chocolate> + 2|milk>

        -- which is a mathematical multi-set:
        -- https://en.wikipedia.org/wiki/Multiset
        {(apple,5), (orange,7), (bread,1), (coffee,1), (chocolate,1), (milk,2)}

        -- another example of positive integer coefficients (ie, a multi-set) is the prime factorization of a number:
        -- usefully, we have a built in operator that maps positive integers to their factors:
        sa: prime-factors |120>
            3|2> + |3> + |5>

        sa: prime-factors |1234567890>
            |2> + 2|3> + |5> + |3607> + |3803>

        -- and we can represent fuzzy states, such as hungry, tired and lonely:
        -- https://en.wikipedia.org/wiki/Fuzzy_set
        -- eg, very hungry, a little tired and somewhat lonely could be represented as:
        0.94|hungry> + 0.2|tired> + 0.5|lonely>

        -- finally, we can represent vectors as superpositions too:
        -- eg, the vector [0.1, 7.2, 5, 0.09, 3.4] could be represented as:
        0.1|x: 1> + 7.2|x: 2> + 5|x: 3> + 0.09|x: 4> + 3.4|x: 5>
        -- where we have chosen |x: k> as the basis elements, but they can be any strings
        -- where operators applied to any vector result in a new vector
        -- if the operator is a numeric operator, then that is scalar multiplication
        -- if the operator is a simple operator, then sometimes that is sparse matrix multiplication
        -- otherwise, operators are a more general type of "multiplication"

    see also:
        ket, sequence, union, intersection, is-mbr, is-subset, simm