Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
cnam:utc503:declarative:prolog [2023/11/26 17:51] – [Règles] jcheron | cnam:utc503:declarative:prolog [2023/12/07 01:30] (Version actuelle) – [Listes] jcheron | ||
---|---|---|---|
Ligne 116: | Ligne 116: | ||
</ | </ | ||
+ | Soient les règles suivantes : | ||
+ | |||
+ | * « Anne aime tous les rois ». | ||
+ | * « Arthur aime ceux qui l’aiment ». | ||
+ | * « Jean aime toutes les femmes ». | ||
+ | * « Paul aime les gens qui aiment la biere et Londres ». | ||
+ | * « Il faut taxer les riches ». | ||
+ | * « Marie aime toutes les villes ». | ||
+ | |||
+ | Elles s' | ||
+ | <sxh prolog> | ||
+ | aime(anne, UnRoi) :- roi(UnRoi, Pays). | ||
+ | aime(arthur, | ||
+ | aime(jean, X) :- femme(X). | ||
+ | aime(paul, X) :- aime(X, biere), aime(X, londres). | ||
+ | taxer(UnePersonne) :- riche(UnePersonne). | ||
+ | aime(marie, UneVille) :- ville(UneVille). | ||
+ | </ | ||
+ | |||
+ | ==== Exercices ==== | ||
+ | |||
+ | Soit la base de connaissances : | ||
+ | <sxh prolog> | ||
+ | masculin(hubert). | ||
+ | masculin(denis). | ||
+ | masculin(robert). | ||
+ | masculin(joseph). | ||
+ | masculin(georges). | ||
+ | masculin(henri). | ||
+ | feminin(nelly). | ||
+ | feminin(martine). | ||
+ | feminin(anne). | ||
+ | feminin(jeanne). | ||
+ | % parent(X,Y) est vrai si Y est le pere/mere de X | ||
+ | parent(robert, | ||
+ | parent(robert, | ||
+ | parent(robert, | ||
+ | parent(joseph, | ||
+ | parent(hubert, | ||
+ | parent(hubert, | ||
+ | parent(nelly, | ||
+ | parent(nelly, | ||
+ | parent(georges, | ||
+ | parent(georges, | ||
+ | </ | ||
+ | <WRAP TODO> | ||
+ | Définissez une règle pere(Pere, Enfant) qui est vrai si Pere est le père de Enfant. | ||
+ | |||
+ | Faites de même avec la relation mere(Mere, Enfant). | ||
+ | |||
+ | Définissez une règle fils(Fils, Parent) qui est vrai si Fils est le fils du parent Parent. Faites de même avec la relation fille(Fille, | ||
+ | |||
+ | Définissez les règles | ||
+ | * frere(Frere, | ||
+ | * oncle(Oncle, | ||
+ | * neveu(Neveu, | ||
+ | * grand-pere(GP, | ||
+ | </ | ||
+ | ==== Exercice ==== | ||
+ | |||
+ | On considère les affirmations suivantes (dues à Lewis Carroll, dans La logique symbolique) : | ||
+ | - Tous les canards vivant dans ce village qui sont marqués d’un B appartiennent à Mrs. Bond. | ||
+ | - Les canards vivant dans ce village ne portent pas de col en dentelle, à moins qu’ils n’appartiennent à Mrs. Bond. | ||
+ | - Mrs. Bond ne possède aucun canard gris vivant dans ce village. | ||
+ | <WRAP TODO> | ||
+ | </ | ||
+ | <WRAP TODO> | ||
+ | À présent, on considère George, un canard de ce village marqué AB et qui porte un col de dentelles et Augusta, une cane de ce village marquée B. Ajoutez les faits correspondant à votre fichier. | ||
+ | </ | ||
+ | <WRAP TODO> | ||
+ | On se demande quels sont les canards de la base qui ne sont pas gris. Utilisez l’interprète Prolog pour répondre à cette question. | ||
+ | </ | ||
+ | |||
+ | ==== Récursivité ==== | ||
+ | === Liste des nombres de N à 1 === | ||
+ | <sxh prolog> | ||
+ | /* de N à 1 */ | ||
+ | decroissant(0). | ||
+ | decroissant(N) :- N>0, write(N), nl, N1 is N-1, decroissant(N1). | ||
+ | </ | ||
+ | === Liste des nombres de 1 à N === | ||
+ | <sxh prolog> | ||
+ | /* de 1 à N */ | ||
+ | croissant(0). | ||
+ | croissant(N) :- N>0, N1 is N-1, croissant(N1), | ||
+ | </ | ||
+ | |||
+ | === Nombres pairs === | ||
+ | |||
+ | <sxh prolog> | ||
+ | pair(0). | ||
+ | pair(X) :- X>0, X2 is X-2, pair(X2). | ||
+ | </ | ||
+ | |||
+ | === Somme des N premiers entiers === | ||
+ | |||
+ | <sxh prolog> | ||
+ | som(0,0). | ||
+ | som(N,X) :- N>0, N1 is N-1, som(N1,X1), X is N+X1. | ||
+ | </ | ||
+ | |||
+ | === Factorielle === | ||
+ | <sxh prolog> | ||
+ | fact(0,1). | ||
+ | fact(N,X) :- N>0, N1 is N-1, fact(N1, | ||
+ | </ | ||
+ | |||
+ | === Suite de Fibonacci === | ||
+ | <sxh prolog> | ||
+ | fibo(1,1). | ||
+ | fibo(2,1). | ||
+ | fibo(N,X) :- N>2, U is N-1, V is N-2, fibo(U,U1), fibo(V,V1), | ||
+ | X is U1+V1. | ||
+ | </ | ||
+ | |||
+ | ==== Listes ==== | ||
+ | <WRAP info> | ||
+ | En Prolog, Les tableaux sont des listes, dans lesquelles les indices des éléments ne sont pas disponibles. | ||
+ | |||
+ | En revanche, une liste L peut toujours être décomposée en L=[E|R] où E est le premier élément de la liste (E n'est pas une liste) et où R est le reste de la liste L (R est une liste : c'est en fait la tranche de L qui démarre apres E). | ||
+ | |||
+ | La liste vide est []. | ||
+ | </ | ||
+ | |||
+ | === Affichage === | ||
+ | |||
+ | <sxh prolog> | ||
+ | affiche([]). | ||
+ | affiche([X|R]) :- write(X), nl, affiche(R). | ||
+ | </ | ||
+ | |||
+ | === Premier élément === | ||
+ | |||
+ | <sxh prolog> | ||
+ | premier([X|_], | ||
+ | </ | ||
+ | |||
+ | === Dernier élément === | ||
+ | |||
+ | <sxh prolog> | ||
+ | dernier([X], | ||
+ | dernier([_|L], | ||
+ | </ | ||
+ | |||
+ | === Compte === | ||
+ | |||
+ | <sxh prolog> | ||
+ | compte([], | ||
+ | compte([_|R], | ||
+ | </ | ||
+ | |||
+ | === Somme === | ||
+ | |||
+ | <sxh prolog> | ||
+ | somme([], | ||
+ | somme([X|R], | ||
+ | </ | ||
+ | ==== Sudoku ==== | ||
+ | |||
+ | === Base de connaissances : === | ||
+ | |||
+ | <sxh prolog; | ||
+ | sudoku(Rows) :- | ||
+ | length(Rows, | ||
+ | append(Rows, | ||
+ | maplist(all_distinct, | ||
+ | transpose(Rows, | ||
+ | maplist(all_distinct, | ||
+ | Rows = [As, | ||
+ | blocks(As, Bs, Cs), | ||
+ | blocks(Ds, Es, Fs), | ||
+ | blocks(Gs, Hs, Is). | ||
+ | blocks([], [], []). | ||
+ | blocks([N1, | ||
+ | all_distinct([N1, | ||
+ | blocks(Ns1, Ns2, Ns3). | ||
+ | problem(1, [[_, | ||
+ | [_, | ||
+ | [_, | ||
+ | [1, | ||
+ | [5, | ||
+ | [_, | ||
+ | [_, | ||
+ | [_, | ||
+ | [_, | ||
+ | |||
+ | </ | ||
+ | |||
+ | === Résolution === | ||
+ | |||
+ | <sxh prolog; | ||
+ | use_module(library(clpfd)). | ||
+ | [sudoku]. | ||
+ | problem(1, Rows), sudoku(Rows), | ||
+ | </ |