IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Prolog Discussion :

poursuivre l'exécution après un false (pg généalogie)


Sujet :

Prolog

  1. #1
    Futur Membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Mai 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mai 2015
    Messages : 12
    Points : 5
    Points
    5
    Par défaut poursuivre l'exécution après un false (pg généalogie)
    Bjr,
    je souhaite obtenir tous les liens de parenté pour une personne , mon prog fonctionne mais s'arrete après le premier false (si une personne n'est pas en couple : false et arrêt).

    comment y remédier ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
     
    man(arthur).
     man(mlr).
     man(benoit).
     man(germain).
     man(antoine).
     woman(simone).
     woman(sylvie).
     woman(melanie).
     woman(camille).
     woman(jeanne).
     woman(lea).
     woman(margot).
     
    human(X):-(man(X);woman(X)).
     
     
     
     
     parent(arthur,mlr).
     parent(simone,mlr).
     parent(arthur,jean).
     parent(simone,jean).
     
     parent(mlr,benoit).
     parent(sylvie,benoit).
     parent(mlr,germain).
     parent(sylvie,germain).
     
     parent(benoit,margot).
     parent(benoit,antoine).
     parent(melanie,margot).
     parent(melanie,antoine).
     
    parent(germain,jeanne).
     parent(germain,lea).
    parent(camille,jeanne).
     parent(camille,lea).
     
    enfant(A,B):-parent(B,A).
    father(F,C):-man(F),parent(F,C).
    mother(M,C):-woman(M),parent(M,C).
     
    couple(F,M):-father(F,C),mother(M,C).
    %couple2(F,M):-man(F),parent(F,C),woman(M),parent(M,C).
     
    belle_mere(M,S):-couple(B,M),mother(S,B).
     
     
     
     son(S,P):-man(S),parent(P,S).
    fils(S):-son(S,_).
     daughter(D,P):-woman(D),parent(P,D).
     siblings(A,B):-parent(P,A),parent(P,B),A\=B.
     
    % siblings have at least one common parent % the test A\=B preserves that siblings are different persons
     
     full_siblings(A,B):- father(F,A),father(F,B),
     mother(M,A),mother(M,B), A\=B.
     
    frere(A,B):- full_siblings(A,B),man(B), A\=B.
    soeur(A,B):- full_siblings(A,B),woman(B).
     
     
     
     
     tante(A,N):-woman(A),full_siblings(A,P),parent(P,N).
     
     tante2(A,N):-siblings(A,P),parent(P,N),woman(A).
     % oncle(A,N):-man(A),siblings(A,P),parent(P,N),A\=P,A\=N.
       oncle(A,N):-man(A),full_siblings(A,P),parent(P,N),A\=P,A\=N.
     
      grand_parent(G,N):-parent(G,X),parent(X,N).
      grand_pere(G,N):-grand_parent(G,N),man(G).
     grand_mere(G,N):-grand_parent(G,N),woman(G).
     
    %_________________
    %
    cous(A,B):-parent(P,A),parent(Q,B),full_siblings(Q,P).
    cousin(A,B):-man(B),parent(P,A),parent(Q,B),full_siblings(Q,P).
    cousine(A,B):-woman(B),parent(P,A),parent(Q,B),full_siblings(Q,P).
    descendent(D,A):-parent(A,D). descendent(D,A):-parent(P,D),descendent(P,A).
     
    ancestor(A,D):-descendent(D,A).
    q1(X) :- father(Papa,X),write(Papa),write(' est le papa de '),write(X),nl.
    q2(X):-	mother(Maman,X),write(Maman),write(' est la maman de '),write(X),nl,nl.
    q3(X):-	grand_pere(Papy,X),write(Papy),write(' est le papy de '),write(X),nl.
     
    q4(X):-	grand_mere(Mamy,X),write(Mamy),write(' est la mamy de '),write(X),nl,nl.
    q5(X):-	couple(Mari,X),write(Mari),write(' est le mari de '),write(X),nl,nl.
    q6(X):-tante(Tante,X),write(Tante),write(' est la tante de '),write(X),nl,nl.
    q7(X):-oncle(Oncle,X),write(Oncle),write(' est l oncle de '),write(X),nl,nl.
    q8(X):-cousin(X,Cousin),write(Cousin),write(' est le cousin de '),write(X),nl,nl.
    q9(X):-cousine(X,Cousine),write(Cousine),write(' est la cousine de '),write(X),nl,nl.
     
     
    q10(X):-couple(Mari,X),write(Mari),write(' est le mari de '),write(X),nl,nl.
     
    q11(x):-belle_mere(M,S),write(S),write(' est la belle mere de '),write(M),nl.
     
    t(X):-q1(X),q2(X),q3(X),q4(X),q5(X),q6(X),q7(X),q8(X),q9(X),q10(X).
    t2(X):-q1(X);q2(X);q3(X);q4(X);q5(X);q6(X);q7(X);q8(X);q9(X);q10(X).
    j'interroge par t(lea) par exemple

    merci d'avance

  2. #2
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Qu'est-ce qui ne va pas exactement ?
    Quelle requête posez-vous et quelle réponse en attendez-vous ?
    Par exemple, la réponse ci-dessous n'est pas bonne ?
    1 ?- t(X).
    arthur est le papa de mlr
    simone est la maman de mlr

    arthur est le papa de jean
    simone est la maman de jean

    mlr est le papa de benoit
    sylvie est la maman de benoit

    arthur est le papy de benoit
    simone est la mamy de benoit

    mlr est le papa de germain
    sylvie est la maman de germain

    arthur est le papy de germain
    simone est la mamy de germain

    benoit est le papa de margot
    melanie est la maman de margot

    mlr est le papy de margot
    sylvie est la mamy de margot

    benoit est le papa de antoine
    melanie est la maman de antoine

    mlr est le papy de antoine
    sylvie est la mamy de antoine

    germain est le papa de jeanne
    camille est la maman de jeanne

    mlr est le papy de jeanne
    sylvie est la mamy de jeanne

    germain est le papa de lea
    camille est la maman de lea

    mlr est le papy de lea
    sylvie est la mamy de lea

    false.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  3. #3
    Futur Membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Mai 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mai 2015
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par Trap D Voir le message
    Qu'est-ce qui ne va pas exactement ?
    Quelle requête posez-vous et quelle réponse en attendez-vous ?
    Par exemple, la réponse ci-dessous n'est pas bonne ?
    je voudrais qu' après la réponse false (question q3),le prog continue d'enchainer les questions q4, q5... sans avoir à les lancer à la main

  4. #4
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Cette requête ne fait pas du tout ce que vous pensez qu'elle fait (enfin je pense, si j'ai bien compris ce que vous voulez obtenir...).
    Je vous invite à réfléchir aux différentes évolutions de la valeur de X par backtrack au cours du programme, à l'aide de la petite modification de code que je vous propose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    t(X):-
    	writeln(q1:X),q1(X),
    	writeln(q2:X),q2(X),
    	writeln(q3:X),q3(X),
    	writeln(q4:X),q4(X),
    	writeln(q5:X),q5(X),
    	writeln(q6:X),q6(X),
    	writeln(q7:X),q7(X),
    	writeln(q8:X),q8(X),
    	writeln(q9:X),q9(X),
    	writeln(q10:X),q10(X).
    Il y a backtrack dès qu'un prédicat échoue, il y a retour au dernier point de choix. Les points de choix existent lorsqu'il y a plusieurs possibilités pour une unification de variables, dans votre code, c'est surtout aux clauses de parent/2 qu'il faut s'intéresser.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  5. #5
    Futur Membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Mai 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mai 2015
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par Trap D Voir le message
    Cette requête ne fait pas du tout ce que vous pensez qu'elle fait (enfin je pense, si j'ai bien compris ce que vous voulez obtenir...).
    Je vous invite à réfléchir aux différentes évolutions de la valeur de X par backtrack au cours du programme, à l'aide de la petite modification de code que je vous propose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    t(X):-
    	writeln(q1:X),q1(X),
    	writeln(q2:X),q2(X),
    	writeln(q3:X),q3(X),
    	writeln(q4:X),q4(X),
    	writeln(q5:X),q5(X),
    	writeln(q6:X),q6(X),
    	writeln(q7:X),q7(X),
    	writeln(q8:X),q8(X),
    	writeln(q9:X),q9(X),
    	writeln(q10:X),q10(X).
    Il y a backtrack dès qu'un prédicat échoue, il y a retour au dernier point de choix. Les points de choix existent lorsqu'il y a plusieurs possibilités pour une unification de variables, dans votre code, c'est surtout aux clauses de parent/2 qu'il faut s'intéresser.
    je n'ai pas compris votre réponse .
    Je voudrais que l'enchainement des q1,q2, ... se poursuivre apres un false .
    Si une personne n a pas de grand parents mais est en couple ;
    je voudrais réponse à q1,
    réponse à q2,
    false
    false,
    réponse à q5
    etc...

  6. #6
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Le problème est aussi (surtout ?) que q6(X) = false !!!
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  7. #7
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Après réflexion, je pense que votre problème sera résolu par l'ajout des clauses qi(_).
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    q1(X) :- father(Papa,X),write(Papa),write(' est le papa de '),write(X),nl.
    q1(_).
    q2(X):-	mother(Maman,X),write(Maman),write(' est la maman de '),write(X),nl,nl.
    q2(_).
    q3(X):-	grand_pere(Papy,X),write(Papy),write(' est le papy de '),write(X),nl.
    q3(_).
    etc, etc
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  8. #8
    Futur Membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Mai 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mai 2015
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par Trap D Voir le message
    Après réflexion, je pense que votre problème sera résolu par l'ajout des clauses qi(_).
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    q1(X) :- father(Papa,X),write(Papa),write(' est le papa de '),write(X),nl.
    q1(_).
    q2(X):-	mother(Maman,X),write(Maman),write(' est la maman de '),write(X),nl,nl.
    q2(_).
    q3(X):-	grand_pere(Papy,X),write(Papy),write(' est le papy de '),write(X),nl.
    q3(_).
    etc, etc

    MERCI
    Ca marche parfaitement avec qi(_) pour toutes les questions,

    mais alors pourquoi ? si vous pouviez m'expliquer un peu .

Discussions similaires

  1. function non exécutée après contrôle de formulaire
    Par lodan dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 11/03/2007, 19h32
  2. Réponses: 6
    Dernier message: 28/08/2006, 17h02
  3. Réponses: 2
    Dernier message: 18/07/2006, 18h53
  4. [Système] Plus rien ne s'exécute après l'include
    Par dj-julio dans le forum Langage
    Réponses: 8
    Dernier message: 18/01/2006, 11h26
  5. Réponses: 2
    Dernier message: 10/05/2005, 16h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo