\documentstyle{farticle}
\topmargin -1.5cm
\oddsidemargin -0cm
\evensidemargin -0cm
\textheight 23cm
\textwidth 16.0cm
\title{Examen {\bf``Programmation en Logique''} $n^o \;2$  \\
 ESSI2 --- 30 Mai 1995\\ }
\author{Michel Rueher}
\date{}
\begin{document}
\maketitle
\begin{center}
\thispagestyle{empty}
{\large Documents autoris\'es: {\it supports (et notes) de cours de TD}}
\end{center}	
\section{Utilisation de Prolog  }

Une banque d\'ecide d'offrir \`a sa client\`ele la possibilit\'e
d'effectuer via le minitel la plupart des op\'erations propos\'ees 
dans l'un quelconque de ses guichets.\\

Vous \^etes charg\'e de la pr\'e-\'etude, de la conception et de la
r\'ealisation des traitements informatiques. Expliquez dans quelles
phases de ce travail, l'utilisation du langage  Prolog serait
pertinente.\\

P.S. Vous \^etes libre de d\'efinir les hypoth\`eses de votre choix
pour pr\'eciser le contexte ou la nature des op\'erations
``automatis\'ees'', mais vous devez expliciter les hypoth\`eses
utilis\'ees !

\section{DCGs }
\begin	{itemize}
\item 	Ecrivez un parseur DCG pour la grammaire suivante:\\
	{\tt
        <atome> ::== 'a' | 'b' | 'c' \\
        <sexpr> ::== <atome> | '('  <sexpr>+ ')'}

\item 	Donnez la traduction en Prolog du parseur DCG.

\item 	Etendez votre parseur DCG pour construire un arbre syntaxique.
   	Il n'est pas necessaire de donner la traduction en Prolog pour
   	le parseur \'etendu.

\item 	Quel est l'arbre donn\'e par le parseur \'etendu pour l'entr\'ee
  {\tt ((a b) c)}, i.e., la liste de tokens {\tt
['(','(',a,b,')',c,')']}$\;$?

\end	{itemize}	

\section{Explication de programme }
Les morceaux de code ci-dessous sont extraits d'une des solutions
propos\'ees pour le TD4-5.
\begin{enumerate}
\item	Expliquez la diff\'erence entre les pr\'edicats
$valeur\_semantique/2$ $n^o\; (1)$ et $n^o\; (2)$. On distinguera la s\'emantique
op\'erationnelle de la s\'emantique d\'enotationnelle.

{\tt
{\bf (1)} valeur\_semantique(et(P,Q),V) :- \\
\hspace*{1in}	valeur\_semantique(P,V1),\\
\hspace*{1in}	valeur\_semantique(Q,V2),\\
\hspace*{1in}	et(V1,V2,V).\\
{\bf (2)} valeur\_semantique(et(P,Q),vrai) :- \\
\hspace*{1in}	valeur\_semantique(P,vrai), \\
\hspace*{1in}	valeur\_semantique(Q,vrai),!. \\
\hspace*{0.2in}	 valeur\_semantique(et(P,Q),faux) :- !. \\
}

\item	Donner une d\'efinition pr\'ecise et {\bf concise} du travail
effectu\'e par le pr\'edicat $subst/3$ ci dessous. Justifiez le
traitement effectu\'e dans les clauses $A$ et $B$.

{\tt
subst(existe(X,P),[X,I],existe(X,P)). \hspace*{1in}{\bf (A)}  \\
subst(existe(Y,P),[X,I],existe(Y,P1)) :-\\
\hspace*{1in}	X \== Y,\\
\hspace*{1in}	subst(P,[X,I],P1).\\
subst(tout(X,P),[X,I],tout(X,P)). \hspace*{1.3in}{\bf (B)}  \\
subst(tout(Y,P),[X,I],tout(Y,P1)) :-\\
\hspace*{1in}	X \== Y,\\
\hspace*{1in}	subst(P,[X,I],P1).\\
subst(et(U,V),S,et(U1,V1)):-\\
\hspace*{1in}	subst(U,S,U1),\\
\hspace*{1in}	subst(V,S,V1).\\
subst(ou(U,V),S,ou(U1,V1)):-\\
\hspace*{1in}	subst(U,S,U1),\\
\hspace*{1in}	subst(V,S,V1).\\
subst(non(U),S,non(U1)):-\\
\hspace*{1in}	subst(U,S,U1).\\
subst(L,S,L1):-\\
\hspace*{1in}	L =.. [P|U],\\
\hspace*{1in}	symbole\_relationnel(P,A),\\
\hspace*{1in}	subst\_terme(A,U,S,U1),\\
\hspace*{1in}	L1 =.. [P|U1].	 \\
subst\_terme(1,[T],S,[T1]):-\\
\hspace*{1in}	terme(T),\\
\hspace*{1in}	subst1(T,S,T1).\\
subst\_terme(N,[T|Ts],S,[T1|Ts1]):-\\
\hspace*{1in}	N > 1,\\
\hspace*{1in}	terme(T),\\
\hspace*{1in}	subst1(T,S,T1),\\
\hspace*{1in}	N1 is N - 1,\\
\hspace*{1in}	subst\_terme(N1,Ts,S,Ts1).\\
}

\end{enumerate}	


\end{document}     


