chapitre 11 : modules prologchapitre 11 : modules prolog alexandre blondin mass e d epartement...
Post on 21-Feb-2021
8 Views
Preview:
TRANSCRIPT
Chapitre 11 : Modules Prolog
Alexandre Blondin Masse
Departement d’informatiqueUniversite du Quebec a Montreal
28 mars 2018Paradigmes de programmation
INF2160
A. Blondin Masse (UQAM) 28 mars 2018 1 / 23
Table des matieres
1. Modules
2. Predicats predefinis
A. Blondin Masse (UQAM) 28 mars 2018 2 / 23
Table des matieres
1. Modules
2. Predicats predefinis
A. Blondin Masse (UQAM) 28 mars 2018 3 / 23
Mise en contexte
I La modularite en Prolog est relativement simple;
I Il existe des mecanismes d’importation et d’exportationsimilaires a Haskell;
I Comme il n’y a pas de notion de prive/public, on peutobtenir des comportement semblables en restreignantl’exportation.
A. Blondin Masse (UQAM) 28 mars 2018 4 / 23
Declaration d’un module
I On utilise la regle
:- module(NomModule, ListePredicatsExportes).
I Exemple
:- module(tp2, [solve/3]).
I Ce sera l’en-tete de votre module tp2.pl que vousdevelopperez dans le cadre du TP2.
I Le predicat solve(G, P, T) sera satisfait si
I G est une structure representant une partie (game);
I P est une suite valide de deplacements qui resoud lapartie (path);
I T est le temps utilise pour le deplacement (time).
A. Blondin Masse (UQAM) 28 mars 2018 5 / 23
Utilisation d’un module
I Il suffit d’utiliser la regle
:- use_module(NomModule, ListePredicatsImportes).
I Exemple
:- use_module(tp2, [solve/3]).
I C’est ce qui est fait dans les fichiers de tests, qui doiventutiliser l’implementation disponible dans le moduleprincipal.
A. Blondin Masse (UQAM) 28 mars 2018 6 / 23
PlDoc
I Le standard de documentation le plus utilise en Prolog estPlDoc;
I Inspire de Javadoc.
I C’est celui livre avec SWI-Prolog;
I Donc pas besoin d’installation additionnelle;
I La version 2 permet un marquage de type Markdown;
I Vous devrez la suivre pour la remise du TP2 pourdocumenter le module et les predicats.
A. Blondin Masse (UQAM) 28 mars 2018 7 / 23
Exemple
/** <module> Travail pratique 2
Ce module permet de modeliser les deplacements d'unagent intelligent dans un univers fantastique.
@author Alexandre Blondin Masse@license GPL*/
Inclut
I le nom du module;
I une description dans un autre paragraphe;
I l’auteur et
I la license (optionnel, mais recommande).
A. Blondin Masse (UQAM) 28 mars 2018 8 / 23
Documentation d’un predicat (1/2)
%! length(+List:list, -Length:int) is det.%! length(?List:list, -Length:int) is nondet.%! length(?List:list, +Length:int) is det.%% True if List is a list of length Length.%% @compat iso
I Indique les differentes facons d’utiliser le predicat;
I Partiellement ou completement instantie?
I Resultat unique?
I Plusieurs resultats possibles?
A. Blondin Masse (UQAM) 28 mars 2018 9 / 23
Documentation d’un predicat (2/2)
A. Blondin Masse (UQAM) 28 mars 2018 10 / 23
Ajouts de tests unitaires
I Comme Prolog est un langage logique, il estparticulierement facile d’ecrire des tests unitaires;
I Il suffit de declarer une zone de tests:
:- begin_tests(world2).% On met les tests ici:- end(world2).
I Un test est simplement une regle
test("1st solution with MaxT = 10") :-game2(G),solve(G,
[[pos(4, 1), pos(3, 1), pos(3, 2), pos(2, 3), pos(1, 4)],
[pos(1, 7), pos(1, 6), pos(2, 5), pos(3, 4)]],10),
!.
A. Blondin Masse (UQAM) 28 mars 2018 11 / 23
Table des matieres
1. Modules
2. Predicats predefinis
A. Blondin Masse (UQAM) 28 mars 2018 12 / 23
Charger une base de connaissance
I Il s’agit du predicat consult/1;
I Exemple:
?- consult(fichier).?- consult('/chemin/vers/fichier').
I Raccourci avec la notation liste:
?- [fichier1, fichier2, '../fichier3'].
A. Blondin Masse (UQAM) 28 mars 2018 13 / 23
Identification de termes
I Les predicats var/1, nonvar/1; atom/1; number/1; atomic/1;
I Exemples:
?- var(X).yes?- var(8).no?- nonvar(8).yes?- atom(23).no?- number(23).yes?- atomic(23).yes
A. Blondin Masse (UQAM) 28 mars 2018 14 / 23
Afficher des informations (1/2)
I Le predicat listing/1 permet d’afficher des informations surun atome donne;
I Exemple:
?- consult(famille).true.?- listing(has_mother).has_mother(bart, marge).has_mother(lisa, marge).has_mother(maggie, marge).has_mother(marge, jackie).has_mother(homer, mona).has_mother(patty, jackie).has_mother(selma, jackie).has_mother(abraham, yuma).has_mother(yuma, theodora).true.
A. Blondin Masse (UQAM) 28 mars 2018 15 / 23
Afficher des informations (2/2)
I Fonctionne aussi pour afficher des regles:
I Exemple:
$ swipl famille.plWelcome to SWI-Prolog (threaded, 64 bits, version 7.6.4)SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free
software.Please run ?- license. for legal details.
For online help and background, visit http://www.swi-prolog.org
For built-in help, use ?- help(Topic). or ?- apropos(Word).
?- listing(are_siblings).are_siblings(A, B) :-
has_mother(A, C),has_mother(B, C),has_father(A, D),has_father(B, D).
true.
A. Blondin Masse (UQAM) 28 mars 2018 16 / 23
Assertions dynamiques
I Dans certains cas, il est utile d’ajouter de facondynamique des nouveaux faits;
I Deux predicats utiles: asserta/1 et assertz/1;
I Les deux jouent le meme role, mais un ajoute le fait audebut de la base (asserta/1) alors que l’autre l’ajoute a lafin (assertz/1).
I Pour annuler une assertion, on utilise retract/1.
I Attention! Dans un programme, il faut declarer lespredicats comme ”dynamiques” pour utiliser desassertions.
A. Blondin Masse (UQAM) 28 mars 2018 17 / 23
Exemple
?- assert(happy(alice)).true.?- assertz(happy(bob)).true.?- listing(happy).:- dynamic happy/1.happy(alice).happy(bob).true.?- retract(happy(alice)).true.?- listing(happy).:- dynamic happy/1.happy(bob).true.?- retractall(happy(_)).true.?- listing(happy).:- dynamic happy/1.true.
A. Blondin Masse (UQAM) 28 mars 2018 18 / 23
Decomposer des structures
I Dans certains cas, il peut etre utile de deconstruire desstructures pour manipuler leur foncteur et leursarguments;
I Deux predicats utiles: functor/3 et arg/3;
?- functor(happy(alice), F, N).F = happy,N = 1.?- functor(4 + 5, F, N).F = (+),N = 2.?- arg(2, soeurs(alice, diane), X).X = diane.?- arg(1, soeurs(alice, diane), X).X = alice.
A. Blondin Masse (UQAM) 28 mars 2018 19 / 23
Manipulation d’atomes
I Il est possible de convertir des atomes et des nombres enliste de caracteres;
I Deux predicats utiles: atom_chars/2 et number_chars/2;
I Exemples:
?- atom_chars(heureuse, X).X = [h, e, u, r, e, u, s, e].?- number_chars(123.5, X).X = ['1', '2', '3', '.', '5'].
A. Blondin Masse (UQAM) 28 mars 2018 20 / 23
Entrees et sorties
I get_char(X): Recupere un caractere sur stdin;
I read(X): Recupere un terme (suivi d’un point);
I put_char(X): Ecrit un caractere sur stdout;
I nl: Ecrit \n sur stdout;
I write(X): Ecrit un terme sur stdout.
I etc.
A. Blondin Masse (UQAM) 28 mars 2018 21 / 23
Fichiers
I open(X, Y, Z): Ouvre le fichier X, en mode Y (soit read ouwrite) et alors Z est instantie en flux;
I close(X): Ferme le flux X.
I Ensuite, il suffit de rediriger l’entree et/ou la sortie;
I set_input(X): Redirige stdin vers le flux X;
I set_output(X): Redirige stdout vers le flux X.
A. Blondin Masse (UQAM) 28 mars 2018 22 / 23
Debogage
I Pour deboguer un programme Prolog, on peut utiliser deswrite bien placees;
I Sinon, il existe des predicats permettant de le faire defacon dynamique: trace, notrace, spy, debugging, nodebug,nospy, etc.
I Ils seront vu en laboratoire.
A. Blondin Masse (UQAM) 28 mars 2018 23 / 23
top related