2024-05-13 21:58:42 +00:00
\section { Properties of the Algorithm}
2024-05-23 12:18:50 +00:00
\begin { itemize}
\item Our algorithm is designed for extensibility with the final goal of full support for Java.
\unify { } is the core of the algorithm and can be used for any calculus sharing the same subtype relations as depicted in \ref { fig:subtyping} .
Additional language constructs can be added by implementing the respective constraint generation functions in the same fashion as described in chapter \ref { chapter:constraintGeneration} .
\end { itemize}
2024-05-14 12:57:16 +00:00
%TODO: how are the challenges solved: Describe this in the last chapter with examples!
2024-05-13 21:58:42 +00:00
\section { Soundness} \label { sec:soundness}
\section { Completeness} \label { sec:completeness}
The algorithm can find a solution to every program which the Unify by Plümicke finds
a correct solution aswell.
It will not infer intermediat type like $ \wctype { \rwildcard { X } } { Pair } { \rwildcard { X } , \rwildcard { X } } $ .
There is propably some loss of completeness when capture constraints get deleted.
This happens because constraints of the form $ \tv { a } \lessdotCC \exptype { C } { \wtv { x } } $ are kept as long as possible.
Here the variable $ \tv { a } $ maybe could hold a wildcard type,
but it gets resolved to a $ \generics { \type { A } \triangleleft \type { N } } $ .
This combined with a constraint $ \type { N } \lessdot \wtv { x } $ looses a possible solution.
This is our result:
\begin { verbatim}
class List<X> {
<Y extends X> void addTo(List<Y> l){
l.add(this.get());
}
}
\end { verbatim}
$
\tv { l} \lessdotCC \exptype { List} { \wtv { y} } ,
\type { X} \lessdot \wtv { y}
$
But the most general type would be:
\begin { verbatim}
class List<X> {
void addTo(List<? super X> l){
l.add(this.get());
}
}
\end { verbatim}
\subsection { Discussion Pair Example}
\begin { verbatim}
<X> Pair<X,X> make(List<X> l){ ... }
<X> boolean compare(Pair<X,X> p) { ... }
List<?> l;
Pair<?,?> p;
compare(make(l)); // Valid
compare(p); // Error
\end { verbatim}
Our type inference algorithm is not able to solve this example.
When we convert this to \TamedFJ { } and generate constraints we end up with:
\begin { lstlisting} [style=tamedfj]
let m = let x = l in make(x) in compare(m)
\end { lstlisting}
\begin { constraintset} $
\wctype { \rwildcard { X} } { List} { \rwildcard { X} } \lessdot \ntv { x} ,
\ntv { x} \lessdotCC \exptype { List} { \wtv { a} }
\exptype { Pair} { \wtv { a} , \wtv { a} } \lessdot \ntv { m} , %% TODO: Mark this constraint
\ntv { m} \lessdotCC \exptype { Pair} { \wtv { b} , \wtv { b} }
$ \end { constraintset }
$ \ntv { x } $ will get the type $ \wctype { \rwildcard { X } } { List } { \rwildcard { X } } $ and
from the constraint
$ \wctype { \rwildcard { X } } { List } { \rwildcard { X } } \lessdot \exptype { List } { \wtv { a } } $
\unify { } deducts $ \wtv { a } \doteq \rwildcard { X } $ leading to
$ \exptype { Pair } { \rwildcard { X } , \rwildcard { X } } \lessdot \ntv { m } $ .
Finding a supertype to $ \exptype { Pair } { \rwildcard { X } , \rwildcard { X } } $ is the crucial part.
The correct substition for $ \ntv { m } $ would be $ \wctype { \rwildcard { X } } { Pair } { \rwildcard { X } , \rwildcard { X } } $ .
But this leads to additional branching inside the \unify { } algorithm and increases runtime.
%We refrain from using that type, because it is not denotable with Java syntax.
%Types used for normal type placeholders should be expressable Java types. % They are not!
The prefered way of dealing with this example in our opinion would be the addition of a multi-let statement to the syntax.
\begin { lstlisting} [style=letfj]
let x : (*@$ \wctype { \rwildcard { X } } { List } { \rwildcard { X } } $ @*) = l, m = make(x) in compare(make(x))
\end { lstlisting}
We can make it work with a special rule in the \unify { } .
But this will only help in this specific example and not generally solve the issue.
A type $ \exptype { Pair } { \rwildcard { X } , \rwildcard { X } } $ has atleast two immediate supertypes:
$ \wctype { \rwildcard { X } } { Pair } { \rwildcard { X } , \rwildcard { X } } $ and
$ \wctype { \rwildcard { X } , \rwildcard { Y } } { Pair } { \rwildcard { X } , \rwildcard { Y } } $ .
Imagine a type $ \exptype { Triple } { \rwildcard { X } , \rwildcard { X } , \rwildcard { X } } $ already has
% TODO: how many supertypes are there?
%X.Triple<X,X,X> <: X,Y.Triple<X,Y,X> <:
%X,Y,Z.Triple<X,Y,Z>
% TODO example:
\begin { lstlisting} [style=java]
<X> Triple<X,X,X> sameL(List<X> l)
<X,Y> Triple<X,Y,Y> sameP(Pair<X,Y> l)
<X,Y> void triple(Triple<X,Y,Y> tr){ }
Pair<?,?> p ...
List<?> l ...
make(t) { return t; }
triple(make(sameP(p)));
triple(make(sameL(l)));
\end { lstlisting}
\begin { constraintset}
$
\exptype { Triple} { \rwildcard { X} , \rwildcard { X} , \rwildcard { X} } \lessdot \ntv { t} ,
\ntv { t} \lessdotCC \exptype { Triple} { \wtv { a} , \wtv { b} , \wtv { b} } , \\
(\textit { This constraint is added later: } \exptype { Triple} { \rwildcard { X} , \rwildcard { Y} , \rwildcard { Y} } \lessdot \ntv { t} )
$
% Triple<X,X,X> <. t
% ( Triple<X,Y,Y> <. t ) <- this constraint is added later
% t <. Triple<a?, b?, b?>
% t =. x.Triple<X,X,X>
\end { constraintset}
2023-12-27 13:29:33 +00:00
\section { Conclusion and Further Work}
% we solved the problems given in the introduction (see examples TODO give names to examples)
The problems introduced in the openening \ref { challenges} can be solved via our \unify { } algorithm (see examples \ref { example1} and \ref { example2} ).
As you can see by the given examples our type inference algorithm can calculate
type solutions for programs involving wildcards.
2024-05-15 21:58:52 +00:00
Going further we try to prove soundness and completeness for \unify { } .
2023-12-27 13:29:33 +00:00
% The tricks are:
% \begin{itemize}
% \item Erasing wildcards by setting $\type{U} \doteq \type{L}$
% \end{itemize}
% Improvements:
% \begin{itemize}
% \item Straightforward algorithm. Less data types used. Only two sort of constraints.
% \end{itemize}
% \subsection{Problems}
% The algorithm is lacking completeness.
% \begin{verbatim}
% <A> void m(List<A> a){}
% m2(l){
% l.add("String");
% }
% \end{verbatim}
%COnstraints:
%l <. List<a>
%String <. a