In his e-mail of 1993/02/12 (actually it arrived here a little bit
earlier, but not from his subscription address, so I had to stuff it into
'listserv' by hand) Jean Michel asks why GAP doesn't allow vectors of
Given a list l1,..lr of integers (with no holes -- recognized as a
vector by Gap). I want to construct the list (1,..,d,l1+d,...,lr+d).
So I wrote:
What is the problem? This does not work when l is empty: I get
"Error, Vectors: '+' incompatible types"
Actually this will work in GAP 3.2, but it probably should not be relied
upon to work in later releases.
Indeed, when asked:
Is not this wrong? The vector space of dimension 0 is a perfectly valid
mathematical object -- How to represent its elements?
I beg to differ. The vector space of dimension 0 *over a given field* is
a perfectly valid object. But if we represent vectors in such a vector
space by lists of length zero we have way to find the field this vector
Why is this a problem? Well, what is the scalar product of two empty
vectors? Zero, of course. But which zero? The integer zero, or the
zero from a finite field (but of which characteristic), or the zero
polynomial over some ring? This is basically the problem. We have no
way to find a field for such an empty vector (and thus the zero).
I need to compute an echelonized basis of the space generated by a set of
vectors. If s is this set (represented as a list of vectors),
TriangulizeMat(s) works well excepted when the set is empty:
Error, ... because in the code of the function Length(mat) is taken.
Would not it be easy to fix it so that TriangulizeMat()= ?
Yes, it would be easy to fix 'TriangulizeMat', and I see no problem with
this. Expect this to happen in the near future.
these 2 examples seem to me a symptom of a wrong treatment of empties in
GAP, which forces to add ugly and unnecessary code to handle special
cases. GAP has only one kind of empty, the list  (in contrast to
languages like APL where an empty matrix still may have a shape like
[0,5]). This is fine with me, but then all operations which logically
should accept empty vectors(or matrices, or whatever...) should also
I would formulate this slightly different (though I agree that there is
a problem). In GAP certain information about a vector or a matrix
is simply implicit. For example with vectors the field over which this
vector lies is derived from the entries of this vector. This is why a
vector must have at least one entry. Another example are matrices.
The shape of a matrix is derived from its length and the length of its
rows. Lets for the moment assume that vectors of length zero were legal.
Then we could create a matrix of shape [5,0], namely [,,,,].
But we could not create a matrix of shape [0,5], because how could GAP
guess that each row has length 5, if the matrix has no rows.
Because GAP tries to read of information (the field and the dimension)
about a vector or a matrix from the entries (the elements or the rows)
such a field or matrix may not have zero length.
In spite of this problem I still think that GAP's approach is a good one.
In GAP 2.4 vectors and matrices were different datatypes, and the
neccessary conversions between lists (of lists) and vectors or matrices
were quite a pain. In GAP 3, where everything is just a list, you have
all the powerfull list operations and functions available to apply to
vectors, matrices (and sets too). You can simple extract elements from a
matrix with m[i][j] or change them with an assignment (which you could
not in GAP 2.4).
I cannot see any big problem with IsVector() being true,
but it being false certainly gives me problems.
I hope I could convince that there are problems.
-- .- .-. - .. -. .-.. --- ...- . ... .- -. -. .. -.- .- Martin Sch"onert, Martin.Schoenert@Math.RWTH-Aachen.DE, +49 241 804551 Lehrstuhl D f"ur Mathematik, Templergraben 64, RWTH, D 51 Aachen, Germany