Unable to mark content of list non-blank
Take the following example:
T[ottt:IRI :sub, ottt:NEList<rdfs:Property> :preds, ottt:IRI :obj] :: {
cross | Triple(:sub, ++:preds, :obj)
} .
this is not correct, as the content of :preds
is not marked as non-blank, but is used as an argument to a non-blank parameter.
A simple solution could be to allow the following declaration: NEList<! rdfs:Property> :preds
.
Another solution could be to make blanks and non-blanks part of the type system, by introducing two more construcotrs:
Blank<T> subtypeOf T,
NonBlank<T> subtypeOf T,
if T subtypeOf T' then
Blank<T> subtypeOf Blank<T'> and
NonBlank<T> subtypeOf NonBlank<T'>
and let a constant blank node have type LUB<Blank<rdfs:Resource>>
and a constant IRI have type LUB<NonBlank<ottt:IRI>>
.
Then all of the checks for non-blanks is automatically done by the type system.
Furthermore, I suggest that we let NEList<T> = NonBlank<NEList<T>>
and List<T> = NonBlank<List<T>>
, that is, lists are always non-blank. This will solve the problem of having blanks as arguments to list variables with expansion modifiers, leading to an underspecified expansion.