Not an issue, just to warn readers.
Given this (case #1):
dataprop A(i:int) =
| A1(1)
| AN(i) of A(i-1)
One can say:
prval pf_a1:A(1) = A1{1}()
prval pf_a2:A(2) = AN{2}(pf_a1)
However, given this (case #2):
dataprop A(i:int) =
| A1(1)
| AN(i+1) of A(i)
One would need to say:
prval pf_a1:A(1) = A1{1}()
prval pf_a2:A(2) = AN{1}(pf_a1)
For pf_a2, the type index is indeed 2, this is just that i is said to be
the index of pf_a1, which is 1.
Constraint parameters (is that the words?) and type indexes, do not always
match, it depends on the way the constraints are expressed. I believe it’s
better to make both match.
Another way to define A as in the second case, with index and constraint
parameter matching as in the first case (case #3):
dataprop A(i:int) =
| A1(1)
| {i:int}{j:int;i==j+1} AN(i) of A(j)
Now one may say as in case #1:
prval pf_a1:A(1) = A1{1}()
prval pf_a2:A(2) = AN{2}(pf_a1)
Beware of this, as this may sometime looks like a trap. I personally will
ban the style of case #2, to make constraints parameter and indexes match.