Revamped document for lawyers

This commit is contained in:
Denis Merigoux 2020-03-24 18:33:56 +01:00
parent 7ca6ad7609
commit d996098a86
3 changed files with 232 additions and 183 deletions

10
doc/.gitignore vendored Normal file
View File

@ -0,0 +1,10 @@
*.aux
*.dvi
*.fdb_latexmk
*.fls
*.log
*.out
*.fls
*.pdf
_minted*
*.toc

222
doc/for_lawyers.tex Normal file
View File

@ -0,0 +1,222 @@
\documentclass[12pt, french]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{lmodern}
\usepackage{csquotes, textcomp}
\usepackage{fullpage}
\usepackage[french]{babel}
\usepackage[dvipsnames]{xcolor}
\usepackage[hidelinks]{hyperref}
\usepackage{fancyvrb}
\usepackage{tcolorbox}
\usepackage{draftwatermark}
\SetWatermarkText{Brouillon}
\SetWatermarkScale{1}
\SetWatermarkColor[gray]{0.92}
\title{
Proposition d'un langage de formalisation\\
de textes législatifs :\\
Questionnaire à l'intention de juristes
}
\author{
Denis \bsc{Merigoux}\\Inria\and
Liane \bsc{Huttner}\\Université Panthéon-Sorbonne\and
Nicolas \bsc{Chataing}\\Inria -- École Normale Supérieure\and
}
\newcommand{\kw}[1]{\textbf{\textcolor{OliveGreen}{#1}}}
\newcommand{\inlinekw}[1]{\kw{\texttt{#1}}}
\newenvironment{metadata}{
\begin{tcolorbox}[colframe=OliveGreen, title=\textcolor{black}{\texttt{Métadonnées}}, before skip=1em, after skip=1em]
}{
\end{tcolorbox}
}
\begin{document}
\maketitle
\renewcommand{\contentsname}{Sommaire}
\tableofcontents
\section{Introduction}
\subsection{Quelle garantie pour les calculs de transferts sociaux ?}
Impôts, allocations et pensions de retraite partagent un point commun : les règles de calcul des montants de ces transferts sociaux sont définies dans des textes législatifs. Ce sont ces textes en langage naturel, votés par le parlement ou décrétés par le gouvernement, qui servent de référence aux administrations et entreprises qui ont besoin de calculer ces montants de transferts. Cependant, ces calculs sont largement effectués automatiquement : il existe donc des programmes informatiques qui suivent les règles définies par la loi pour calculer le montant des transferts sociaux. Dès lors se pose la question suivante : comment être sûr que ces programmes informatiques, écrits dans des langages de programmation, implémentent fidèlement les règles décrites en langage naturel dans les textes législatifs ?
Il existe plusieurs manières d'obtenir des garanties de fidélité des programmes par rapport aux textes. La manière la plus simple, actuellement utilisée par la plupart des administrations et entreprises, consiste à faire rédiger par des juristes des études de cas où le calcul est détaillé pour une situation individuelle. Les programmeurs informatiques peuvent ainsi vérifier que le détail et le résultat du calcul informatique sur cette situation correspondent bien à ce qu'ont écrit les juristes. La garantie apportée par ces études de cas est proportionnelle à leur nombre et à leur diversité : si une règle de calcul n'est pas couverte par une de ces études de cas, elle ne sera pas couverte pas la garantie.
De manière plus subtile, il ne suffit pas de couvrir toutes les règles de calcul par des études de cas pour obtenir une garantie complète de fidélité. En effet, le comportement de la règle de calcul dépend des valeurs des montants en présence. Pour obtenir une garantie complète de complexité, il faudrait ainsi couvrir par des études de cas tous les comportements possibles de toutes les règles de calcul en présence. Le nombre d'études nécessaire pour atteindre cet objectif, difficile à quantifier, est très élevé et en pratique jamais atteint. Dès lors,comment faire pour obtenir la garantie complète de fidélité du programme informatique par rapport à la loi ?
Plutôt que d'évaluer le programme informatique par l'extérieur avec des études de cas, nous proposons une approche alternative basée sur un vieux concept d'informatique, la programmation littéraire. Le principe de la programmation littéraire est de mêler dans une même source le code informatique ainsi que la description en langage naturel de ce que le code est censé faire. Dans notre cas, cette description en langage naturel est également la source de vérité sur le comportement du programme informatique : les textes législatifs.
Concrètement, cela consiste à partir du texte législatif et annoter ligne à ligne le texte juridique par une traduction informatique fidèle qui retranscrirait tout le contenu sémantique de la ligne de texte, et rien que ce contenu. En procédant ainsi, le problème de la garantie globale de fidélité du programme informatique par rapport à la loi est réduit à la vérification locale de la fidélité d'un morceau de code par rapport à une ligne du texte législatif. Cette vérification demande une grande expertise juridique, car il s'agit de connaître précisément l'interprétation du texte législatif dans toutes les situations possibles.
Notre objectif est de rendre possible cette vérification par des juristes spécialisés. Il faut donc que les annotations sous forme de code soient compréhensibles par ces juristes moyennant une formation minimale. Pour cela, il est nécessaire de créer un nouveau langage de programmation qui répond à cette contrainte de lisibilité. L'annotation des textes législatifs par des programmes rédigés dans ce nouveau langage de programmation correspond au concept de formalisation : il s'agit de donner une définition précise au sens mathématique à toutes les règles de calcul décrites dans la législation.
\subsection{Pour une législation socio-fiscale formalisée}
Nous affirmons que la méthode basée sur la programmation littéraire des textes législatifs que nous proposons apporterait un progrès significatif par rapport aux méthodes actuelles de production des implémentations informatiques de ces textes. Ce progrès se décline en trois principaux axes.
\paragraph{Sécurité juridique} Contrairement au langage naturel, un langage de programmation ne laisse pas de place à l'imprécision et à l'incohérence. Lors de l'implémentation d'un programme censé suivre des textes de loi, le programmeur est obligé de faire des décisions arbitraires. Par exemple, si la loi spécifie une règle différente selon si le montant des revenus est en dessous ou au-dessus d'un certain seuil, le programmeur doit décider arbitrairement se qui se passe quand le montant des revenus est égal au seuil. La revue du code par un juriste spécialisé permettrait de vérifier que ces choix arbitraires sont des interprétations valides du texte législatif.
Plus globalement, la garantie d'une implémentation fidèle au texte législatif apporte un très niveau de sécurité juridique à l'organisation qui utiliserait cette technique. Le champ des méthodes formelles, sur lequel repose la théorie derrière cette proposition, est utilisé dans tous les secteurs d'activité critiques tels que le transport (aérien et ferroviaire), la cryptographie, le spatial et même le contrôle des centrales nucléaires. Un contentieux soulevé par une mauvaise implémentation d'un texte législatif peut avoir de lourdes conséquences si cette implémentation est utilisée à grande échelle. Dans ce cas, les processus utilisés en méthodes formelles sont tout à fait adaptés pour prévenir toute possibilité de contentieux.
\paragraph{Cohérence} Ces problèmes de cohérence se posent aussi en droit fiscal et en droit social. Dans ce cas particulier, la cohérence législative repose sur la cohérence mathématique des règles de calcul définies dans les textes. Il s'agit par exemple de vérifier que le montant d'une allocation est bien dégressif par rapport aux revenus du ménage, ou bien que le taux marginal d'imposition ne peut dépasser un certain seuil. La formalisation des règles de calcul permet de les étudier en tant qu'objet mathématique, et ainsi de prouver comme théorème la cohérence législative.
Un deuxième aspect de la cohérence législative concerne l'existence même de plusieurs implémentations informatiques des textes législatifs. Si plusieurs organisations possèdent chacune leur programme informatique censé respecter le même texte législatif, comment s'assurer que ces implémentations sont bien cohérentes ? D'un point de vue économique, l'existence même de plusieurs implémentations concurrentes d'un même texte législatif est contre-productive en termes de maintenance. Pour cette raison, l'implémentation à base de programmation littéraire que nous proposons servirait d'implémentation unique de référence du texte législatif, partagée par toutes les organisations qui en auraient besoin. De cette manière, la cohérence de l'interprétation de la loi par l'implémentation informatique serait garantie.
\paragraph{Transparence} La nécessité d'une implémentation unique de référence pour les textes législatifs nous amène naturellement à l'enjeu de la transparence. En effet, pour qu'elle puisse bénéficier à l'ensemble des organisations qui en auraient besoin, l'implémentation de référence doit être publiée en open-source. L'ouverture du code source de ces implémentations considérées comme documents administratifs est une obligation légale depuis la loi pour une République numérique du 7 octobre 2016, confirmée par la décision du tribunal administratif de Paris du 18 février 2016 en ce qui concerne l'implémentation du calcul de l'impôt sur le revenu.
L'ouverture du code source possède également l'avantage de permettre un processus collaboratif d'écriture et de validation de l'implémentation entre les diverses organisations concernées. Concrètement, si l'implémentation est publiée par une administration publique, elle pourrait recueillir avant mise en production d'éventuels commentaires ou questions d'organisations privées ou associatives afin de préciser et d'affiner certains choix d'interprétation ex ante, évitant ainsi de recourir au contentieux ex post.
Pour ces raisons, l'utilisation de notre méthode à base de programmation littéraire nous apparaît comme plus avantageuse à tout point de vue que les méthodes actuelles de validation par cas de test. Les programmes écrits dans nouveau langage de programmation créée pour ces annotations seront ensuite traduits (« compilés ») vers d'autres langages de programmation plus traditionnels pour être exécutés au sein d'applications informatiques.
\section{Étude de cas : les allocations familiales}
Afin de mettre en pratique ces nouveaux concepts, nous vous proposons un exemple annotation d'un article de loi définissant les allocations familiales par des morceaux de programmes écrits dans notre nouveau langage de programmation ad hoc. Le guide de lecture ci-dessous contient normalement toutes les informations nécessaires à la compréhension des annotations informatiques.
\subsection{Guide de lecture}
\paragraph{Objectif} Le but est dannoter le texte de loi avec un langage informatique correspondant (quon appellera « code »). Le langage informatique doit traduire exactement le contenu des articles, sans rien ajouter. Pour une plus grande clarté, le code sera placé dans le texte de loi, aux endroits pertinents. Cela permettra de vérifier localement, ligne à ligne, si le code correspond bien au texte de loi. Ce code sera mis en valeur par une \verb|police différente| et une \textcolor{OliveGreen}{coloration particulière}.
\paragraph{Avertissement} Ce guide a pour objet de définir les termes utilisés dans le code. Chaque terme défini a été choisi pour permettre une compréhension égale des juristes et informaticiens. Par conséquent, chaque terme a une signification précise en droit et en informatique. La signification retenue ici nest pas exactement celle du juriste ou de linformaticien, mais renvoie à des notions que lun et lautre comprennent. Cest pourquoi cette étape de définition - ou de syntaxe - doit être lue attentivement. Il faut aussi préciser que chaque terme défini est ensuite, dans le code, assorti dun autre terme correspondant au texte de loi.
\paragraph{Contexte} Le contexte est la description de tous les faits présents dans la réalité que va mentionner le morceau de texte de loi. En informatique, il est nécessaire de définir le contexte applicable à chaque partie du code avec un nom, qui suit le terme \inlinekw{contexte}. Deux morceaux de code peuvent avoir le même contexte sils sont désignés par le même terme suivant \inlinekw{contexte}. Ainsi, à chaque fois quapparait le terme \inlinekw{contexte}, le code définit son contexte dapplication.
\paragraph{Données} Les données sont les faits présents dans la réalité, dans un contexte donné. Ce sont tous les éléments que le programme va manipuler. Par exemple, dans la proposition suivante « tout enfant jusquà la fin de lobligation scolaire », les données sont (1) l'enfant et (2) la fin de lobligation scolaire. Ces deux données sont nécessaires et suffisantes pour faire fonctionner le code. Ainsi, chaque fois quapparaît le mot donnée, un élément utilisé par la suite dans le code sera déterminé.
Une donnée, introduite par \inlinekw{donnée}, peut également être annotée par un \inlinekw{contenu}, qui décrit ce que représente cette donnée : un entier pour un nombre dannées, un montant pour un revenu, etc. Cette annotation de contenu est nécessaire en informatique, car cest ce qui permet deffectuer les calculs numériques.
\paragraph{Choix} Parfois, une donnée peut avoir un contenu qui prend plusieurs formes. Par exemple, lentité en charge dun enfant est soit un couple soit une personne seule. On exprime cette disjonction de cas en utilisant \inlinekw{choix}, puis en introduisant chacun des cas avec \inlinekw{-}\inlinekw{-}. Lors que lon veut ensuite utiliser une donnée dont le contenu est un choix, il faut alors examiner chacun des cas avec \inlinekw{selon} $\ldots$ \inlinekw{sous forme}.
\paragraph{Collections} Autre cas particulier du contenu dune donnée : si celle-ci fait référence à plusieurs choses. Par exemple, la donnée \texttt{enfants} fait référence à tous les enfants dun ménage. On exprimera cette multiplicité à laide de \inlinekw{collection} et si lon veut utiliser cette collection de données, on le fera avec \inlinekw{existe} $\ldots$ \inlinekw{dans} $\ldots$ \inlinekw{tel que} et \inlinekw{pour tout} $\ldots$ \inlinekw{dans} $\ldots$ \inlinekw{on a}.
\begin{metadata}
Le contexte et les données correspondent aux métadonnées. Ce sont des éléments qui ne définissent pas de règle juridique précise, mais qui sont nécessaires pour la traduction en langage informatique. Cest pourquoi ces métadonnées sont placées avant les règles et mises en valeur par une boîte colorée, comme ici.
\end{metadata}
\paragraph{Champ dapplication} Le champ dapplication dun article de loi sinscrit dans un contexte particulier. Dans le code, il est nécessaire de préciser le champ dapplication de chaque article de loi. Ce champ dapplication sera introduit par \inlinekw{champ dapplication}, suivi dun nom correspondant à un contexte précédemment défini.
\paragraph{Règles} Le but du programme est de traduire en langage informatique les règles exprimées dans le texte de loi. Les règles sont donc les éléments du texte législatif qui permettent daboutir à des conséquences. Ces conséquences peuvent être : une définition, une règle logique ou ou une assertion. Nous allons définir chacune de ces règles. Cependant, toute règle ne sapplique que si une condition précise est valable. Cette condition est introduite par \inlinekw{sous condition}, et sa conséquence par \inlinekw{conséquence}. Les règles peuvent également manipuler des conditions juridiques introduites par \inlinekw{condition}.
\paragraph{Règle logique} Une règle permet dexprimer des relations logiques entre éléments du texte de loi. Elle permet notamment de préciser quand des conditions sont remplies. Les règles logiques sont introduites par le mot \inlinekw{règle}.
\paragraph{Définition} La définition permet de définir une donnée en fonction dune autre donnée. Elle permet dexprimer une donnée en fonction dune ou plusieurs autres. Elles sont introduites par \inlinekw{définition}.
\paragraph{Assertions} Les assertions sont, en langage informatique, une condition de cohérence. Le code doit vérifier que les assertions sont toujours vraies lorsquil sexécute. Cela permet dassurer une cohérence densemble à tout le programme. Les assertions peuvent être très variées et imposer plusieurs types de vérifications. Elles sont exprimées en langage informatique sous le terme \inlinekw{assertion}.
\subsection{Exemple d'article de loi annoté}
\paragraph{Article L512-3} Sous réserve des règles particulières à chaque prestation, ouvre droit aux prestations familiales :
\begin{Verbatim}[commandchars=\\\{\}]
\kw{champ dapplication} PrestationsFamiliales :
\kw{condition} droits_ouverts
\kw{condition} alinéa_1_L512_3
\kw{condition} alinéa_1_L512_3
\kw{règle sous condition}
alinéa_1_L512_3 \kw{ou}
alinéa_2_L512_3
\kw{conséquence} droit_ouverts \kw{rempli}
\end{Verbatim}
1°) tout enfant jusquà la fin de lobligation scolaire ;
\begin{metadata}
\begin{Verbatim}[commandchars=\\\{\}]
\kw{contexte} EnfantPrestationsFamiliales :
\kw{donnée} fin_obligation_scolaire
\kw{contexte} PrestationFamiliale :
\kw{donnée} enfants \kw{collection de donnée} EnfantPrestationFamiliales
\end{Verbatim}
\end{metadata}
\begin{Verbatim}[commandchars=\\\{\}]
\kw{champ dapplication} PrestationFamiliale :
\kw{règle sous condition}
\kw{existe} enfant \kw{dans} enfants \kw{tel que}
\kw{date_aujourd_hui} < enfant.fin_obligation_scolaire
\kw{conséquence} alinéa_1_L512_3 \kw{rempli}
\end{Verbatim}
2°) après la fin de lobligation scolaire, et jusquà un âge limite, tout enfant dont la rémunération éventuelle nexcède pas un plafond
\begin{metadata}
\begin{Verbatim}[commandchars=\\\{\}]
\kw{contexte} EnfantPrestationsFamiliales :
\kw{donnée} fin_obligation_scolaire \kw{contenu date}
\kw{donnée} âge \kw{contenu entier}
\kw{donnée} rémuneration \kw{contenu montant}
\kw{contexte} PrestationFamiliales :
\kw{donnée} âge_limite_L512_3_2 \kw{contenu entier}
\kw{donnée} plafond_rémunération_L5212_3_2 \kw{contenu montant}
\end{Verbatim}
\end{metadata}
\begin{Verbatim}[commandchars=\\\{\}]
\kw{champ dapplication} PrestationFamiliales :
\kw{règle sous condition}
\kw{existe} enfant \kw{dans} enfants \kw{tel que}
date_aujourd_hui > enfant.fin_obligation_scolaire \kw{et}
enfant.rémunération < plafond_rémunération_L5212_3_2 \kw{et}
enfant.âge < âge_limite_L512_3_2
\kw{conséquence} alinéa_2_L512_3 \kw{rempli}
\end{Verbatim}
\subsection{Questionnaire de satisfaction}
Le langage de programmation présenté ci-dessus est toujours à l'étude, et nous souhaitons que le projet bénéficie le plus tôt possible de retours de professionnels susceptibles d'utiliser ou d'être en contact avec ce nouvel outil. Aussi nous vous proposons de nous faire part de vos retours en remplissant le formulaire page suivante. Les questions sont posées dans un ordre croissant de difficulté de compréhension du document. Une fois le formulaire rempli, enregistrez le PDF sous un autre nom et envoyez-le par email aux auteurs aux adresses suivantes:
\begin{center}
\href{mailto:denis.merigoux@inria.fr}{\texttt{denis.merigoux@inria.fr}}\\[0.5em]
\href{mailto:huttner.liane@gmail.com}{\texttt{huttner.liane@gmail.com}}\\[0.5em]
\href{mailto:nicolas.chataing@ens.fr}{\texttt{nicolas.chataing@ens.fr}}
\end{center}
\clearpage
\label{form}
\begin{Form}
\begin{center}
\textbf{(1) Quel est votre nom et profession ? Vous pouvez également indiquer des détails pertinents sur votre expérience ou parcours.}\\[1em]
\TextField[multiline=true, width=\textwidth]{}
\end{center}
\begin{center}
\textbf{(2) Est-ce que vous comprenez la démarche ?}\\[1em]
\TextField[multiline=true, width=\textwidth]{}
\end{center}
\begin{center}
\textbf{(3) Est-ce que vous arrivez à poser votre regard sur les morceaux de code sans avoir mal à la tête ?}\\[1em]
\TextField[multiline=true, width=\textwidth]{}
\end{center}
\begin{center}
\textbf{(4) Est-ce que vous arrivez à comprendre le sens du code étant donné le guide de lecture au début ?}\\[1em]
\TextField[multiline=true, width=\textwidth]{}
\end{center}
\begin{center}
\textbf{(5) Est-ce que vous arrivez à relier le sens de chacun des morceaux de code au sens du texte législatif qu'il est censé annoté ?}\\[1em]
\TextField[multiline=true, width=\textwidth]{}
\end{center}
\begin{center}
\textbf{(6) Est-ce que vous pouvez certifier que le code fait bien ce que dit la loi et rien de plus ? Si non, est-ce que vous avez trouvé une erreur dans le code ?}\\[1em]
\TextField[multiline=true, width=\textwidth]{}
\end{center}
\end{Form}
\end{document}

View File

@ -1,183 +0,0 @@
\documentclass[11pt, french]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{lmodern}
\usepackage{hyperref, csquotes, textcomp}
% \usepackage{listings}
\usepackage{minted}
\setminted[lawspec]{linenos, firstnumber=last}
\renewcommand\theFancyVerbLine{\tiny\color{gray}\arabic{FancyVerbLine}}
\usepackage{fullpage}
\usepackage[french]{babel}
\usepackage{hyperref, url}
\usepackage[dvipsnames]{xcolor}
\usepackage{draftwatermark}
\SetWatermarkText{Brouillon}
\SetWatermarkScale{1}
\SetWatermarkColor[gray]{0.92}
\title{
Proposition d'un langage de formalisation de textes législatifs
}
\author{
Denis Merigoux\\Inria\and
Nicolas Chataing\\Inria -- École Normale Supérieure\and
Liane Huttner\\Université Panthéon-Sorbonne
}
\begin{document}
\maketitle
\section{Introduction}
Impôts, allocations et pensions de retraites partagent un point commun : les règles de calcul des
montants de ces transferts sociaux sont définies dans des textes législatifs. Ce sont ces textes
en langage naturel, votés par le parlement ou décrétés par le gouvernement, qui servent de référence
aux administrations et entreprises qui ont besoin de calculer ces montants de transferts. Cependant,
ces calculs sont largement effectués automatiquement : il existe donc des programmes informatiques
qui suivent les règles définies par la loi pour calculer le montant des transferts sociaux. Dès lors
se pose la question suivante : comment être sûr que ces programmes informatiques, écrits dans des
langages de programmation, implémentent fidèlement les règles décrites en langage naturel dans les
textes législatifs ?
Il existe plusieurs manières d'obtenir des garanties de fidélité des programmes par rapport aux
tests. La manière la plus simple, actuellement utilisée par la plupart des administrations et
entreprises, consiste à faire rédiger par des juristes des études de cas où le calcul est détaillé
pour une situation individuelle. Les programmeurs informatiques peuvent ainsi vérifier que le détail
et le résultat du calcul informatique sur cette situation correspond bien à ce qu'on écrit les
juristes. La garantie apportée par ces études de cas est proportionnelle à leur nombre et
à leur diversité : si une règle de calcul n'est pas couverte par une de ces études de cas, elle
ne sera pas couverte pas la garantie.
De manière plus subtile, il ne suffit pas de couvrir toutes
les règles de calcul par des études de cas pour obtenir une garantie complète de fidélité. En effet,
le comportement de la règle de calcul dépend des valeurs des montants en présence. Pour obtenir une
garantie complète de complexité, il faudrait ainsi couvrir par des études de cas tous les comportements
possibles de toutes les règles de calcul en présence. Le nombre d'études nécessaire pour atteindre
cet objectif, difficile à quantifier, est très élevé et en pratique jamais atteint. Dès lors,
comment faire pour obtenir la garantie complète de fidélité du programme informatique par rapport à
la loi ?
Plutôt que d'évaluer le programme informatique par l'extérieur avec des études de cas, nous proposons
une approche alternative basée sur un vieux concept d'informatique, la programmation littéraire.
Le principe de la programmation littéraire est de mêler dans une même source le code informatique
ainsi que la description en langage naturel de ce que le code est censé faire. Dans notre cas, cette
description en langage naturel est également la source de vérité sur le comportement du programme
informatique : les textes législatifs.
Concrètement, cela consiste à partir du texte législatif et annoter ligne à ligne le texte juridique
par une traduction informatique fidèle qui restranscrirait tout le contenu sémantique de la ligne
de texte, et rien que ce contenu. En procédant ainsi, le problème de la garantie globale de fidélité
du programme informatique par rapport à la loi est réduit à la vérification locale de la fidélité d'un
morceau de code par rapport à une ligne du texte législatif. Cette vérification demande une grande
expertise juridique car il s'agit de connaître précisément l'interprétation du texte législatif dans
toutes les situations possibles.
Notre objectif est de rendre possible cette vérification par des juristes spécialisés. Il faut
donc que les annotations sous forme de code soient compréhensibles par ces juristes moyennant une
formation minimale. Pour cela, il est nécessaire de créer un nouveau langage de programmation qui
répond à cette contrainte de lisibilité. L'annotation des textes législatifs par des programmes
rédigés dans ce nouveau langage de programmation correspond au concept de formalisation : il s'agit
de donner une définition précise au sens mathématique à toutes les règles de calcul décrites
dans la législation.
\section{Pour une législation socio-fiscale formalisée}
Nous affirmons que la méthode basée sur la programmation littéraire des textes législatifs que
nous proposons apporterait un progrès significatif par rapport aux méthodes actuelles de production
des implémentations informatiques de ces textes. Ce progrès se décline en trois principaux axes.
\paragraph{Sécurité juridique} Contrairement au langage naturel, un langage de programmation ne
laisse pas de place à l'imprécision et à l'incohérence. Lors de l'implémentation d'un programme censé
suivre des textes de lois, le programmeur est obligé de faire des décisions arbitraires. Par exemple,
si la loi spécifie une règle différente selon si le montant des revenus est en-dessous ou au-dessus
d'un certain seuil, le programmeur doit décider arbitrairement se qui se passe quand le montant
des revenus est égal au seuil. La revue du code par un juriste spécialisé permettrait de vérifier
que ces choix arbitraire sont des interprétations valides du texte législatif.
Plus globalement, la garantie d'une implémentation fidèle au texte législatif apporte un très niveau
de sécurité juridique à l'organisation qui utiliserait cette technique. Le champ des méthodes
formelles, sur lequel repose la théorie derrière cette proposition, est utilisé dans tout les
secteurs d'activité critiques tels que le transport (aérien et ferroviaire), la cryptographie,
le spatial et même le contrôle des centrales nucléaires. Un contentieux
soulevé par une mauvaise implémentation d'un texte législatif peut avoir de lourdes
conséquence si cette implémentation est utilisée à grande échelle. Dans ce cas, les processus
utilisés en méthodes formelles sont tout à fait adaptés pour prévenir toute
possibilité de contentieux.
\paragraph{Cohérence} Le corpus législatif est si imposant et complexe qu'il existe une institution,
le Conseil d'État, toute entière dédiée à en assurer la cohérence. Ces problèmes de cohérence se
posent aussi pour les portions de la législation qui définissent les transferts sociaux. Cependant,
dans ce cas particulier, la cohérence législative repose sur la cohérence mathématique des règles
de calcul définies dans les textes. Il s'agit par exemple de vérifier que le montant d'une allocation
est bien dégressive par rapport aux revenus du ménage, ou bien que le taux marginal d'imposition
ne peux dépasser un certain seuil. La formalisation des règles de calcul permet de les étudier
en tant qu'objet mathématique, et ainsi de prouver comme théorème la cohérence législative.
Un deuxième aspect de la cohérence législative concerne l'existence même de plusieurs implémentations
informatique des textes législatifs. Si plusieurs organisations possèdent chacune leur programme
informatique censé respecter le même texte législatif, comment s'assurer que ces implémentations
sont bien cohérentes ? D'un point de vue économique, l'existence même de plusieurs implémentations
concurrentes d'un même texte législatif est contre-productive en termes de maintenance. Pour cette
raison, l'implémentation à base de programmation littéraire que nous proposons servirait d'implémentation
unique de référence du texte législatif, partagée par toutes les organisations qui en auraient besoin.
De cette manière, la cohérence de l'interprétation de la loi par l'implémentation informatique
serait garantie.
\paragraph{Transparence} La nécessité d'une implémentation unique de référence pour les textes
législatifs nous amène naturellement à l'enjeu de la transparence. En effet, pour qu'elle puisse
bénéficier à l'ensemble des organisations qui en auraient besoin, l'implémentation de référence doit
être publiée en \enquote{open-source}. L'ouverture du code source de ces implémentations considérées
comme documents administratifs est
une obligation légale depuis la loi pour une République numérique du 7 octobre 2016, confirmée
par la décision du tribunal administratif de Paris du 18 février 2016 en ce qui concerne l'implémentation
du calcul de l'impôt sur le revenu.
L'ouverture du code source possède également l'avantage de permettre un processus collaboratif
d'écriture et de validation de l'implémentation entre les diverses organisations concernées.
Concrètement, si l'implémentation est publiée par une administration publique, elle pourrait
recueillir avant mise en production d'éventuels commentaires ou questions d'organisations privées
ou associatives afin de préciser et d'affiner certains choix d'interprétation \emph{ex ante},
évitant ainsi de recourir au contentieux \emph{ex post}.\\
Pour ces raisons, l'utilisation de notre méthode à base de programmation littéraire nous apparaît
comme plus avantageuse à tous point de vue que les méthodes actuelles de validation par cas de
test. Les programmes écrits dans nouveau langage de programmation créée pour ces annotations seront
ensuite traduits
(\enquote{compilés}) vers d'autres langages de programmation plus traditionnels
pour être exécutés au sein d'applications informatiques.
\section{Étude de cas : les allocations familiales}
Affin de mettre en pratique ces nouveaux concepts, nous vous proposons une annotation du corpus
législatif définissant les allocations familiales par des morceaux de programmes écrits dans
notre nouveau langage de programmation \emph{ad hoc}. Le guide de lecture d'une page ci-dessous
contient normalement toutes les informations nécessaires à la compréhension des annotations
informatiques.
\subsection{Guide de lecture}
\paragraph{Programmation littérale} Le texte de la loi est annoté avec des morceaux de code qui traduisent le contenu des articles et alinéa en termes formels. Ces blocs de code sont intercalés dans le texte de loi, remarquables à leur police en chasse fixe et la coloration de certains mots. Un morceau de code annotant une ligne d'un texte de loi doit contenir tout le contenu sémantique de la ligne de texte, et rien d'autre que ce contenu. L'idée est de pouvoir vérifier localement, ligne à ligne, la cohérence entre le code et le texte législatif.
\paragraph{Situations} Une situation correspond à un contexte logique dans un morceau de code. De même que dans un texte législatif, on se met dans une situation particulière dans laquelle les entités et concepts que l'on nomme ont un sens, chaque morceau de code se place dans un contexte bien particulier auquel on donne un nom. Deux morceaux de code partagent le même contexte logique si ils sont introduits par des lignes \mintinline{lawspec}|situation| ayant le même nom. Une ligne \mintinline{lawspec}|situation| précise aussi la source juridique du contenu qui y sera précisé : loi, décret, règlement ou implicite pour un contenu logique non explicité dans la loi mais qui découle du bon sens.
\paragraph{Données} Au sein d'une situation, il est possible de déclarer différentes données (\mintinline{lawspec}|donnée|). Ces données sont les quantités et prédicats que le programme va manipuler. Afin de préciser ces données, chacune d'entre elle est assortie d'un type ou d'une situation qui en décrit le contenu. Un type correspond à des quantités primitives comme les entiers, les booléens (vrai ou faux), les dates, les montants d'argent, etc. Une donnée peut aussi contenir une situation qui elle même contient d'autre données, permettant de donner de la structure. Lorsque rien n'est précisé quant au contenu d'une donnée, c'est qu'il n'y a pas de contenu (ou plutôt le contenu est trivial).
\paragraph{Règles} Le but de l'algorithme est d'exprimer comment calculer une donnée-but en fonction d'un ensemble de données-entrées. Cependant, les textes ne définissent pas de données-but ni de données-entrées ; ils se contente d'exprimer des relations entre les données. Une des relations exprimées par les textes à propos des données est la définition. Les règles (\mintinline{lawspec}|règle|) permettent de définir une donnée en fonction d'autres données de la situation. À l'instar des textes, cette définition peut être conditionnelle, pour cela on utilisera les mots-clés \mintinline{lawspec}|condition| et \mintinline{lawspec}|conséquence|.
\paragraph{Assertions} Le deuxième type de relation que les textes expriment sur les données consiste à exiger une condition de cohérence. Les \mintinline{lawspec}|assertion| permettent d'exprimer cette exigence de cohérence ; ces conditions doivent être toujours vraies lorsque l'algorithme s'exécute. Une assertion peut tout aussi bien imposer une condition sur les données en entrée, qu'imposer une propriété que l'algorithme doit vérifier. Par exemple, il est possible d'exiger dans une assertion que telle donnée varie de manière décroissante en fonction d'une autre donnée.
\paragraph{Collections} Parfois, le contenu d'une donnée correspond à une collection de contenus, au nombre indéterminé. Il est possible de déclarer ces \mintinline{lawspec}|collections|, et l'on peut alors accéder aux éléments individuels des collections en utilisant les formule existentielles (\mintinline{lawspec}|existe ... tel que|) ou universelles (\mintinline{lawspec}|pour tout ... on a|).
\paragraph{Choix} Si les \mintinline{lawspec}|situation| permettent de regrouper plusieurs données dans un même contexte, les \mintinline{lawspec}|choix| permettent au contraire d'exprimer une disjonction de cas dans un algorithme. Chaque possibilité du choix peut, à l'instar des données d'une situation, porter un contenu qui peut être un type, une situation ou bien un autre choix. Afin d'examiner dans le code la valeur contenu dans un contenu choix, on utilisera la syntaxe \mintinline{lawspec}|selon ... sous forme|.
\subsection{Extrait du corpus législatif définissant les allocations familiales}
\input{allocations_familiales.tex}
\end{document}