@@ -21869,43 +21869,41 @@ \subsection{Subtypes}
21869
21869
}
21870
21870
21871
21871
\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
21878
21875
(\ref{typePromotion}).
21879
21876
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
+ }
21896
21884
21885
+ !!! Renumber!
21897
21886
% Subtype Rule Numbering
21898
21887
\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}
21904
21897
\newcommand{\SrnLeftFutureOr}{7}
21898
+ \newcommand{\SrnLeftNullable}{7b}
21905
21899
\newcommand{\SrnTypeVariableReflexivityA}{8}
21906
21900
\newcommand{\SrnRightPromotedVariable}{9}
21907
21901
\newcommand{\SrnRightFutureOrA}{10}
21908
21902
\newcommand{\SrnRightFutureOrB}{11}
21903
+ \newcommand{\SrnRightNullableOne}{11b.1}
21904
+ \newcommand{\SrnRightNullableTwo}{11b.2}
21905
+ \newcommand{\SrnRightNullableThree}{11b.3}
21906
+ \newcommand{\SrnRightNullableFour}{11b.4}
21909
21907
\newcommand{\SrnLeftPromotedVariable}{12}
21910
21908
\newcommand{\SrnLeftVariableBound}{13}
21911
21909
\newcommand{\SrnRightFunction}{14}
@@ -21926,34 +21924,47 @@ \subsection{Subtypes}
21926
21924
\def\RuleRawRaw#1#2#3#4{\centerline{\inference[#1]{#3}{#4}}\VSP}
21927
21925
%
21928
21926
\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$?}}
21931
21934
\end{minipage}
21932
21935
\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$>}}
21935
21949
\end{minipage}
21936
21950
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
-
21945
21951
\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}
21948
21954
\RuleTwo{\SrnRightPromotedVariable}{Right Promoted Variable}{S}{X}{S}{T}{
21949
21955
S}{X \& T}
21950
21956
\Rule{\SrnRightFutureOrB}{Right FutureOr B}{S}{T}{S}{\code{FutureOr<$T$>}}
21957
+ \Rule{\SrnRightNullableTwo}{Right Nullable 2}{S}{\code{Null}}{S}{%
21958
+ \code{$T$?}}
21951
21959
\Rule{\SrnLeftVariableBound}{Left Variable Bound}{\Gamma(X)}{T}{X}{T}
21952
21960
\end{minipage}
21953
21961
\begin{minipage}[c]{0.49\textwidth}
21962
+ \RuleTwo{\SrnLeftNullable}{Left Nullable}{S}{T}{\code{Null}}{T}{
21963
+ \code{$S$?}}{T}
21954
21964
\Axiom{\SrnTypeVariableReflexivityA}{Left Promoted Variable A}{X \& S}{X}
21955
21965
\Rule{\SrnRightFutureOrA}{Right FutureOr A}{S}{\code{Future<$T$>}}{%
21956
21966
S}{\code{FutureOr<$T$>}}
21967
+ \Rule{\SrnRightNullableOne}{Right Nullable 1}{S}{T}{S}{\code{$T$?}}
21957
21968
\Rule{\SrnLeftPromotedVariable}{Left Promoted Variable B}{S}{T}{X \& S}{T}
21958
21969
\RuleRaw{\SrnRightFunction}{Right Function}{T\mbox{ is a function type}}{
21959
21970
T}{\FUNCTION}
@@ -21989,6 +22000,7 @@ \subsection{Subtypes}
21989
22000
\forall j \in 1 .. s\!:\;\SubtypeStd{S_j}{T_j}}{%
21990
22001
\code{$C$<\List{S}{1}{s}>}}{\code{$C$<\List{T}{1}{s}>}}
21991
22002
\ExtraVSP
22003
+ %% !!! Should include mixins (and other non-class interface types, if any).
21992
22004
\RuleRaw{\SrnSuperinterface}{Superinterface}{%
21993
22005
\code{\CLASS{} $C$<\TypeParametersNoBounds{X}{s}>\,\ldots\,\{\}}\\
21994
22006
\Superinterface{\code{$D$<\List{T}{1}{m}>}}{C} &
@@ -22040,10 +22052,9 @@ \subsubsection{Subtype Rules}
22040
22052
Whenever a rule contains one or more meta-variables,
22041
22053
that rule can be used by
22042
22054
\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$.
22047
22058
22048
22059
\commentary{%
22049
22060
In general, this means that two or more occurrences of
@@ -22056,11 +22067,12 @@ \subsubsection{Subtype Rules}
22056
22067
can be used to conclude
22057
22068
\Subtype{\emptyset}{\code{int}}{\code{int}},
22058
22069
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
+ }
22060
22072
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{}
22064
22076
to show that \code{p1.C} is a subtype of
22065
22077
\code{p2.C} when \code{C} is a class declared in a
22066
22078
library $L$ which is imported by libraries $L_1$ and $L_2$ and
@@ -22089,8 +22101,27 @@ \subsubsection{Subtype Rules}
22089
22101
}
22090
22102
22091
22103
\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.
22094
22125
22095
22126
\commentary{%
22096
22127
That is, no subtyping relationship can be proven for
@@ -22138,9 +22169,11 @@ \subsubsection{Subtype Rules}
22138
22169
So
22139
22170
$\{ \code{X} \mapsto \code{int}, \code{Y} \mapsto \code{double} \} \uplus
22140
22171
\{ \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} \}$
22142
22174
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
22144
22177
\{ \code{Y} \mapsto \code{int} \} =
22145
22178
\{ \code{X} \mapsto \code{int}, \code{Y} \mapsto \code{int} \}$.
22146
22179
Note that operator $\uplus$ is concerned with scopes and shadowing,
@@ -22190,28 +22223,6 @@ \subsubsection{Being a subtype}
22190
22223
each of the premises of $R$,
22191
22224
continuing until a rule with no premises is reached.
22192
22225
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
-
22215
22226
\LMHash{}%
22216
22227
Rule~\SrnRightFunction{} has as a premise that `$T$ is a function type'.
22217
22228
This means that $T$ is a type of one of the forms introduced in
@@ -22320,7 +22331,7 @@ \subsubsection{Informal Subtype Rule Descriptions}
22320
22331
the rule is also valid in any environment
22321
22332
and the environment is never used explicitly,
22322
22333
so we will not repeat that.
22323
- \Item{\SrnTop }{Top}
22334
+ \Item{\SrnRightTop }{Top}
22324
22335
Every type is a subtype of \code{Object},
22325
22336
every type is a subtype of \DYNAMIC,
22326
22337
and every type is a subtype of \VOID.
@@ -22332,19 +22343,11 @@ \subsubsection{Informal Subtype Rule Descriptions}
22332
22343
(\ref{superBoundedTypes}).
22333
22344
\Item{\SrnBottom}{Bottom}
22334
22345
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$.
22348
22351
\Item{\SrnLeftFutureOr}{Left FutureOr}
22349
22352
The type \code{FutureOr<$S$>} is a subtype of a given type $T$
22350
22353
if $S$ is a subtype of $T$ and \code{Future<$S$>} is a subtype of $T$,
@@ -22813,11 +22816,10 @@ \subsection{Type Normalization}
22813
22816
(such as \code{Never} and $X$).
22814
22817
22815
22818
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>{}>}).%
22821
22823
}
22822
22824
22823
22825
\LMHash{}%
@@ -23025,8 +23027,8 @@ \subsubsection{Standard Upper Bounds and Standard Lower Bounds}
23025
23027
}
23026
23028
23027
23029
\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 },
23030
23032
it refers to the situation where both $T_1$ and $T_2$ have been
23031
23033
transformed in the above sense
23032
23034
(\commentary{by alpha-renaming, alias expansion, and canonical naming}).
@@ -23260,7 +23262,7 @@ \subsubsection{Standard Upper Bounds and Standard Lower Bounds}
23260
23262
\EXTENDS\,$B_{2m}$>($P_{21}$,\,\ldots,\,$P_{2l}$)}
23261
23263
23262
23264
\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 ,
23264
23266
and both have the same number of required positional parameters.
23265
23267
Let $q$ be $\metavar{min}(k, l)$,
23266
23268
let $T_3$ be \UpperBoundType{$T_1$}{$T_2$},
@@ -23290,7 +23292,7 @@ \subsubsection{Standard Upper Bounds and Standard Lower Bounds}
23290
23292
and consider the case where the following is satisfied:
23291
23293
23292
23294
\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 .
23294
23296
\item For each required entry named $n$ in $\metavar{Named}_1$,
23295
23297
$\metavar{Named}_2$ contains an entry named $n$
23296
23298
(\commentary{which may or may not be required}).
@@ -23515,7 +23517,7 @@ \subsubsection{Standard Upper Bounds and Standard Lower Bounds}
23515
23517
\EXTENDS\,$B_{2m}$>($P_{21}$,\,\ldots,\,$P_{2l}$)}
23516
23518
23517
23519
\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 .
23519
23521
Let $q$ be $\metavar{max}(k, l)$,
23520
23522
let $T_3$ be \LowerBoundType{$T_1$}{$T_2$},
23521
23523
let $B_{3i}$ be $B_{1i}$, and
@@ -23552,7 +23554,7 @@ \subsubsection{Standard Upper Bounds and Standard Lower Bounds}
23552
23554
where $\metavar{Named}_j$ declares a non-empty set of named parameters
23553
23555
with names $\metavar{NamesOfNamed}_j$, $j \in 1 .. 2$,
23554
23556
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 .
23556
23558
Then \DefEqualsNewline{\LowerBoundType{$U_1$}{$U_2$}}{%U_3}, where $U_3$ is
23557
23559
\code{$T_3$\,\FUNCTION<$X_1$\,\EXTENDS\,$B_{31}$,\,\ldots,\,$X_m$\,%
23558
23560
\EXTENDS\,$B_{3m}$>($P_{31}$,\,\ldots,\,$P_{3k}$,\,$\metavar{Named}_3$)}},
@@ -24096,9 +24098,10 @@ \subsection{Intersection Types}
24096
24098
24097
24099
\commentary{%
24098
24100
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
24100
24102
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,
24102
24105
as the right operand of another intersection type,
24103
24106
or as the operand of the nullable type operator \lit{?}.%
24104
24107
}
@@ -24259,24 +24262,8 @@ \subsection{Type Type}
24259
24262
and let $S_j$ be \NormalizedTypeOf{$U_j$}, for $j \in 1 .. 2$
24260
24263
(\ref{typeNormalization}).
24261
24264
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}).
24280
24267
24281
24268
\LMHash{}%
24282
24269
A reified type identifies the underlying type in the sense that
@@ -25685,7 +25672,7 @@ \section*{Appendix: Algorithmic Subtyping}
25685
25672
\end{minipage}
25686
25673
%
25687
25674
\caption{Algorithmic subtype rules.
25688
- Rules \SrnTop --\SrnSuperinterface{} are unchanged and hence omitted here.}
25675
+ Rules \SrnRightTop --\SrnSuperinterface{} are unchanged and hence omitted here.}
25689
25676
\label{fig:algorithmicSubtypeRules}
25690
25677
\end{figure}
25691
25678
@@ -25746,7 +25733,7 @@ \section*{Appendix: Algorithmic Subtyping}
25746
25733
followed by the rule whose number is $N+1$.
25747
25734
\commentary{%
25748
25735
So the order is
25749
- \AppSrnReflexivity, \SrnTop --\SrnTypeVariableReflexivityA,
25736
+ \AppSrnReflexivity, \SrnRightTop --\SrnTypeVariableReflexivityA,
25750
25737
\AppSrnTypeVariableReflexivityB, \AppSrnTypeVariableReflexivityC,
25751
25738
\AppSrnTypeVariableReflexivityD,
25752
25739
\SrnRightPromotedVariable, and so on.%
0 commit comments