Solutio
Michel Gagnon
Chapitre 1
1.1 Solution: Tester dans SWI-Prolog. 1.2 Solution: engendre(X,Y):pere(Y,X). engendre(X,Y):mere(Y,X). grand_parent(X,Y):engendre(P,X), engendre(Y,P). parents(X,M,P):mere(X,M), pere(X,P). frere_ou_soeur(X,Y):parents(X,M,P), parents(Y,M,P), X \= Y. cousin(X,Y):engendre(U,X), engendre(V,Y), freres_ou_soeurs(U,V). 1
Chapitre 2
2.1 Solution: Tester dans SWI-Prolog. 2.2 Solution: Parce que ce prédicat signifie que tout le monde aime tout le monde. Chaque occurrence d’une variable anonyme est indépendante des autres.
Chapitre 3
3.1 Solution: sexe(maria,fem). sexe(claudia,fem). sexe(joao,masc). sexe(paulo,masc). sexe(antonio,masc). personne(maria,fem). personne(claudia,fem). personne(joao,masc). personne(paulo,masc). personne(antonio,masc). % Joao aime Maria % Paulo aime Antonio % Antonio aime Claudia % Fernandon aime Claudia aime(joao,maria). aime(paulo,antonio). aime(antonio,claudia). aime(fernando,claudia). % Claudia aime tous ceux qui l’aiment aime(claudia,X) :personne(X), 2
X \= claudia, aime(X,claudia). % Personne n’aime Paulo % Rien à écrire, à cause de la négation par échec % Deux personnes de sexes différents qui s’aiment mutuellement % sont aussi des amants. amants(X,Y):sexe(X,SexeX), sexe(Y,SexeY), SexeX \= SexeY, aime(X,Y), aime(Y,X). Remarque: On pourrait toujours ajouter le fait non_aime(_,paulo), mais ce n’est pas nécessaire, et en plus on perdrait le lien avec le prédicat verb+aime+, ou nous obligerait à ajouter la règle suivante: aime(X,Y):\+ non_aime(X,Y). Remarque: Pour la règle implémentant le fait que Claudia aime tout ceux qui l’aiment, on a ajouté le prédicat personne(X) pour forcer l’instanciation de X, ce qui élimine une possibilité de boucle infinie: aime(claudia,X) :personne(X), X \= claudia, aime(X,claudia). Il faudra évidement que le prédicat personne(X) soit défini pour toutes les personnes. Une autre solution consiste à utiliser les prédicats pré-définis var et nonvar: