[Prolog] Doublement de résultats...
Répondre à la discussion
Affichage des résultats 1 à 9 sur 9

[Prolog] Doublement de résultats...



  1. #1
    invite1bcc2991

    [Prolog] Doublement de résultats...


    ------

    Bonjour à tous,

    J'ai réalisé mon tout premier programme en Prolog.

    Je m'amuse en Prolog vu que je n'avais touché à la programmation "logique".

    Mais subsiste un problème lors des questions que je pose à mon programme.

    Voilà tout d'abord mon programme, simple comme bonjour:
    Code:
    %Prédicats
    homme(thibaut).
    homme(quentin).
    homme(jeanpierre).
    
    femme(florence).
    femme(brigitte).
    
    parents(jeanpierre, brigitte, thibaut).
    parents(jeanpierre, brigitte, florence).
    parents(jeanpierre, brigitte, quentin).
    
    %Règles
    %%parents
    père(Père, Enfant) :- parents(Père, Mère, Enfant), homme(Père), Père\=Mère, Père\=Enfant, Mère\=Enfant.
    mère(Mère, Enfant) :- parents(Père, Mère, Enfant), femme(Mère), Père\=Mère, Père\=Enfant, Mère\=Enfant.
    parent(Parent, Enfant) :- (parents(Parent, X, Enfant) | parents(X, Parent, Enfant)), Parent\=Enfant, Parent\=X, Enfant\=X.
    
    %%enfants
    fils(Fils, Parent) :- parent(Parent, Fils), homme(Fils), Fils\=Parent.
    fille(Fille, Parent) :- parent(Parent, Fille), femme(Fille), Fille\=Parent.
    enfant(Enfant, Parent) :- parent(Parent, Enfant), Enfant\=Parent.
    
    %%liens entre enfants
    frère(X, Y) :- fils(X, Parent), enfant(Y, Parent), X\=Y, X\=Parent, Y\=Parent.
    soeur(X, Y) :- fille(X, Parent), enfant(Y, Parent), X\=Y, X\=Parent, Y\=Parent.
    frère_ou_soeur(X, Y) :- enfant(X, Parent), enfant(Y, Parent), X\=Y, X\=Parent, Y\=Parent.
    En clair, c'est ma situation familiale, j'ai (Thibaut) une soeur et un frère: Quentin et Florence et mes parents s'appellent Jean-Pierre et Brigitte.

    Les codes:
    père renvoie vrai s'il existe un prédicat de la forme parents(Père, X, Enfant) et que père est un homme, mère renvoie vrai s'il existe un prédicat de la forme parents(X, Mère, Enfant) et que mère est une femme, parent renvoie vrai s'il existe un prédicat de la forme (Parent, X, Enfant) ou (X, Parent, Enfant), on s'en fiche du sexe.
    Les enfants et les liens entre les enfants découle d'eux-mêmes.

    Lors de mes questions, j'ai posé les questions suivantes:
    Code:
    ?- parent(X, thibaut). //Qui sont mes parents?
    X = jeanpierre ;
    X = brigitte.
    
    ?- enfant(X, brigitte). //Qui sont les enfants de Brigitte?
    X = thibaut ;
    X = florence ;
    X = quentin.
    
    ?- fils(X, brigitte). //Qui sont les fils de Brigitte?
    X = thibaut ;
    X = quentin.
    
    ?- fille(X, brigitte). //Qui sont les filles de Brigitte?
    X = florence ;
    false. //ce false, je ne sais pas d'où il vient et il m'embête.
    
    ?- frère(X, florence). //Qui sont les frères de Florence?
    X = thibaut ;
    X = quentin ;
    X = thibaut ;
    X = quentin. //et c'est ici que ça coince... pourquoi, j'ai deux fois Thibaut et Quentin?
    Voilà, je ne connais pas encore toutes les substilités de Prolog, donc, l'erreur est sûrement bête mais je ne sais pas d'où elle sort.

    Merci,

    Aenonis (Thibaut)

    -----

  2. #2
    invitec3c3e59d

    Re : [Prolog] Doublement de résultats...

    Bonsoir,

    Je n'ai jamais manipulé le PROLOG, mais je pense que cela provient du fait que :
    pour trouver les frères d'une personne, tu regardes les enfants d'un des parents de celle-ci. Dans ta situation Thibault et Quentin sont les fils de Jean-Pierre (parent de Florence) mais aussi de Brigitte(parent de Florence).
    Quand le logiciel passe en revu les enfants des parents de Florence (autres que Florence, bien sur), il doit probablement suivre :

    Enfant => Parent(s) => Autres enfants

    Florence => Jean-Pierre => Thibault et Quentin
    => Florence => Thibault et Quentin

  3. #3
    invitec3c3e59d

    Re : [Prolog] Doublement de résultats...

    Citation Envoyé par Ben017 Voir le message
    Bonsoir,
    Enfant => Parent(s) => Autres enfants

    Florence => Jean-Pierre => Thibault et Quentin
    => Florence => Thibault et Quentin
    Désolé, ce n'est pas ce qui precede, mais plutôt ce qui suit :
    Enfant => Parent(s) => Autres enfants

    Florence => Jean-Pierre => Thibault et Quentin
    Florence => Brigitte => Thibault et Quentin
    Désolé pour le double post.

  4. #4
    invite1bcc2991

    Re : [Prolog] Doublement de résultats...

    Ah oui.

    Je n'y avais pas pensé.

    En lisant des tutos sur le web, j'ai découvert aussi le cut "!" qui arrête la recherche, mais si je mets un cut, la première question: "Qui sont mes parents?" ne retournera que "Jean-Pierre" et non "Brigitte".

    Et je pense aussi avoir fait une bourde dans la règle "parent" ou j'utilise un "|" (ou), je ne sais pas comment faire d'autre, comme tu me le dis:
    Florence -> appel à Parent (enfin, Enfant mais qui lui fait appel à Parent) -> appel à la première partie du OU (qui cherche le père) -> Thibaut,Quentin -> back à la deuxième partie du OU (la mère) -> Thibaut,Quentin.

    Si je mets un cut dans l'expression "parent", il s'arrêtera au père et donc Thibaut,Quentin mais lors de la recherche de mes parents, je n'aurai que mon père et non ma mère...

    Je peux essayer d'écrire la règle "enfant" en n'utilisant pas la règle "parent" mais ce n'est que contourner le problème...

    Merci de ton éclairage,

    Aenonis

  5. A voir en vidéo sur Futura
  6. #5
    invite1bcc2991

    Re : [Prolog] Doublement de résultats...

    Re.

    J'essaye d'implémenter la règle qui permet d'avoir toutes les personnes collatérales à une personne.

    Voici mon code:
    Code:
    collateral(X, Y)					:-	frere_soeur(X, Y), (X\==Y).
    collateral(X, Y)					:-	cousin_cousine(X, Z), collateral(Z, Y), (X\==Y, X\==Z, Z\==Y).
    je considère collatéral X et Y si X et Y sont frères et sœurs et vu que j'aimerai tout ceux de la même génération que moi, je "saute" avec la fonction cousin_cousine, qui fait un appel récursif.

    Lorsque que je fais
    Code:
    ?- collateral(X, thibaut).
    , le code me renvoie mes frères et mes sœurs et puis un stack overflow (boucle d'appels infinie).

    Je ne maitrise pas encore les appels récursifs en Prolog, donc si vous pouviez m'aider ^^.

    Merci,

    Aenonis

  7. #6
    invite1bcc2991

    Re : [Prolog] Doublement de résultats...

    PS: je viens de me rendre compte que ce que j'expliquais est simplement la fratrie et les cousins de la personne, pas besoin de récursivité, mais si je veux ajouter aux résultats toute la génération (avec les fonctions (marié(Homme, Femme), séparé(Homme, Femme)), il faudra passer par la récursivité et là, je coince.

  8. #7
    invite1bcc2991

    Re : [Prolog] Doublement de résultats...

    PS2:
    Voici le code nouvellement modifié mais je suis ennuyé parce qu'il ne fonctionne pas et je ne sais pas comment faire mon appel récursif...

    Code:
    %Collateral
    collateral(X, Y)					:-	frere_soeur(X, Y), (X\==Y).
    collateral(X, Y)					:-	cousin_cousine(X, Y), (X\==Y).
    
    %Generation %doit avoir un appel récursif dans le tas 
    generation(X, Y)					:-	collateral(X, Y), (X\==Y).
    generation(X, Y)					:-	(marié(X, Y)|séparé(X, Y)).

  9. #8
    invite1bcc2991

    Re : [Prolog] Doublement de résultats...

    Personne n'a d'idée?

  10. #9
    invite1bcc2991

    Re : [Prolog] Doublement de résultats...

    Personne? C'est fâcheux.

Discussions similaires

  1. Problème de compilation sous GNU Prolog
    Par inviteff53e475 dans le forum Programmation et langages, Algorithmique
    Réponses: 0
    Dernier message: 28/06/2012, 14h52
  2. Prolog
    Par invite73b93f64 dans le forum Programmation et langages, Algorithmique
    Réponses: 4
    Dernier message: 27/01/2012, 19h17
  3. Déduction et validation : Prolog ou ML ?
    Par inviteab8f3a27 dans le forum Epistémologie et Logique (archives)
    Réponses: 0
    Dernier message: 25/08/2010, 05h26
  4. [Biologie Cellulaire] Temps de doublement
    Par val62 dans le forum Biologie
    Réponses: 2
    Dernier message: 15/12/2008, 16h23
  5. Temps de doublement
    Par invite7f97fde9 dans le forum Mathématiques du collège et du lycée
    Réponses: 2
    Dernier message: 29/10/2008, 10h01