23
Chapitre 11 : Modules Prolog Alexandre Blondin Mass´ e epartement d’informatique Universit´ e du Qu´ ebec `a Montr´ eal 28 mars 2018 Paradigmes de programmation INF2160 A. Blondin Mass´ e (UQAM) 28 mars 2018 1 / 23

Chapitre 11 : Modules PrologChapitre 11 : Modules Prolog Alexandre Blondin Mass e D epartement d’informatique Universit e du Qu ebec a Montr eal 28 mars 2018 Paradigmes de programmation

  • Upload
    others

  • View
    7

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Chapitre 11 : Modules PrologChapitre 11 : Modules Prolog Alexandre Blondin Mass e D epartement d’informatique Universit e du Qu ebec a Montr eal 28 mars 2018 Paradigmes de programmation

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

Page 2: Chapitre 11 : Modules PrologChapitre 11 : Modules Prolog Alexandre Blondin Mass e D epartement d’informatique Universit e du Qu ebec a Montr eal 28 mars 2018 Paradigmes de programmation

Table des matieres

1. Modules

2. Predicats predefinis

A. Blondin Masse (UQAM) 28 mars 2018 2 / 23

Page 3: Chapitre 11 : Modules PrologChapitre 11 : Modules Prolog Alexandre Blondin Mass e D epartement d’informatique Universit e du Qu ebec a Montr eal 28 mars 2018 Paradigmes de programmation

Table des matieres

1. Modules

2. Predicats predefinis

A. Blondin Masse (UQAM) 28 mars 2018 3 / 23

Page 4: Chapitre 11 : Modules PrologChapitre 11 : Modules Prolog Alexandre Blondin Mass e D epartement d’informatique Universit e du Qu ebec a Montr eal 28 mars 2018 Paradigmes de programmation

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

Page 5: Chapitre 11 : Modules PrologChapitre 11 : Modules Prolog Alexandre Blondin Mass e D epartement d’informatique Universit e du Qu ebec a Montr eal 28 mars 2018 Paradigmes de programmation

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

Page 6: Chapitre 11 : Modules PrologChapitre 11 : Modules Prolog Alexandre Blondin Mass e D epartement d’informatique Universit e du Qu ebec a Montr eal 28 mars 2018 Paradigmes de programmation

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

Page 7: Chapitre 11 : Modules PrologChapitre 11 : Modules Prolog Alexandre Blondin Mass e D epartement d’informatique Universit e du Qu ebec a Montr eal 28 mars 2018 Paradigmes de programmation

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

Page 8: Chapitre 11 : Modules PrologChapitre 11 : Modules Prolog Alexandre Blondin Mass e D epartement d’informatique Universit e du Qu ebec a Montr eal 28 mars 2018 Paradigmes de programmation

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

Page 9: Chapitre 11 : Modules PrologChapitre 11 : Modules Prolog Alexandre Blondin Mass e D epartement d’informatique Universit e du Qu ebec a Montr eal 28 mars 2018 Paradigmes de programmation

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

Page 10: Chapitre 11 : Modules PrologChapitre 11 : Modules Prolog Alexandre Blondin Mass e D epartement d’informatique Universit e du Qu ebec a Montr eal 28 mars 2018 Paradigmes de programmation

Documentation d’un predicat (2/2)

A. Blondin Masse (UQAM) 28 mars 2018 10 / 23

Page 11: Chapitre 11 : Modules PrologChapitre 11 : Modules Prolog Alexandre Blondin Mass e D epartement d’informatique Universit e du Qu ebec a Montr eal 28 mars 2018 Paradigmes de programmation

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

Page 12: Chapitre 11 : Modules PrologChapitre 11 : Modules Prolog Alexandre Blondin Mass e D epartement d’informatique Universit e du Qu ebec a Montr eal 28 mars 2018 Paradigmes de programmation

Table des matieres

1. Modules

2. Predicats predefinis

A. Blondin Masse (UQAM) 28 mars 2018 12 / 23

Page 13: Chapitre 11 : Modules PrologChapitre 11 : Modules Prolog Alexandre Blondin Mass e D epartement d’informatique Universit e du Qu ebec a Montr eal 28 mars 2018 Paradigmes de programmation

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

Page 14: Chapitre 11 : Modules PrologChapitre 11 : Modules Prolog Alexandre Blondin Mass e D epartement d’informatique Universit e du Qu ebec a Montr eal 28 mars 2018 Paradigmes de programmation

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

Page 15: Chapitre 11 : Modules PrologChapitre 11 : Modules Prolog Alexandre Blondin Mass e D epartement d’informatique Universit e du Qu ebec a Montr eal 28 mars 2018 Paradigmes de programmation

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

Page 16: Chapitre 11 : Modules PrologChapitre 11 : Modules Prolog Alexandre Blondin Mass e D epartement d’informatique Universit e du Qu ebec a Montr eal 28 mars 2018 Paradigmes de programmation

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

Page 17: Chapitre 11 : Modules PrologChapitre 11 : Modules Prolog Alexandre Blondin Mass e D epartement d’informatique Universit e du Qu ebec a Montr eal 28 mars 2018 Paradigmes de programmation

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

Page 18: Chapitre 11 : Modules PrologChapitre 11 : Modules Prolog Alexandre Blondin Mass e D epartement d’informatique Universit e du Qu ebec a Montr eal 28 mars 2018 Paradigmes de programmation

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

Page 19: Chapitre 11 : Modules PrologChapitre 11 : Modules Prolog Alexandre Blondin Mass e D epartement d’informatique Universit e du Qu ebec a Montr eal 28 mars 2018 Paradigmes de programmation

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

Page 20: Chapitre 11 : Modules PrologChapitre 11 : Modules Prolog Alexandre Blondin Mass e D epartement d’informatique Universit e du Qu ebec a Montr eal 28 mars 2018 Paradigmes de programmation

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

Page 21: Chapitre 11 : Modules PrologChapitre 11 : Modules Prolog Alexandre Blondin Mass e D epartement d’informatique Universit e du Qu ebec a Montr eal 28 mars 2018 Paradigmes de programmation

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

Page 22: Chapitre 11 : Modules PrologChapitre 11 : Modules Prolog Alexandre Blondin Mass e D epartement d’informatique Universit e du Qu ebec a Montr eal 28 mars 2018 Paradigmes de programmation

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

Page 23: Chapitre 11 : Modules PrologChapitre 11 : Modules Prolog Alexandre Blondin Mass e D epartement d’informatique Universit e du Qu ebec a Montr eal 28 mars 2018 Paradigmes de programmation

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