 \documentclass[diploma]{softlab-thesis}

\usepackage{amsmath,amssymb, latexsym}

\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}

\usepackage{liquidHaskell}
\usepackage[inference]{semantic}

\newcommand\etal{et al.\xspace}

%\usepackage{subfigure}
%\usepackage{graphicx}
%\usepackage[usenames,dvipsnames]{color}
\usepackage{enumerate}
\def\url{}
\usepackage{xspace}
\usepackage{epsfig}
\usepackage{mathpartir}
\usepackage{booktabs}

%\usepackage{extarrows}
%\usepackage{pgf,tikz}
%\usetikzlibrary{arrows,automata}

\newcommand{\at}{\makeatletter @\makeatother}

%%%%%\usepackage{fancyvrb}
%%%%%\DefineVerbatimEnvironment{code}{Verbatim}{fontsize=\small}
%%%%%\DefineVerbatimEnvironment{example}{Verbatim}{fontsize=\small}
%%%%%\newcommand{\ignore}[1]{}

% command to end a proof or definition:
%\def\qed{\rule{0.4em}{1.4ex}}
\def\qed{\hfill$\Box$}

% space at the beginning of an environment:
\def\@envspa{\hspace{0.3em}}
\def\@sa{\hspace{-0.2em}}
\def\@sb{\hspace{0.5em}}
\def\@sc{\hspace{-0.1em}}

\def\sk{\smallskip}		% space before and after theorems

\input{commands}
\input{haskellListings}





\begin{document}
%%%  Title page

\frontmatter

\title{LiquidHaskell : Liquid Types for Haskell}
\author{Νίκη Βάζου}
\date{Γενάρης 2015}
\datedefense{8}{1}{2015}

\supervisor{Νικόλαος Σ. Παπασπύρου}
\supervisorpos{Αν. Καθηγητής Ε.Μ.Π.}

\committeeone{Νικόλαος Σ. Παπασπύρου}
\committeeonepos{Αν. Καθηγητής Ε.Μ.Π.}
\committeetwo{Κωστής Σαγώνας}
\committeetwopos{Αν. Καθηγητής Ε.Μ.Π.}
\committeethree{Παναγιώτης Ροντογιάννης}
\committeethreepos{Αν. Καθηγητής  Ε.Κ.Π.Α.}

\TRnumber{CSD-SW-TR-42-14}  % number-year, ask nickie for the number
\department{Τομέας Τεχνολογίας Πληροφορικής και Υπολογιστών}

\maketitle

%%%  Abstract, in Greek

\begin{abstractgr}%
Ακόμα και τα ασφαλή προγράμματα μπορούν να έχουν λάθη.
Προγράμματα που έχουν μεταγλωτιστεί με βάση κάποιο ισχυρό σύστημα τύπων, όπως αυτό της Haskell,  μπορούν να πετάξουν σφάλμα κατα τον χρόνο εκτέλεσης ή να δώσουν μη αναμενώμενη απάντηση.
Τα refinement συστήματα τύπων αντιμετωπίζουν αυτήν την κατάσταση αφού επιτρέπουν την έκφραση σημασιολογικών προδιαφραφών των προγραμμάτων.
Αναλύουμε την απόδειξη των προδιαγραφών σε αυτά τα συστήματα.
Πολύ εκφραστικά συστήματα απαιτούν ελέγχους κατά τον χρόνο εκτέλεσης ή ρητές αποδείξεις από τον χρήστη, για την αποδειξη των προδιαγραφών, 
Λιγότερο εκφραστικά συστήματα τύπων επιτρέπουν την αυτόματη απόδειξη των προδιαγραφών, κατά τον χρόνο μεταγλώτισης. 

Παρουσιάζουμε τους liquidTypes ένα σύστημα τύπων που επιτρέπει την αυτόματη απόδειξη προδιαγραφών κατά τον χρόνο μεταγλώτισης. 
Επεκτείνουμε τους liquidTypes με abstract refinement, έναν μηχανισμό που αυξάνει την εκφραστικότητα του συστήματος, χωρίς να αυξάνει την πολυπλοκοτητά του.
Υλοποιήσαμε την \toolname ένα σύστημα τύπων για Haskell που συνδιάζει liquidTypes με  abstract refinement και το χρησιμοποιήσαμε για να αποδείξουμε ιδιώτητες πραγματικων βιβλιοθηκών της Haskell.
\begin{keywordsgr}
Γλώσσες προγραμματισμού, 
Συστήματα Τύπων, 
Ασφαλείς γλώσσες
\end{keywordsgr}
\end{abstractgr}


%%%  Abstract, in English

\begin{abstracten}%
Even well-typed programs can go wrong,
by returning a wrong answer or 
throwing a run-time error.
A popular response is
to allow programmers use
\textit{refinement type systems}
to express semantic specifications 
about programs.
%
We study verification in such systems.
%
On the one hand, expressive refinement type systems
require run-time checks
or explicit proofs to verify specifications.
On the other,
less expressive type systems
allow static and automatic proofs of the specifications.
%
Next, we present abstract refinement types, 
a means to enhance the expressiveness of
a refinement type system without increasing its complexity.
Then,  we present \toolname
that combines liquidTypes with abstraction over refinements
to enhance expressiveness of LiquidTypes.
\toolname is a quite expressive verification tool for Haskell programs 
that can be used to check termination, 
totality  and general functional correctness.
Finally, we evaluate \toolname in real world Haskell libraries.
\begin{keywordsen}
Programming languages,
Refinement Types, Abstract Interpretation, Algorithmic Verification
\end{keywordsen}
\end{abstracten}


%%%  Acknowledgements

\begin{acknowledgementsgr}
Ευχαριστώ θερμά τον επιβλέποντα καθηγητή αυτής της διατριβής,
κ.~Νικόλαο Παπασπύρου για τις βάσεις και τις γνώσης που μου παρείχε κατά την διάρκεια των σπουδών  μου.
Ευχαριστώ επίσης τα μέλη της συμβουλευτικής επιτροπής,
κ.κ.~Κωστή Σαγώνα, Παναγιώτη Ροντογιάννη, αλλά και τον κ.~ Στάθη Ζάχο 
τόσο για την επιρροή που έχουν ασκήσει πάνω μου, αλλά και για το γενικότερο έργο τους: 
να διατήρουν  σε ένα πολύ υψηλό επίπεδο στην ελληνική κοινώτητα γλωσσών προγραμματισμου αλλά και πληροφορικής γενικότερα.
Η δουλειά αυτή έγινε με την βοήθεια και την στήριξη του επιβλέποντα καθηγητή μου στο πανεπιστήμιο της Καλιφόρνιας, Σαν Ντιέγκο, Ranjit Jhala τον οποίο και ευχαριστώ θερμά για την στήριξη και τις γνώσεις που μου παρέχει.
Τέλος, θα ήθελα να ευχαριστήσω
τους γονείς μου και την αδερφή μου, οι οποίοι με
υποστήριξαν με κάθε δυνατό τρόπο όλα αυτά τα χρόνια.
\end{acknowledgementsgr}


%%%  Various tables

\tableofcontents


%%%  Main part of the book

\mainmatter

\input{dependent}
\input{undecidable}
\input{liquid}
\input{abstract_refinements}
\input{tool}
\input{totality}
\input{termination}
\input{structures}
% \input{evaluation}
\input{conclusion}



%%%  Bibliography

\bibliographystyle{softlab-thesis}
\bibliography{sw}


\end{document}
