| newref(r, st), class∃(str, class), junkrefs(str, r ' + refs0, mkarraytype(mkclasstype(class)), addarray(r, mkclasstype(class), vals, st)), tdname+∃(str, class), ∀ val. val ∈ vals → ¬ junkref(str, val .refval, st) ∧ is_referencevalue(val) ∧ (val .refval ≠ jvmref → st[val .refval -- _type] .type ≤ mkclasstype(class)) ⊦ r = jvmref, okreftype(refval(r), mkarraytype(mkclasstype(class)), addarray(r, mkclasstype(class), vals, st)) ∧ r ≠ jvmref ∧ r -- _length ∈ addarray(r, mkclasstype(class), vals, st) ∧ is_integervalue(addarray(r, mkclasstype(class), vals, st)[r -- _length]) ∧ 0 ≤ (addarray(r, mkclasstype(class), vals, st)[r -- _length]) .intval ∧ is_arrayref(r, (addarray(r, mkclasstype(class), vals, st)[r -- _length]) .intval, addarray(r, mkclasstype(class), vals, st)) ∧ (∀ j. 0 ≤ j ∧ j < (addarray(r, mkclasstype(class), vals, st)[r -- _length]) .intval → oktype(addarray(r, mkclasstype(class), vals, st)[r -- j '], mkclasstype(class), addarray(r, mkclasstype(class), vals, st))) |
newref(r, st), class∃(str, class), junkrefs(str, r ' + refs0, mkarraytype(mkclasstype(class)), addarray(r, mkclasstype(class), vals, st)), tdname+∃(str, class), ∀ val. val ∈ vals → ¬ junkref(str, val .refval, st) ∧ is_referencevalue(val) ∧ (val .refval ≠ jvmref → st[val .refval -- _type] .type ≤ mkclasstype(class)) ⊦ r = jvmref, is_arrayref(r, n→i(# vals), addarray(r, mkclasstype(class), vals, st)) ∧ (0 ≤ j ∧ j < n→i(# vals) → is_referencevalue(vals[i→n(j)]))
[[CONCRETESIMPRULES : ([CSIMPSEQ : ⊦ oktype (val, mkclasstype(class1), st) ↔ is_referencevalue(val)], [CSIMPSEQ : ⊦ 0 ≤ i ∧ i < n→i(# vals) → (addarray(r, ty, vals, st) [r -- i ' ] ) = vals[i→n(i)]], [CSIMPSEQ : ⊦ 0 ≤ n→i(n)], [CSIMPSEQ : ⊦ intval(i) .intval = i], [CSIMPSEQ : ⊦ is_integervalue(intval(i))], [CSIMPSEQ : ⊦ (addarray(r, ty, vals, st) [r -- _length ] ) = intval(n→i(# vals))], [CSIMPSEQ : ⊦ r -- _length ∈ addarray(r, ty, vals, st)], [CSIMPSEQ : ⊦ okreftype (refval(r), mkarraytype(ty), addarray(r, ty, vals, st))])]]