<div class="notebook"> <div class="nb-cell markdown" name="md1"> ## Exercice 1 On considère la base de faits suivante </div> <div class="nb-cell program" data-background="true" name="p1"> fonctionnel(ocaml). fonctionnel(scheme). fonctionnel(rust). imperatif(c). imperatif(rust). objet(java). objet(rust). objet(ocaml). declaratif(prolog). hello(world). </div> <div class="nb-cell markdown" name="md2"> Écrivez une règle qui exprime le fait que tout langage fonctionnel est aussi un langage déclaratif. </div> <div class="nb-cell program" name="p2"> declaratif(X) :- fonctionnel(X). </div> <div class="nb-cell markdown" name="md3"> Écrivez un programme et une requête qui renvoie tous les langages (sans les lister, mais on pourra "lister" les paradigmes). </div> <div class="nb-cell program" name="p3"> langage(X) :- fonctionnel(X). langage(X) :- imperatif(X). langage(X) :- objet(X). </div> <div class="nb-cell query" data-tabled="true" name="q1"> langage(X). </div> <div class="nb-cell markdown" name="md4"> Écrivez un programme et une requête dont les solutions sont tous les langages multi-paradigmes (ayant au moins deux paradigmes parmi les trois possibilités suivantes: "fonctionnel", "impératif", "objet", on omet le paradigme "déclaratif" et la règle de la question 1). </div> <div class="nb-cell program" name="p4"> multi(X) :- fonctionnel(X), imperatif(X). multi(X) :- fonctionnel(X), objet(X). multi(X) :- imperatif(X), objet(X). </div> <div class="nb-cell query" data-tabled="true" name="q2"> multi(X). </div> <div class="nb-cell markdown" name="md5"> Proposez une autre modélisation de cette base de faits à l'aide d'une relation binaire `paradigme/2`, et refaites les questions 1 à 3. </div> <div class="nb-cell program" data-background="true" name="p5"> paradigme(fonctionnel, ocaml). paradigme(fonctionnel, scheme). paradigme(fonctionnel, rust). paradigme(imperatif, c). paradigme(imperatif, rust). paradigme(objet, java). paradigme(objet, rust). paradigme(objet, ocaml). paradigme(declaratif, prolog). </div> <div class="nb-cell program" name="p8"> paradigme(declaratif, X) :- paradigme(fonctionnel, X) </div> <div class="nb-cell program" name="p6"> langage(X) :- paradigme(_, X). </div> <div class="nb-cell query" data-tabled="true" name="q3"> langage(X). </div> <div class="nb-cell program" name="p7"> diff(X,X) :- !, fail. diff(X,Y). multi(X) :- paradigme(L1, X), paradigme(L2, X), diff(L1, L2). </div> <div class="nb-cell query" data-tabled="true" name="q4"> multi(X). </div> <div class="nb-cell markdown" name="md6"> ## Exercice 2 On suppose donnée une base de faits concernant une relation binaire `child_of/2`. </div> <div class="nb-cell program" data-background="true" name="p9"> child_of(pere_alice, alice). child_of(mere_alice, alice). child_of(alice, fils1_alice_bob). child_of(alice, fils2_alice_bob). child_of(bob, fils1_alice_bob). child_of(bob, fils2_alice_bob). child_of(alice, fils_premier_mariage). child_of(bob, autre_fils_premier_mariage). child_of(pere_alice, soeur_alice). child_of(mere_alice, soeur_alice). child_of(pere_alice, frere_alice). child_of(mere_alice, frere_alice). child_of(grand_pere_maternel_alice, mere_alice). child_of(grand_pere_paternel_alice, pere_alice). child_of(arriere_grand_pere_paternel_alice, grand_pere_paternel_alice). </div> <div class="nb-cell markdown" name="md11"> Écrivez une requête qui renvoie les deux parents de `alice`. </div> <div class="nb-cell query" data-tabled="true" name="q5"> child_of(X, alice) </div> <div class="nb-cell markdown" name="md7"> Écrivez une requête qui renvoie les enfants que `alice` a eu avec `bob`. </div> <div class="nb-cell query" data-tabled="true" name="q6"> child_of(alice, X), child_of(bob, X) </div> <div class="nb-cell markdown" name="md8"> Écrivez une requête qui renvoie les frères et soeurs d'`alice` (pas de demi-frère ni demi-soeur) </div> <div class="nb-cell program" name="p10"> diff(X, X) :- !, fail. diff(X, Y). frere_alice(X) :- child_of(Pere, X), child_of(Mere, X), child_of(Pere, alice), child_of(Mere, alice), diff(Pere, Mere), diff(X, alice). </div> <div class="nb-cell query" data-tabled="true" name="q7"> frere_alice(X). </div> <div class="nb-cell markdown" name="md9"> Écrivez une requête qui renvoie les ancêtres d'`alice`. </div> <div class="nb-cell program" data-background="true" name="p11"> ancestor(X,Y) :- child_of(X, Y). ancestor(X,Y) :- child_of(P, Y), ancestor(X, P). </div> <div class="nb-cell query" data-tabled="true" name="q8"> ancestor(X, alice). </div> <div class="nb-cell markdown" name="md10"> Note: une autre solution possible est ``` ancestor(X,Y) :- child_of(X, F), ancestor(F, Y). ``` mais dans ce cas on essaie pour chaque individu de voir si on peut atteindre `alice`... cela prend beaucoup plus de temps que de partir de `alice` et de remonter. Autres idées, mais qui ne marche pas du tout ce coup-ci: ``` ancestor(X,Y) :- ancestor(X, F), child_of(F, Y). ``` ou encore ``` ancestor(X,Y) :- ancestor(X, F), ancestor(F, Y). ``` Dans les deux cas précédents,on part dans une branche infinie. </div> </div>