Outils pour utilisateurs

Outils du site


ia:prolog:intro

Ceci est une ancienne révision du document !


Introduction à Prolog

Supports de cour

Travaux pratique en Prolog

L'objectif de ces TPs est découvrir la programmation par contrainte.

Nous utiliserons pour cela le langage Prolog, et pour les plus rapides la librairie Pyke en Python.

Prise en main

Problème

Nous allons traiter un cas concret de planification de tâches appliqué à la robotique.

Énoncé

Une école dispense des cours dans des salles informatiques équipées d'ordinateurs.

L'objectif est qu'avant chaque cours, tous les ordinateurs soient allumés et qu'une bouteille d'eau soit disponible pour l'enseignant.

L'école dispose d'un robot capable d'allumer un ordinateur s'il est éteint, et d'apporter une bouteille d'eau dans une salle.

Les créneaux de cours sont les suivants:

  • 7h00-8h00: libre (pas de cours)
  • 8h00-10h00;
  • 10h-10h30: pause (toutes les salles sont inoccupées);
  • 10h30-12h30;
  • 12h30-13h30: pause
  • 13h30-15h30;
  • 15h30:16h00: pause
  • 16h00-18h00;
  • 18h00-19h00: libre (pas de cours)

L'objectif est de fournir un planning au robot permettant d'allumer avant chaque cours les machines et de fournir une bouteille d'eau.

Mise en pratique

Pour le moment, nous commencerons par considérer:

  1. que le robot a besoin de 30 minutes pour s'occuper d'une salle;
  2. que l'école dispose uniquement de 4 salles informatiques.

Nous complexifierons les données en fin de TP.

1) Description d'une solution
  1. Décrivez en prolog une structure permettant de représenter une solution.

<spoiler|Structure d'une solution> Il y a plusieurs solutions bien entendu, voici celle que nous utiliserons pour le moment:

plan([
    cr([_,_,_,_,_],r1),
    cr([_,_,_,_,_],r2),
    cr([_,_,_,_,_],r3),
    cr([_,_,_,_,_],r4),
    cr([_,_,_,_,_],r5),
    cr([_,_,_,_,_],r6),
    cr([_,_,_,_,_],r7),
    cr([_,_,_,_,_],r8),
    cr([_,_,_,_,_],r9),
    cr([_,_,_,_,_],r10),
    cr([_,_,_,_,_],r11),
    cr([_,_,_,_,_],r12),
    cr([_,_,_,_,_],r13),
    cr([_,_,_,_,_],r14),
    cr([_,_,_,_,_],r15),
    cr([_,_,_,_,_],r16),
    cr([_,_,_,_,_],r17),
    cr([_,_,_,_,_],r18),
    cr([_,_,_,_,_],r19),
    cr([_,_,_,_,_],r20),
    cr([_,_,_,_,_],r21),
    cr([_,_,_,_,_],r22),
    cr([_,_,_,_,_],r23),
    cr([_,_,_,_,_],r24)
    ]).

Questions auxquelles vous devez pouvoir répondre:

  • Q1.1 pourquoi la liste de la solution comprend 24 lignes ?
  • Q1.2 pourquoi dans cr([liste],valeur), liste a une taille de 5 et non de 4 (pour 4 salles)?
  • Q1.3 à quoi servent les valeurs de variable r1, r2,…,r24?

</spoiler>

2) Écriture du but et affichage
  1. Créez un but avec cette solution (que nous appellerons but).
  2. Affichez la solution (sans contrainte pour le moment).

<spoiler|Résultat attendu>

| ?- but.
[cr([_68,_70,_72,_74,_76],r1),cr([_81,_83,_85,_87,_89],r2),cr([_94,_96,_98,_100,_102],r3),cr([_107,_109,_111,_113,_115],r4),cr([_120,_122,_124,_126,_128],r5),cr([_133,_135,_137,_139,_141],r6),cr([_146,_148,_150,_152,_154],r7),cr([_159,_161,_163,_165,_167],r8),cr([_172,_174,_176,_178,_180],r9),cr([_185,_187,_189,_191,_193],r10),cr([_198,_200,_202,_204,_206],r11),cr([_211,_213,_215,_217,_219],r12),cr([_224,_226,_228,_230,_232],r13),cr([_237,_239,_241,_243,_245],r14),cr([_250,_252,_254,_256,_258],r15),cr([_263,_265,_267,_269,_271],r16),cr([_276,_278,_280,_282,_284],r17),cr([_289,_291,_293,_295,_297],r18),cr([_302,_304,_306,_308,_310],r19),cr([_315,_317,_319,_321,_323],r20),cr([_328,_330,_332,_334,_336],r21),cr([_341,_343,_345,_347,_349],r22),cr([_354,_356,_358,_360,_362],r23),cr([_367,_369,_371,_373,_375],r24)]
yes

<spoiler| Code du but et affichage>

but:-plan(P),
    write(P).

Questions auxquelles vous devez pouvoir répondre:

  • Q2.1 A quoi sert la règle plan(P) ?

</spoiler> </spoiler>

3) Amélioration de l'affichage
  1. Améliorez le rendu pour obtenir uniquement un affichage sous forme de tableau 2D (voir exemple attendu plus bas).
  2. Réalisez pour cela une règle print_plan(P) permettant d'afficher uniquement l'occupation des créneaux.

Vous pourrez avoir besoin de définir d'autres règles pour obtenir le résultat attendu!

Résultat attendu:

<prolog>

[_68,_70,_72,_74,_76] [_81,_83,_85,_87,_89] [_94,_96,_98,_100,_102] [_107,_109,_111,_113,_115] [_120,_122,_124,_126,_128] [_133,_135,_137,_139,_141] [_146,_148,_150,_152,_154] [_159,_161,_163,_165,_167] [_172,_174,_176,_178,_180] [_185,_187,_189,_191,_193] [_198,_200,_202,_204,_206] [_211,_213,_215,_217,_219] [_224,_226,_228,_230,_232] [_237,_239,_241,_243,_245] [_250,_252,_254,_256,_258] [_263,_265,_267,_269,_271] [_276,_278,_280,_282,_284] [_289,_291,_293,_295,_297] [_302,_304,_306,_308,_310] [_315,_317,_319,_321,_323] [_328,_330,_332,_334,_336] [_341,_343,_345,_347,_349] [_354,_356,_358,_360,_362] [_367,_369,_371,_373,_375]

yes

</prolog>

ia/prolog/intro.1509631670.txt.gz · Dernière modification : 2017/11/02 14:07 de bruno