UE ELFE - Programmation Logique

Transcription

UE ELFE - Programmation Logique
USTL
Licence mention Informatique
UE ELFE - Programmation Logique
Exercice 1 : Le langage issu d’un automate
On désire reconnaı̂tre les mots d’un langage, dont on connaı̂t l’automate, qui est celui de la figure 1.
1
a
Exercice 3 : Ensembles
On se propose de manipuler la notion d’ensemble à l’aide de listes Prolog. On rappelle qu’un ensemble n’est pas
ordonné et ne contient jamais de doublons.
Écrire les prédicats de manipulation d’ensembles suivants :
Q 1 . union qui calcule l’union des deux ensembles fournis comme deux premiers arguments,
> union([a,b,c],[d,e,c],L).
L=[a,b,c,d,e]
2
Q 2 . intersection qui calcule l’intersection des deux ensembles fournis comme deux premiers arguments,
> intersection([a,b,c],[d,e,c],L).
L=[c]
b
3
a
Figure 1: Automate du langage
Q 1 . Entrez l’automate de la figure 1 en utilisant des faits de la forme entree(+Etat), sortie(+Etat) et
transition(+Entree,+Lettre,+Sortie).
Q 2 . Écrivez le prédicat reconnaitre(+Mot) qui est vrai si Mot est un mot du langage défini par l’automate. Mot
sera une liste de lettre.
Exercice 2 : Classiques
Q 3 . inclus qui est satisfait si le premier argument est un ensemble inclus dans l’ensemble donné en second
argument.
Q 4 . complementaire qui calcule le complémentaire de l’ensemble fourni en premier argument dans l’ensemble
fourni comme second argument. Il n’y a des solutions que si le premier argument est sous-ensemble du second argument.
> complementaire([a,c,e],[a,b,c,d,e,f],L).
L=[b,d,f]
Q 5 . differences qui calcule l’ensemble des différences entre deux ensembles passés en argument, c’est-à-dire
les éléments appartenant à l’un ou à l’autre des ensembles, mais pas aux deux.
> differences([a,b,c],[d,e,c],L).
L=[a,b,d,e]
Q 1 . Ecrivez un prédicat taille(?L,?T) qui unifie T avec la taille de la liste L.
Q 2 . Ecrivez un prédicat somme(+L,-S) qui unifie S avec la somme des éléments de la liste L supposés être des
nombres.
Q 3 . Écrire un prédicat ajoute(?X,?L,?LRes) qui ajoute (où vous voudrez) dans la liste L l’objet X, le résultat
est dans LRes.
Exercice 4 :
Écrire le prédicat nb rotations(+L,+R,-N) qui renvoie dans N le nombre de rotations gauches qu’il a fallu effectuer
sur L pour obtenir R.
> nb_rotations([a,b,c,d],[c,d,a,b],R).
R=2
Q 4 . Écrire un prédicat max(+L,?X) qui unifie X avec le plus grand élément de L, une liste de nombres.
Q 5 . Ecrire un prédicat substitue(+Original,+Remplacant,+L,-LResultat) qui unifie LResultat avec la liste
obtenue en remplaçant toutes les occurrences de Original par Remplacant dans la liste L.
Q 6 . Ecrire un prédicat efface(+X,+L,-LRes) qui supprime une occurrence de l’objet X dans la liste L, le résultat
est dans LRes.
Q 7 . Écrire un prédicat effacetout(+X,+L,-LRes) qui supprime toutes les occurrences de l’objet X dans la liste
L, le résultat est dans LRes.
Q8.
Q 8.1. Ecrivez un prédicat insere(?L,?V,?Res) qui est satisfait ssi Res peut être obtenue en insérant V à
une position quelconque de L.
Q 8.2. Ecrivez un prédicat permutation(?L,?Res) qui est satisfait ssi Res peut être obtenue par permutation des éléments de L.
Q 9 . Ecrire un predicat diffListe(?L1,?L2,?Resultat) qui :
• si L2 est une liste suffixe de L1, unifie Resultat avec le préfixe de L1 une fois L2 retirée (càd, si
L1=Prefixe+L2, alors Resultat est unifiée avec Prefixe ; par exemple, L1=[a,b,c,d,e] L2=[c,d,e], alors
Resultat=[a,b].
• si L2 n’est pas un suffixe de L1 unifie Resultat avec L1.
Exercice 5 : Tris
On se donne un prédicat inf(A,B) qui est satisfait si l’objet A est plus petit que l’objet B dans une certaine relation
d’ordre.
Q 1 . Codez inf quand A et B sont des nombres.
Q 2 . Écrire un prédicat ordonne(+L) qui est satisfait si L est une liste ordonnée.
Q 3 . Écrire un prédicat triFusion(+L,-Ltriee) qui trie L par la méthode du tri fusion.
Q 4 . Écrire un prédicat triBulle(+L,-Ltriee) qui trie L par la méthode du tri bulle. (On pourra utiliser le prédicat
append pour générer les listes)
Exercice 6 : parcours de labyrinthe On représente un labyrinthe par un ensemble de faits de la forme :
entree(Entree).
sortie(Sortie).
passage(Piece1,Piece2).
Q 1 . Écrire un prédicat qui fournisse un chemin dans le labyrinthe.
Exercice 7 : histoire d’un fermier, d’un loup, d’une chèvre et d’un chou
Un fermier se trouve sur la rive Nord d’une rivière en compagnie d’un loup, d’une chèvre et d’un chou. Il doit faire
traverser tout le monde sur la rive Sud. Pour cela il dispose d’une barque, qu’il est évidemment le seu là pouvoir
mener et dans laquelle il ne peut prendre que l’un des trois autres à la fois. Cependant il ne peut laisser seuls sur
un même rive ...
• le loup et la chèvre
• la chèvre et le chou
sous peine de voir les premiers dévorer les seconds.
Quelle est la suite de trajets, et en quelle compagnie, le fermier doit-il effectuer pour amener tout le monde sur la
rive Sud.
Programmation On représente les rives par les constantes nord et sud et on précise :
opposee(nord,sud).
opposee(sud,nord).
On représente les configurations du monde par des termes de la forme :
monde(Fermier,Loup,Chevre,Chou)
où les arguments prennent les valeurs nord ou sud selon la rive où se trouve chacun.
Q 1 . Écrire un prédicat resoud(-Sol) qui instancie Sol avec la liste des configurations du monde correspondant
aux différentes étapes de la solution au problème.
Exercice 10 : Coloration de graphe
Le problème de la coloration de graphe est assez classique, il consiste à colorier, en utilisant une liste de couleurs
imposées, les zones d’une carte sans utiliser la même couleur pour deux zones qui se touchent (adjacentes).
On peut par exemple colorier la carte de France, découpée en zones correspondant aux départements, en n’utilisant
que les quatre couleurs rouge, bleu, jaune et vert. La différence de couleur entre deux départements adjacents
garantit une meilleure lisibilité de la carte obtenue.
Le but de cet exercice est de générer une liste des couleurs des différentes zones d’une carte en respectant la
contrainte de voisinage mentionnée.
On définit la carte à colorier par une liste d’adjacences qui énumére les
couples de zones adjacentes, on ne répète pas les symétries. Voici un
exemple pour la carte ci-contre :
Cette carte est représentée par la liste :
[[1,2],[1,3],[1,4],[1,5],[2,3],[2,4],[3,4],[4,5]]
Dans la suite les paramètres nommés Map respectent cette structure.
On cherche à écrire un prédicat colorie(+Map,+LesCouleurs,-LesColoriages) qui unifie la variable LesColoriages
avec une liste de couples (zone,couleur) réalisant un coloriage des zones de la carte Map avec les couleurs de
LesCouleurs respectant la contrainte d’adjacence. Ainsi on aura :
?- colorie([[1,2],[1,3],[1,4],[1,5],[2,3],[2,4],[3,4],[4,5]],
[rouge,vert,bleu,jaune],LesColoriages).
LesColoriages = [[5,rouge],[4,vert],[3,rouge],[1,bleu],[2,jaune]] ; ... (48 solutions ici)
Exercice 8 : Le problème du cavalier
Le problème est assez classique : est-il possible de déplacer sur un jeu d’échecs un cavalier de telle manière qu’il
passe une et une seule fois sur chacune des cases de l’échiquier ? Rappelons qu’aux échecs un cavalier se déplace
en bougeant de deux cases verticalement ou horizontalement et d’une case dans une direction perpendiculaire (en
restant sur l’échiquier...). Il y a donc au plus 8 déplacements possibles à partir d’une case donnée.
Plutôt que de se casser la tête à chercher la solution, laissons Prolog faire le travail pour nous...
On peut représenter les cases de l’échiquiers par des termes1 de la forme case(i,j) où i et j sont respectivement
les numéros de ligne et colonne de la case (de 1 à 8).
On suppose défini (voir portail) le prédicat : coup legal(+Depart,-Arrivee) qui unifie Arrivee avec une case qui
peut être atteinte par le cavalier à partir de la case Depart.
Ainsi, on a pour le but :
?- coup_legal(case(1,2),Arr).
Arr = case(2,4) ;
Arr = case(3,1) ;
Arr = case(3,3) ;
No
?Q 1 . Programmez un prédicat cavalier(-L) qui est satisfait si il existe une solution pour le problème du cavalier, L
est alors unifiée avec la liste (dans l’ordre) des cases empruntées.
Exercice 9 : Casse-tête
Voici un petit problème de traversée :
Un quatuor a un concert de l’autre côté d’un pont dans 17 mn. Il n’y a qu’une seule lampe et comme il fait nuit, il
faut que la ou les personnes qui traversent le pont ait la lampe. On ne peut pas jeter la lampe de l’autre côté du
pont. 2 personnes maximum peuvent traverser le pont en même temps. Ces 4 personnes ont des vitesses différentes
et quand 2 personnes traversent en même temps, leur vitesse est déterminée par la vitesse du plus lent.
• André peut traverser en 1 minute
• Bernard peut traverser en 2 minutes
• Claude peut traverser en 5 minutes
• Daniel peut traverser en 10 minutes
Trouver les 2 façons de traverser ce pont pour arriver de l’autre côté avant le début du concert.
Q 1 . Écrivez un programme Prolog qui résoud seul ce problème à partir de ces données.
1 pas
des faits !
Q 1 . Définir un prédicat adjacent(?X,?Y,+Map) qui est satisfait si X et Y sont deux zones adjacentes dans la
carte définie par le paramètre Map.
Q 2 . Définir un prédicat trouveLesZones(Map,Acc,ListeZones), qui unifie ListeZones avec la liste de toutes les
zones de Map, sans répétition des zones. Acc est un paramètre d’accumulation utilisé pendant le calul (a
priori initialisé à []). Exemple :
trouveLesZones([[1,2],[1,3],[1,4],[1,5],[2,3],[2,4],[3,4],[4,5]],[],LZ).
LZ = [5,4,3,1,2]
Q 3 . Ecrire un prédicat conflitAdjacence(+ListeZonesCouleurs,+Map) qui est satisfait si dans la liste de couples (Zone,Couleur) passé en premier paramètre il y a deux zones de Map, il y a deux zones adjacentes avec
la même couleur.
Q 4 . Ecrire un prédicat colorie qui calcule une liste de couples (zone,couleur) réalisant un coloriage de toutes
les zones d’une carte en utilisant uniquement les couleurs définies dans une liste de couleurs données et
respectant la contrainte d’adjacence.
Vous pouvez procéder en générant une liste quelconque de couples (Zone,Couleur) et en vérifiant ensuite si
elle n’a pas de conflit d’adjacences.