Table des matières

Mini projet CHR

Ce projet a pour objectif de construire un moteur d'unification typée pour des termes de logique du premier ordre dans le langage CHR au dessus de Prolog.

Il est à rendre pour le 28 février 2015 par mail à emmanuel.coquery@univ-lyon1.fr.

Ressources

On rappelle qu'il est possible d'utiliser l'interpréteur CHR en ligne disponible ici, ressources disponibles ici.

Tutoriel Prolog

Termes et types

Les termes de logique, ainsi que les types, seront représentés par des termes Prolog manipulés en CHR.

Un terme sera représenté comme suit (selon sa sorte):

Un type sera;

Les types primitifs seront ceux des variables, des constantes et des termes, alors que les types flèche seront ceux des symboles de fonction (liste est la liste des types des arguments et res est le type résultat)

<note important>Attention à ne pas confondre la notion de terme et de variable en Prolog (e.g. X est une variable en Prolog) avec les termes et les variables définis ci-dessus où la variable de logique x est représentée par var('x')</note>

Unification simple

On commencera par implémenter l'algorithme de Martelli et Montanari expliqué en cours.

On pourra utiliser les contraintes CHR suivantes:

Voici, à titre d'exemple, le codage de deux règles: swap et delete

% delete
% supprime une équation si elle demande d'unifier les mêmes termes logiques
 
unif(T,T) <=> true.
 
% swap
% T est un terme, var(Y) est une variable
% la garde T \= var(Z) impose que T ne soit pas unifiable en Prolog avec var(Z), 
% ce qui impose que T ne soit pas une variable logique
 
unif(T,var(Y)) <=> T \= var(Z) | unif(var(Y),T).

<note tip> Exemple

La contrainte suivante:

unif(funct (plus , [ var(x), funct(plus, [var(x), const(b)]) ] ),
     funct(plus, [ funct(plus, [const(a), var(y)]), var(z) ] ) )

doit se transformer en:

unif(var(x), funct(plus, [const(a), var(y)]) ),
unif(var(z), funct(plus, [funct(plus, [const(a), var(y)]), const(b) ] ) )

</note>

Typage

Pour procéder au typage des termes, on se donne les contraintes CHR suivantes:

Définir des règles CHR pour le typage en vous appuyant sur les remarques suivantes:

<note tip> Exemple Les contraintes suivantes:

type_constante(a, t(int)), type_constante(b, t(int)), 
type_symb_fonction(plus, fleche([t(int),t(int)],t(int))),
check( fonct(plus, [ fonct(plus, [ const(a), const(b) ] ), const(b) ]) )

Doivent se transformer en

% contraintes inchangées
type_constante(a, t(int)), type_constante(b, t(int)), 
type_symb_fonction(plus, fleche([t(int),t(int)],t(int))),
% nouvelles contraintes
type(fonct(plus, [ fonct(plus, [ const(a), const(b) ] ), const(b) ]), t(int)),
type(fonct(plus, [ const(a), const(b) ] ), t(int)),
type(const(a), t(int)),
type(const(b), t(int))

</note>

<note tip> Exemple Les contraintes suivantes:

type_constante(a, t(string)), type_constante(b, t(int)), 
type_symb_fonction(plus, fleche([t(int),t(int)],t(int))),
check( fonct(plus, [ const(a), const(b) ] ) )

Doivent se transformer en false </note>

<note tip> Exemple Les contraintes suivantes:

type_constante(a, t(int)), 
type_symb_fonction(plus, fleche([t(int),t(int)],t(int))),
check( fonct(plus, [ fonct(plus, [ const(a), var(b) ] ), var(b) ]) )

Doivent se transformer en

% contraintes inchangées
type_constante(a, t(int)), 
type_symb_fonction(plus, fleche([t(int),t(int)],t(int))),
% nouvelles contraintes
type(fonct(plus, [ fonct(plus, [ const(a), const(b) ] ), const(b) ]), t(int)),
type(fonct(plus, [ const(a), const(b) ] ), t(int)),
type(const(a), t(int)),
type(var(b), t(int))

</note>

<note tip> Exemple Les contraintes suivantes:

type_symb_fonction(concat, fleche([t(string),t(string)],t(string))),
type_symb_fonction(i2s, fleche([t(int)],t(string))),
check( fonct(concat, [ var(x), fonct(i2s, [var(x)]) ] ) )

Doivent se transformer en false </note>

Unification typée

Combiner les deux solveurs précédents pour qu'une unification qui rend égaux deux termes de types différents échoue.