Personally I do not see them as missing. Most programming languages, especially the popular Object Oriented ones have collections but the languages are also not split into many variants so if there is only one official version of the language then adding to it becomes the standard. Prolog has variants such as SWI-Prolog, SICStus, GNU Prolog, ECLiPSe, YAP Prolog, and Prolog has the standard definition, which does not define collections, as such they would not be in the base definition of types.
What might be better would be if each add-on/plug-in that used certain types added some has_type/2
predicates, but then again has_type/2
is not in the standard, so each variation of Prolog may or may not have it.
The real problem is that Prolog is such and old language that is still used today, that it did not evolve along the same lines as other languages.
The other way I look at the whole typing thing is that Prolog is not a programming language for solving problems directly, instead Prolog is used to create an intermediate language, and that language is used to solve the problem. I think of Prolog as having an indicator
that on one end points to fully deterministic code, and at the other end points to pure code.
The more deterministic the code is, the more type checking is needed. The more pure the code the less type checking is needed, and in pure code, AFAIK, there should be no type checking because the code should be fully abstract. Also as you move from deterministic to pure, the arguments move from being either strictly input
or output
to being both.
The reason I think you don’t see Prolog talked about in this way is because most people don’t think of it like that and there is no line between the code used for solving the problem and the code used for creating the language to solve the problem.
Make sense. 
I added the image to give some idea of what I am thinking, but I don’t like the colors on the indicator, words such as deterministic
, semi-deterministic
and pure
should be used instead.
Your changes and notes have me rethinking about how I think of has_type/2
and now I am starting to think of it more like Hoare logic instead of typing rules.