Skip to content

Commit c76b6b5

Browse files
committed
Subtype rules checked and complete; some may be redundant
1 parent 10b6ac4 commit c76b6b5

File tree

1 file changed

+109
-122
lines changed

1 file changed

+109
-122
lines changed

specification/dartLangSpec.tex

Lines changed: 109 additions & 122 deletions
Original file line numberDiff line numberDiff line change
@@ -21869,43 +21869,41 @@ \subsection{Subtypes}
2186921869
}
2187021870

2187121871
\LMHash{}%
21872-
%% TODO(eernst): Introduce these specialized intersection types
21873-
%% in a suitable location where type promotion is specified.
21874-
Types of the form
21875-
\IndexCustom{$X \& S$}{type!of the form $X \& S$}%
21876-
\IndexExtraEntry{\&@$X \& S$}
21877-
arise during static analysis due to type promotion
21872+
Intersection types
21873+
(\commentary{types of the form \code{$X$\,\&\,$S$}}),
21874+
may arise during static analysis due to type promotion
2187821875
(\ref{typePromotion}).
2187921876
They never occur during execution,
21880-
they are never a type argument of another type,
21881-
nor a return type or a formal parameter type,
21882-
and it is always the case that $S$ is a subtype of the bound of $X$.
21883-
\commentary{%
21884-
The motivation for $X \& S$ is that it represents
21885-
the type of a local variable $v$
21886-
whose type is declared to be the type variable $X$,
21887-
and which is known to have type $S$ due to promotion.
21888-
Similarly, $X \& S$ may be seen as an intersection type,
21889-
which is a subtype of $X$ and also a subtype of $S$.
21890-
Intersection types are \emph{not} supported in general,
21891-
only in this special case.%
21892-
}
21893-
Every other form of type may occur during static analysis
21894-
as well as during execution,
21895-
and the subtype relationship is always determined in the same way.
21877+
and there are many other restrictions on where they can occur
21878+
(\ref{intersectionTypes}).
21879+
However, their subtype relations are specified without restrictions.
21880+
\commentary{%
21881+
It causes no problems that these rules will not be used
21882+
in their full generality.%
21883+
}
2189621884

21885+
!!! Renumber!
2189721886
% Subtype Rule Numbering
2189821887
\newcommand{\SrnReflexivity}{1}
21899-
\newcommand{\SrnTop}{2}
21900-
\newcommand{\SrnBottom}{3}
21901-
\newcommand{\SrnNull}{4}
21902-
\newcommand{\SrnLeftTypeAlias}{5}
21903-
\newcommand{\SrnRightTypeAlias}{6}
21888+
\newcommand{\SrnRightTop}{2}
21889+
\newcommand{\SrnLeftTop}{3}
21890+
\newcommand{\SrnBottom}{4}
21891+
\newcommand{\SrnRightObjectOne}{5.1}
21892+
\newcommand{\SrnRightObjectTwo}{5.2}
21893+
\newcommand{\SrnRightObjectThree}{5.3}
21894+
\newcommand{\SrnRightObjectFour}{5.4}
21895+
\newcommand{\SrnNullOne}{6.1}
21896+
\newcommand{\SrnNullTwo}{6.2}
2190421897
\newcommand{\SrnLeftFutureOr}{7}
21898+
\newcommand{\SrnLeftNullable}{7b}
2190521899
\newcommand{\SrnTypeVariableReflexivityA}{8}
2190621900
\newcommand{\SrnRightPromotedVariable}{9}
2190721901
\newcommand{\SrnRightFutureOrA}{10}
2190821902
\newcommand{\SrnRightFutureOrB}{11}
21903+
\newcommand{\SrnRightNullableOne}{11b.1}
21904+
\newcommand{\SrnRightNullableTwo}{11b.2}
21905+
\newcommand{\SrnRightNullableThree}{11b.3}
21906+
\newcommand{\SrnRightNullableFour}{11b.4}
2190921907
\newcommand{\SrnLeftPromotedVariable}{12}
2191021908
\newcommand{\SrnLeftVariableBound}{13}
2191121909
\newcommand{\SrnRightFunction}{14}
@@ -21926,34 +21924,47 @@ \subsection{Subtypes}
2192621924
\def\RuleRawRaw#1#2#3#4{\centerline{\inference[#1]{#3}{#4}}\VSP}
2192721925
%
2192821926
\begin{minipage}[c]{0.49\textwidth}
21929-
\Axiom{\SrnReflexivity}{Reflexivity}{S}{S}
21930-
\Axiom{\SrnBottom}{Left Bottom}{\bot}{T}
21927+
\Axiom{\SrnReflexivity}{Reflexivity}{T}{T}
21928+
\Axiom{\SrnBottom}{Left Bottom}{\code{Never}}{T}
21929+
\RuleRaw{\SrnRightObjectTwo}{Right Object 2}{%
21930+
\SubtypeStd{S}{\code{Object}}}{\code{$X$\,\&\,$S$}}{\code{Object}}
21931+
\RuleRaw{\SrnRightObjectThree}{Right Object 3}{%
21932+
\SubtypeStd{S}{\code{Object}}}{\code{FutureOr<$S$>}}{\code{Object}}
21933+
\Axiom{\SrnNullOne}{Left Null One}{\code{Null}}{\code{$T$?}}
2193121934
\end{minipage}
2193221935
\begin{minipage}[c]{0.49\textwidth}
21933-
\RuleRaw{\SrnTop}{Right Top}{T \in \{\code{Object}, \DYNAMIC, \VOID\}}{S}{T}
21934-
\RuleRaw{\SrnNull}{Left Null}{T \not= \bot}{\code{Null}}{T}
21936+
\RuleRaw{\SrnRightTop}{Right Top}{%
21937+
T \in \{\code{Object?}, \DYNAMIC, \VOID\}}{S}{T}
21938+
\RuleRaw{\SrnLeftTop}{Left Top}{%
21939+
S \in \{\DYNAMIC, \VOID\} & \SubtypeStd{\code{Object?}}{T}}{S}{T}
21940+
\RuleRaw{\SrnRightObjectOne}{Right Object 1}{%
21941+
\code{$X$\,\EXTENDS\,$B$} & \SubtypeStd{B}{\code{Object}}%
21942+
}{X}{\code{Object}}
21943+
\RuleRaw{\SrnRightObjectFour}{Right Object 4}{%
21944+
$S$\,\not\in \{\code{Null}, \DYNAMIC, \VOID\}\\
21945+
\mbox{$S$ is not of the form \code{$U$?}, $X$, %
21946+
\code{$X$\,\&\,$U$}, \code{FutureOr<$U$>}}}{S}{\code{Object}}
21947+
\Rule{\SrnNullTwo}{Left Null Two}{\code{Null}}{T}{%
21948+
\code{Null}}{\code{FutureOr<$T$>}}
2193521949
\end{minipage}
2193621950

21937-
\ExtraVSP
21938-
\RuleRaw{\SrnLeftTypeAlias}{Type Alias Left}{%
21939-
\code{\TYPEDEF{} $F$<\TypeParametersNoBounds{X}{s}> = U} &
21940-
\SubtypeStd{[S_1/X_1,\ldots,S_s/X_s]U}{T}}{\code{$F$<\List{S}{1}{s}>}}{T}
21941-
\RuleRaw{\SrnRightTypeAlias}{Type Alias Right}{%
21942-
\code{\TYPEDEF{} $F$<\TypeParametersNoBounds{X}{s}> = U} &
21943-
\SubtypeStd{S}{[T_1/X_1,\ldots,T_s/X_s]U}}{S}{\code{$F$<\List{T}{1}{s}>}}
21944-
2194521951
\begin{minipage}[c]{0.49\textwidth}
21946-
\RuleTwo{\SrnLeftFutureOr}{Left FutureOr}{S}{T}{%
21947-
\code{Future<$S$>}}{T}{\code{FutureOr<$S$>}}{T}
21952+
\RuleTwo{\SrnLeftFutureOr}{Left FutureOr}{\code{Future<$S$>}}{T}{S}{T}{%
21953+
\code{FutureOr<$S$>}}{T}
2194821954
\RuleTwo{\SrnRightPromotedVariable}{Right Promoted Variable}{S}{X}{S}{T}{
2194921955
S}{X \& T}
2195021956
\Rule{\SrnRightFutureOrB}{Right FutureOr B}{S}{T}{S}{\code{FutureOr<$T$>}}
21957+
\Rule{\SrnRightNullableTwo}{Right Nullable 2}{S}{\code{Null}}{S}{%
21958+
\code{$T$?}}
2195121959
\Rule{\SrnLeftVariableBound}{Left Variable Bound}{\Gamma(X)}{T}{X}{T}
2195221960
\end{minipage}
2195321961
\begin{minipage}[c]{0.49\textwidth}
21962+
\RuleTwo{\SrnLeftNullable}{Left Nullable}{S}{T}{\code{Null}}{T}{
21963+
\code{$S$?}}{T}
2195421964
\Axiom{\SrnTypeVariableReflexivityA}{Left Promoted Variable A}{X \& S}{X}
2195521965
\Rule{\SrnRightFutureOrA}{Right FutureOr A}{S}{\code{Future<$T$>}}{%
2195621966
S}{\code{FutureOr<$T$>}}
21967+
\Rule{\SrnRightNullableOne}{Right Nullable 1}{S}{T}{S}{\code{$T$?}}
2195721968
\Rule{\SrnLeftPromotedVariable}{Left Promoted Variable B}{S}{T}{X \& S}{T}
2195821969
\RuleRaw{\SrnRightFunction}{Right Function}{T\mbox{ is a function type}}{
2195921970
T}{\FUNCTION}
@@ -21989,6 +22000,7 @@ \subsection{Subtypes}
2198922000
\forall j \in 1 .. s\!:\;\SubtypeStd{S_j}{T_j}}{%
2199022001
\code{$C$<\List{S}{1}{s}>}}{\code{$C$<\List{T}{1}{s}>}}
2199122002
\ExtraVSP
22003+
%% !!! Should include mixins (and other non-class interface types, if any).
2199222004
\RuleRaw{\SrnSuperinterface}{Superinterface}{%
2199322005
\code{\CLASS{} $C$<\TypeParametersNoBounds{X}{s}>\,\ldots\,\{\}}\\
2199422006
\Superinterface{\code{$D$<\List{T}{1}{m}>}}{C} &
@@ -22040,10 +22052,9 @@ \subsubsection{Subtype Rules}
2204022052
Whenever a rule contains one or more meta-variables,
2204122053
that rule can be used by
2204222054
\IndexCustom{instantiating}{instantiation!subtype rule}
22043-
it, that is, by consistently replacing
22044-
each occurrence of a given meta-variable by
22045-
concrete syntax denoting the same type
22046-
(\ref{typeType}).
22055+
it, that is, by choosing a specific type $T$ and metavariable $\cal V$,
22056+
and then consistently replacing all occurrences of $\cal V$ by
22057+
concrete syntax denoting $T$.
2204722058

2204822059
\commentary{%
2204922060
In general, this means that two or more occurrences of
@@ -22056,11 +22067,12 @@ \subsubsection{Subtype Rules}
2205622067
can be used to conclude
2205722068
\Subtype{\emptyset}{\code{int}}{\code{int}},
2205822069
where $\emptyset$ denotes the empty environment
22059-
(any environment would suffice because no type variables occur).
22070+
(any environment would suffice because no type variables occur).%
22071+
}
2206022072

22061-
However, the wording `denoting the same type' above covers
22062-
additional situations as well:
22063-
For instance, we may use rule~\SrnReflexivity{}
22073+
\commentary{%
22074+
The phrases `same type' and `identical syntax' deserves some extra scrutiny:
22075+
We may, e.g., use rule~\SrnReflexivity{}
2206422076
to show that \code{p1.C} is a subtype of
2206522077
\code{p2.C} when \code{C} is a class declared in a
2206622078
library $L$ which is imported by libraries $L_1$ and $L_2$ and
@@ -22089,8 +22101,27 @@ \subsubsection{Subtype Rules}
2208922101
}
2209022102

2209122103
\LMHash{}%
22092-
Every \synt{typeName} used in a type mentioned in this section is assumed to
22093-
have no compile-time error and denote a type.
22104+
In this section,
22105+
the notion of two types $T_1$ and $T_2$ being the same type
22106+
is taken to mean that $T_1$ and $T_2$ have the same canonical syntax
22107+
(\ref{standardUpperBoundsAndStandardLowerBounds}).
22108+
22109+
\commentary{%
22110+
In other words, we eliminate the difficulties associated with
22111+
different syntax denoting the same type,
22112+
and different types denoted by the same syntax,
22113+
by assuming that every type in the program has been expressed
22114+
in a manner where those situations never occur,
22115+
because each type is denoted by the same globally unique syntax everywhere.
22116+
Note that `same canonical syntax' also requires
22117+
transitive expansion of all type aliases
22118+
(\ref{typedef}).%
22119+
}
22120+
22121+
\LMHash{}%
22122+
Every \synt{typeName} used in a type mentioned in this section
22123+
is assumed to have no compile-time error,
22124+
and it is assumed to denote a type.
2209422125

2209522126
\commentary{%
2209622127
That is, no subtyping relationship can be proven for
@@ -22138,9 +22169,11 @@ \subsubsection{Subtype Rules}
2213822169
So
2213922170
$\{ \code{X} \mapsto \code{int}, \code{Y} \mapsto \code{double} \} \uplus
2214022171
\{ \code{Z} \mapsto \code{Object} \} =
22141-
\{ \code{X} \mapsto \code{int}, \code{Y} \mapsto \code{double}, \code{Z} \mapsto \code{Object} \}$
22172+
\{ \code{X} \mapsto \code{int}, \code{Y} \mapsto \code{double}, %
22173+
\code{Z} \mapsto \code{Object} \}$
2214222174
and
22143-
$\{ \code{X} \mapsto \code{int}, \code{Y} \mapsto \code{FutureOr<List<double>{}>} \} \uplus
22175+
$\{ \code{X} \mapsto \code{int}, \code{Y} \mapsto %
22176+
\code{FutureOr<List<double>{}>} \} \uplus
2214422177
\{ \code{Y} \mapsto \code{int} \} =
2214522178
\{ \code{X} \mapsto \code{int}, \code{Y} \mapsto \code{int} \}$.
2214622179
Note that operator $\uplus$ is concerned with scopes and shadowing,
@@ -22190,28 +22223,6 @@ \subsubsection{Being a subtype}
2219022223
each of the premises of $R$,
2219122224
continuing until a rule with no premises is reached.
2219222225

22193-
\LMHash{}%
22194-
The first premise in the
22195-
rules~\SrnLeftTypeAlias{} and~\SrnRightTypeAlias{}
22196-
is a type alias declaration.
22197-
This premise is satisfied in each of the following situations:
22198-
22199-
\begin{itemize}
22200-
\item A non-generic type alias named $F$ is declared.
22201-
In this case $s$ is zero,
22202-
no assumptions are made about the existence
22203-
of any formal type parameters,
22204-
and actual type argument lists are omitted everywhere in the rule.
22205-
\item We may choose $s$ and \List{X}{1}{s} such that the following holds:
22206-
A generic type alias named $F$ is declared,
22207-
with formal type parameters \List{X}{1}{s}.
22208-
\commentary{%
22209-
Each formal type parameter $X_j$ may have a bound,
22210-
but the bounds are never used in this context,
22211-
so we do not introduce metavariables for them.%
22212-
}
22213-
\end{itemize}
22214-
2221522226
\LMHash{}%
2221622227
Rule~\SrnRightFunction{} has as a premise that `$T$ is a function type'.
2221722228
This means that $T$ is a type of one of the forms introduced in
@@ -22320,7 +22331,7 @@ \subsubsection{Informal Subtype Rule Descriptions}
2232022331
the rule is also valid in any environment
2232122332
and the environment is never used explicitly,
2232222333
so we will not repeat that.
22323-
\Item{\SrnTop}{Top}
22334+
\Item{\SrnRightTop}{Top}
2232422335
Every type is a subtype of \code{Object},
2232522336
every type is a subtype of \DYNAMIC,
2232622337
and every type is a subtype of \VOID.
@@ -22332,19 +22343,11 @@ \subsubsection{Informal Subtype Rule Descriptions}
2233222343
(\ref{superBoundedTypes}).
2233322344
\Item{\SrnBottom}{Bottom}
2233422345
Every type is a supertype of $\bot$.
22335-
\Item{\SrnNull}{Null}
22336-
Every type other than $\bot$ is a supertype of \code{Null}.
22337-
\Item{\SrnLeftTypeAlias}{Type Alias Left}
22338-
An application of a type alias to some actual type arguments is
22339-
a subtype of another type $T$
22340-
if the expansion of the type alias to the type that it denotes
22341-
is a subtype of $T$.
22342-
Note that a non-generic type alias is handled by letting $s = 0$.
22343-
\Item{\SrnRightTypeAlias}{Type Alias Right}
22344-
A type $S$ is a subtype of an application of a type alias
22345-
if $S$ is a subtype of
22346-
the expansion of the type alias to the type that it denotes.
22347-
Note that a non-generic type alias is handled by letting $s = 0$.
22346+
\Item{\SrnNullOne}{Null 1}
22347+
\code{Null} is a subtype of every type of the form \code{$T$?}.
22348+
\Item{\SrnNullTwo}{Null 2}
22349+
\code{Null} is a subtype of \code{FutureOr<$T$>}
22350+
if \code{Null} is a subtype of $T$.
2234822351
\Item{\SrnLeftFutureOr}{Left FutureOr}
2234922352
The type \code{FutureOr<$S$>} is a subtype of a given type $T$
2235022353
if $S$ is a subtype of $T$ and \code{Future<$S$>} is a subtype of $T$,
@@ -22813,11 +22816,10 @@ \subsection{Type Normalization}
2281322816
(such as \code{Never} and $X$).
2281422817

2281522818
In particular, \SubtypeNE{S}{T} and \SubtypeNE{T}{S} holds if and only if
22816-
\NormalizedTypeOf{$T$} is syntactically equal to \NormalizedTypeOf{$S$},
22817-
modulo replacement of atomic top types,
22818-
and modulo replacement of terms derived from \synt{typeName}
22819-
denoting the same type
22820-
(such as \code{List<C<\DYNAMIC>{}>} and \code{List<myPrefix.C<\VOID>{}>}).%
22819+
\NormalizedTypeOf{$T$} has the same canonical syntax as \NormalizedTypeOf{$S$}
22820+
(\ref{standardUpperBoundsAndStandardLowerBounds}),
22821+
modulo replacement of atomic top types
22822+
(e.g., \code{List<C<\DYNAMIC>{}>} and \code{List<myPrefix.C<\VOID>{}>}).%
2282122823
}
2282222824

2282322825
\LMHash{}%
@@ -23025,8 +23027,8 @@ \subsubsection{Standard Upper Bounds and Standard Lower Bounds}
2302523027
}
2302623028

2302723029
\LMHash{}%
23028-
Consequently, when we say that two types $T_1$ and $T_2$ are
23029-
\IndexCustom{syntactically equal}{type!syntactically equal},
23030+
Consequently, when we say that two types $T_1$ and $T_2$ have the
23031+
\IndexCustom{same canonical syntax}{type!same canonical syntax},
2303023032
it refers to the situation where both $T_1$ and $T_2$ have been
2303123033
transformed in the above sense
2303223034
(\commentary{by alpha-renaming, alias expansion, and canonical naming}).
@@ -23260,7 +23262,7 @@ \subsubsection{Standard Upper Bounds and Standard Lower Bounds}
2326023262
\EXTENDS\,$B_{2m}$>($P_{21}$,\,\ldots,\,$P_{2l}$)}
2326123263

2326223264
\noindent
23263-
such that each $B_{1i}$ and $B_{2i}$ are syntactically equal types,
23265+
such that each $B_{1i}$ and $B_{2i}$ are types with the same canonical syntax,
2326423266
and both have the same number of required positional parameters.
2326523267
Let $q$ be $\metavar{min}(k, l)$,
2326623268
let $T_3$ be \UpperBoundType{$T_1$}{$T_2$},
@@ -23290,7 +23292,7 @@ \subsubsection{Standard Upper Bounds and Standard Lower Bounds}
2329023292
and consider the case where the following is satisfied:
2329123293

2329223294
\begin{itemize}
23293-
\item Each $B_{1i}$ and $B_{2i}$ are syntactically equal types.
23295+
\item Each $B_{1i}$ and $B_{2i}$ are types with the same canonical syntax.
2329423296
\item For each required entry named $n$ in $\metavar{Named}_1$,
2329523297
$\metavar{Named}_2$ contains an entry named $n$
2329623298
(\commentary{which may or may not be required}).
@@ -23515,7 +23517,7 @@ \subsubsection{Standard Upper Bounds and Standard Lower Bounds}
2351523517
\EXTENDS\,$B_{2m}$>($P_{21}$,\,\ldots,\,$P_{2l}$)}
2351623518

2351723519
\noindent
23518-
such that each $B_{1i}$ and $B_{2i}$ are syntactically equal types.
23520+
such that each $B_{1i}$ and $B_{2i}$ are types with the same canonical syntax.
2351923521
Let $q$ be $\metavar{max}(k, l)$,
2352023522
let $T_3$ be \LowerBoundType{$T_1$}{$T_2$},
2352123523
let $B_{3i}$ be $B_{1i}$, and
@@ -23552,7 +23554,7 @@ \subsubsection{Standard Upper Bounds and Standard Lower Bounds}
2355223554
where $\metavar{Named}_j$ declares a non-empty set of named parameters
2355323555
with names $\metavar{NamesOfNamed}_j$, $j \in 1 .. 2$,
2355423556
and consider the case where
23555-
each $B_{1i}$ and $B_{2i}$ are syntactically equal types.
23557+
each $B_{1i}$ and $B_{2i}$ are types with the same canonical syntax.
2355623558
Then \DefEqualsNewline{\LowerBoundType{$U_1$}{$U_2$}}{%U_3}, where $U_3$ is
2355723559
\code{$T_3$\,\FUNCTION<$X_1$\,\EXTENDS\,$B_{31}$,\,\ldots,\,$X_m$\,%
2355823560
\EXTENDS\,$B_{3m}$>($P_{31}$,\,\ldots,\,$P_{3k}$,\,$\metavar{Named}_3$)}},
@@ -24096,9 +24098,10 @@ \subsection{Intersection Types}
2409624098

2409724099
\commentary{%
2409824100
An intersection type will never occur as a nested type, that is,
24099-
it will never occurs as
24101+
it never occurs as or in
2410024102
an actual type argument in a parameterized type,
24101-
as a parameter type or a return type in a function type,
24103+
a parameter type or a return type in a function type,
24104+
a type parameter bound,
2410224105
as the right operand of another intersection type,
2410324106
or as the operand of the nullable type operator \lit{?}.%
2410424107
}
@@ -24259,24 +24262,8 @@ \subsection{Type Type}
2425924262
and let $S_j$ be \NormalizedTypeOf{$U_j$}, for $j \in 1 .. 2$
2426024263
(\ref{typeNormalization}).
2426124264
We then say that $T_1$ and $T_2$ are the \Index{same type}
24262-
if{}f $S_1$ and $S_2$ are syntactically equal,
24263-
up to equivalence of bound variables,
24264-
and up to replacement of identifiers or qualified identifiers
24265-
resolving to the same type declaration
24266-
(\commentary{%
24267-
e.g., \code{C} and \code{prefix.C} could resolve to
24268-
the same class declaration%
24269-
}),
24270-
and excluding the case where two identifiers or qualified identifiers
24271-
occurring at corresponding positions in $S_1$ and $S_2$
24272-
are syntactically identical,
24273-
but resolve to different declarations
24274-
(\commentary{%
24275-
e.g., one occurrence of \code{C} could resolve to a
24276-
class declaration imported from a library $L_1$,
24277-
and another occurrence of \code{C} could resolve to a
24278-
class declaration imported from a different library $L_2$%
24279-
}).
24265+
if{}f $S_1$ and $S_2$ are have the same canonical syntax
24266+
(\ref{standardUpperBoundsAndStandardLowerBounds}).
2428024267

2428124268
\LMHash{}%
2428224269
A reified type identifies the underlying type in the sense that
@@ -25685,7 +25672,7 @@ \section*{Appendix: Algorithmic Subtyping}
2568525672
\end{minipage}
2568625673
%
2568725674
\caption{Algorithmic subtype rules.
25688-
Rules \SrnTop--\SrnSuperinterface{} are unchanged and hence omitted here.}
25675+
Rules \SrnRightTop--\SrnSuperinterface{} are unchanged and hence omitted here.}
2568925676
\label{fig:algorithmicSubtypeRules}
2569025677
\end{figure}
2569125678

@@ -25746,7 +25733,7 @@ \section*{Appendix: Algorithmic Subtyping}
2574625733
followed by the rule whose number is $N+1$.
2574725734
\commentary{%
2574825735
So the order is
25749-
\AppSrnReflexivity, \SrnTop--\SrnTypeVariableReflexivityA,
25736+
\AppSrnReflexivity, \SrnRightTop--\SrnTypeVariableReflexivityA,
2575025737
\AppSrnTypeVariableReflexivityB, \AppSrnTypeVariableReflexivityC,
2575125738
\AppSrnTypeVariableReflexivityD,
2575225739
\SrnRightPromotedVariable, and so on.%

0 commit comments

Comments
 (0)