Take the 2-minute tour ×
Mathematica Stack Exchange is a question and answer site for users of Mathematica. It's 100% free, no registration required.

I want to define a vector lets say k containing elements Symbolize[Subscript[k, 1]], k2, k3 ... etc. When I define lets say k4 . I want the symbol automatically added to vector k. Something like below but not working at all.

k /: {k, Symbolize[
 ParsedBoxWrapper[
 SubscriptBox[
 StyleBox["v", FontFamily -> "Courier New", FontWeight -> "Plain", 
   FontSlant -> "Italic"], "_"]]]} := 
AppendTo[k, Subscript[v, _]];

My Question is;

1) How can I symbolically define elements (with sub scripts) automatically added to a vector.

2) If I assign values to symbols, How can I get elements values only and symbols only.

EDIT 1

Symbolize[Subscript[k, _]] 

Command Symbolizes all subscripts of k e.g. k1 (Subscript[k, 1]), k2 (Subscript[k, 2]) etc. This is fine. What I want is collect k1, k2 k3 in a set (List) k with out additional commands or additional functions. Just as soon as sybolize sub scripted ones it should add it self to set k (sort of pattern maching as in Subscript[k, _]). When I call k it should give me the list {k1, k2, k3}. @Mr. Wizards answer gives the list but as calling function ksym. Sort of what I need but not exactly. @halirutan answer is also interesting but I don' t want to define additional functions or operators (may be as minimum as possible).

EDIT 2

Its sort of bag or set; no order is required, only k1,k3 can be given and k2 can be missing.

EDIT 3

<< Notation`
(*below line symbolizes all subscripted k_]*)
Symbolize[ ParsedBoxWrapper[
   SubscriptBox["k", "_"]]]

somewhere here I need additional code that all k_ are added to k once its been defined. For example:

{Subscript[k, 1], Subscript[k, 2], Subscript[k, 3]} = {1, 2, 3}

after that when I ask k it should give me {Subscript[k, 1], Subscript[k, 2], Subscript[k, 3]} as @Mr.Wizard suggested ksym[] := HoldForm @@@ UpValues[k][[All, 1]] and for values kval[] := UpValues[k][[All, 2]] should work. But, what I' m missing in @Mr.Wizard example is that one needs to define symbols as;

k /: Subscript[k, 1] = "val1";
k /: Subscript[k, 2] = "val2";
k /: Subscript[k, 3] = "val3";

what I need is once I write {Subscript[k, 1], Subscript[k, 2], Subscript[k, 3]} = {1, 2, 3} I should be able to get k vector and {Subscript[k, 1], Subscript[k, 2], Subscript[k, 3]} is appended automatically to k.

share|improve this question
    
I think I don't really understand your second question. Could you write a bit more what you mean exactly? –  halirutan Mar 31 '13 at 5:56
    
@halirutan Thank you for your answer. Please see the edit as well as Mr. Wizards answer. It's very close to what I asked for. –  s.s.o Mar 31 '13 at 19:18
    
Have you thought about what should happen if you define $k_1$ and $k_3$, but not $k_2$? Does the resulting list only contain $\{k_1, k_3\}$ or is there supposed to be some placeholder for $k_2$? Can't really answer your question if that isn't defined first. –  Jens Apr 1 '13 at 0:51
    
@Jens Its sort of bag or set neither order is required nor k1,k2,k3, so k2 can be missing. –  s.s.o Apr 1 '13 at 8:57
    
s.s.o, you haven't responding to my question in the comments below my answer. I'd still like to help further if I can. You may be interested in this, but I think a different syntax is a better way to approach the problem. –  Mr.Wizard Apr 8 '13 at 4:30
show 1 more comment

2 Answers 2

up vote 1 down vote accepted

Method #1

If you define each Subscript using TagSet(1)(2) the value will be associated with the Symbol, e.g. k:

k /: Subscript[k, 1] = "val1";
k /: Subscript[k, 2] = "val2";
k /: Subscript[k, 3] = "val3";

You could then use definitions such as:

kval[] := UpValues[k][[All, 2]]

ksym[] := HoldForm @@@ UpValues[k][[All, 1]]

These will always be up to date as they are dynamically generated:

kval[]

{"val1", "val2", "val3"}

ksym[]

{k1, k2, k3}

Each "symbol" name is wrapped in HoldForm to prevent evaluation; ReleaseHold may be used to trigger it.

These definitions assume that no other UpValues for k are generated but if there are that can be addressed with pattern matching at the expense of speed.


Method #2

Following your update EDIT 3 here is another approach you might consider. Start by setting HoldFirst on Subscript so that k may be used without forming an infinite recursion, then make a definition for k that extracts the matching rules from the DownValues list:

SetAttributes[Subscript, HoldFirst]

k := Cases[DownValues@Subscript, (_[x : Subscript[k, _]] :> _) :> Hold[x]]

Make some assignments and check k:

{Subscript[k, 1], Subscript[k, 2], Subscript[k, 3]} = {"a", "b", "c"}

k
{Hold[Subscript[k, 1]], Hold[Subscript[k, 2]], Hold[Subscript[k, 3]]}

The subscripts are returned in held form, for further processing. One can use ReleaseHold to recover the values:

k // ReleaseHold
{"a", "b", "c"}
share|improve this answer
    
@ Mr. Wizard your guess is wright :) Please see the edit 1 if it needs further clarification. –  s.s.o Mar 31 '13 at 19:19
    
@s.s.o Could you explain for me in what way my proposal is lacking? I see a problem with your specification in that it is not likely practical (though not entirely impossible) to have a single symbol k serve both purposes, so if your objection is to the use of a different symbol (kval, ksym) I'm not sure that can be fixed in a robust way. Again if things like this are acceptable more possibilities open, but I would not choose that here myself. –  Mr.Wizard Apr 1 '13 at 10:12
    
@ Mr.Wizard please see the edit 3 if it needs further explanation. –  s.s.o Apr 16 '13 at 9:41
    
@s.s.o please see my update and tell me if this does what you want, or if it is at least getting close. –  Mr.Wizard Apr 17 '13 at 8:24
    
@ Mr.Wizard I think it's very close to what I asked for. I'll check it tonight. Thank you for your efforts. –  s.s.o Apr 17 '13 at 10:21
add comment

Although I don't like the Notation stuff very much, I regard the question as very nice, because it offers some insight into the evaluation process. When you bind UpValues to the symbol k and k has DownValues (because you want it to hold your list too), you have to make sure that k is not evaluated because otherwise the rule you gave as UpValues never kicks in.

One way to prevent this is to use an operator which holds its arguments anyway. One such an operator is += which could be interpreted in your context as append another k_n to the vector k. To keep it as simple as possible, let's say I want to following notation:

k+=1

which means, append $k_1$ to the vector $k$. If $k$ has no value, create a new list and put $k_1$ as first element.

<< Notation`
k /: k += n_ := With[{sn = ToString[n]},
  If[! ValueQ[k], k = {}];
  Symbolize[ParsedBoxWrapper[SubscriptBox["k", sn]]];
  AppendTo[k, 
   ToExpression["k\[UnderBracket]Subscript\[UnderBracket]" <> sn]]
]

And now everything happens automatically.

Table[k += i, {i, 10}];
k

Mathematica graphics

share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.