Element-wise sum of a set of finite sequences

176 views
Skip to first unread message

bongiovanni francesco

unread,
Mar 3, 2016, 5:44:22 AM3/3/16
to tlaplus
Hello,

I was wondering how one would specify in an elegant way the sum of finite sequences of integer in a set S.

Example:

Let S = { << 1,2,3 >>, << 3,4,6 >> }

The result of the function would be : << 1+3, 2+4, 3+6>> that the finite sequence <<4,6,9>>

The function has to work for an arbitrary number of finite sequences, provided they have the same length obviously.

Could someone guide towards this spec please ?

Thanks in advance !

- Francesco

Stephan Merz

unread,
Mar 3, 2016, 6:06:12 AM3/3/16
to tla...@googlegroups.com
Hi Francesco,

as far as I can tell, your function is not well specified for an empty set of sequences, so I'll assume that the function need produce the correct result only when the input set is non-empty. I'll also assume that all sequences have the same length. Then you can write something like the following

(* Auxiliary function to sum the i-th components of all sequences in S *)
sumi(i,S) ==
  LET s[T \in SUBSET S] ==
      IF T = {} THEN 0
      ELSE LET x == CHOOSE x \in T : TRUE
           IN  x[i] + s[T \ {x}]
  IN  s[S]

SumSet(S) ==
  LET l == Len(CHOOSE x \in S : TRUE)
  IN  [i \in 1 .. l |-> sumi(i,S)]

(Of course, you can put the definition of sumi inside the LET in the definition of SumSet if you don't want that operator to be visible on the top level.)

I used TLC to check that

SumSet({<<1,2,3>>, <<3,4,6>>) = <<4,6,9>>  and

SumSet({<<1,2,3>>, <<1,2,3>>, <<1,2,3>>}) = <<1,2,3>>

Best,
Stephan

--
You received this message because you are subscribed to the Google Groups "tlaplus" group.
To unsubscribe from this group and stop receiving emails from it, send an email to tlaplus+u...@googlegroups.com.
To post to this group, send email to tla...@googlegroups.com.
Visit this group at https://groups.google.com/group/tlaplus.
For more options, visit https://groups.google.com/d/optout.

bongiovanni francesco

unread,
Mar 3, 2016, 6:26:20 AM3/3/16
to tlaplus
Hi Stephan,

Thanks a lot for your input. It's close to what I had in mind but for the case of
SumSet({<<1,2,3>>, <<1,2,3>>, <<1,2,3>>}) = <<1,2,3>>, actually the good result should be : <<3,6,9>>

Basically I would like the regular `vector` addition :)


- Francesco

Stephan Merz

unread,
Mar 3, 2016, 7:31:17 AM3/3/16
to tla...@googlegroups.com
SumSet({<<1,2,3>>, <<1,2,3>>, <<1,2,3>>}) = <<1,2,3>>, actually the good result should be : <<3,6,9>> 

That shows that you don't want the input given as a set:

{<<1,2,3>>, <<1,2,3>>, <<1,2,3>>} = {<<1,2,3>>}

It's easy to adapt the function so that it takes a sequence of sequences as input.

Cheers,
Stephan

bongiovanni francesco

unread,
Mar 3, 2016, 7:51:31 AM3/3/16
to tlaplus
Yes exactly, rookie mistake :D

Thanks again for your insights !
Reply all
Reply to author
Forward
0 new messages