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 :

Equivalent d'un if then else


Sujet :

Prolog

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Equivalent d'un if then else
    Bonjour tout le monde,

    J'ai un petit souci pour faire l'équivalent d'un if en prolog. J'ai le prédicat suivant, qui doit permettre de bouger un bloc de coordonnées x, y, z aux coordonnées xn, yn, zn :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    bouger(ID, Xn, Yn, Zn) :- prenable(ID),
    				  carreBas(ID, Lb), carreHaut(ID, Lh), hauteur(ID, H), position(ID, X, Y, Z), plateau(PlatX, PlatY), 
    				  assert(position(ID, Xn, Yn, Zn)), retract(position(ID, X, Y, Z)),
    				  ((estSurLePlateau(ID), neDepassePas(ID), pasIntersection(ID, _)) ;
    				  (estSurUnAutre(ID, _), pasIntersection(ID, _))).
    Je voudrais que si ce prédicat ne réussit pas, alors prolog m'exécute les actions suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    assert(position(ID, X, Y, Z)), retract(position(ID, Xn, Yn, Zn)).
    Je ne vois pas comment faire. J'ai essayé avec un ou exclusif, de redéfinir une règle, mais dès que je met le assert, ça me l'exécute que bouger réussisse ou non.

    Si vous avez une idée pour mon problème ce serait très sympathique de m'aider.

  2. #2
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut Re: [Prolog] comme un if then else
    Pour répondre à ta question, pour faire un:

    if condition then
    action1
    else
    action2
    endif
    on fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ( condition ->
      action1
    ;
      action2
    )
    ... mais c'est pas propre du tout (tout come le ";", qui est l'équivalent d'un "OU": en Prolog, on fait plutôt plusieurs prédicats).

    Une question: c'est pour un projet? Si oui, quelle université?
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  3. #3
    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
    En SWI Prolog le if-then-else existe :.
    Sinon une construction du style ne fonctionne pas ?
    "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

  4. #4
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Citation Envoyé par Trap D
    Sinon une construction du style ne fonctionne pas ?
    Non: dans ce cas, si cond échoue, alors le prédicat échoue.

    Si tu essayes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (cond,instr_vrai) ; instr_faux
    alors si cond réussit mais instr_vrai échoue, alors instr_faux s'exécute, donc ça ne marche pas non plus !
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  5. #5
    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
    En SWI prolog,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    3<2,writeln(1); writeln(2).
    me donne
    1 ?- 3<2,writeln(1); writeln(2).
    2

    Yes
    Tu mets le tout dans une parenthèse, celà devrait fonctionner il me semble. Tu ne disposes pas de -> ?
    "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

  6. #6
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Trap_D, si ça marche dans ton cas, c'est parce que l'instruction write n'a aucune raison d'échouer. Maintenant, si tu fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    | ?- 2<3, write(1), fail ; write(2).
    Ca te retourne:
    Alors qu'on s'attendait à:
    Car:
    - 2<3 s'exécute
    - write(1) s'exécute
    - fail échoue (j'aurais pu mettre 3<2, mais je trouvais que "fail" étais plus explicite)
    - write(2) s'éxécute

    Au passage, je n'ai pas de prédicat writeln pour toutes les implémentations. Il faut définir writeln, il faut écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    writeln(X) :-
      write(X), nl.
    Sinon, oui, on a bien l'opérateur -> (lit mon premier message)
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  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
    pcaboche >> J'ai lu la réponse trop vite, je croyais que c'était solberg555 qui avait répondu.
    Merci pour tes précisions, débutant en Prolog je ne connaiss pas encorec toutes les subtilités.
    D'autre part, tu dis
    Citation Envoyé par pcaboche
    on fait:
    Code:
    ( condition ->
    action1
    ;
    action2
    )


    ... mais c'est pas propre du tout (tout come le ";", qui est l'équivalent d'un "OU": en Prolog, on fait plutôt plusieurs prédicats).
    pourquoi qualifies-tu cette construction de crade. Venant du C, j'utilise le if-then-else "à gogo", que préconise-tu exactmeent, "on fait pluseiurs prédicats", tu peux, si tu as le temps donné un exemple ?
    "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
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Citation Envoyé par Trap D
    pcaboche >> J'ai lu la réponse trop vite, je croyais que c'était solberg555 qui avait répondu.
    Y'a pas de mal, il me semblait bien que tu t'étais trompé de personne.

    Citation Envoyé par Trap D
    Merci pour tes précisions, débutant en Prolog je ne connaiss pas encorec toutes les subtilités.
    Oh la la... Dieu sait qu'elles sont nombreuses ces subtilités ! C'est d'ailleurs ce qui fait de Prolog un langage difficile (chiant?) à apprendre...

    Citation Envoyé par Trap D
    pourquoi qualifies-tu cette construction de crade. Venant du C, j'utilise le if-then-else "à gogo"...
    Ca, c'est typique de la programmation impérative. Tu devrais aller jeter un oeil à ce sujet où l'on discute des diférences entre programmation impérative et programmation fonctionnelle.

    Citation Envoyé par Trap D
    que préconise-tu exactmeent, "on fait pluseiurs prédicats", tu peux, si tu as le temps donné un exemple ?
    Pas de problème (exemple complètement bidon) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    monPredicat(Y) :-
      predicatOu(X),
      Y is 3* X.
     
    predicatOu(1).
    predicatOu(2).
    predicatOu(3).
    Exécution (non testé):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    | ?- monPredicat(N).
     
    N=3 ?
    N=6 ?
    N=9 ?
    Cette manière de faire permet d'explorer plusieurs solutions.

    En Prolog, on évite autant que possible les "if then else", ";" (= OU) et autres instructions typiques de la programmation impérative.

    Ce qui arrive souvent en Prolog :
    - tu veux faire quelque chose
    - tu programmes ce que tu veux faire
    - ça ne fait pas ce que tu veux
    - tu réfléchis pourquoi ça ne marche pas (ex: problème d'unification, priorité des opérateurs comme ";"...)
    - tu comprends pourquoi ça ne fait pas ce que tu veux
    - tu ne sais toujours pas comment faire ce que tu veux...

    A ce sujet, Lundi, j'ai soumis un petit didacticiel en Prolog mais je n'ai toujours pas eu de réponse. C'est vrai que c'est encore assez tôt...
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  9. #9
    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
    J'ai donc du boulot sur la planche, virer tous les if then de mes progs
    "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

  10. #10
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Merci bien, je ne connaissais pas l'opérateur ->. Ca va bien me simplifier la tâche maintenant...

    Une question: c'est pour un projet? Si oui, quelle université?
    Oui, je dois modéliser le robot shrdlu en prolog. Je suis à la fac d'info de Strasbourg, en L3.

    Ce qui arrive souvent en Prolog :
    - tu veux faire quelque chose
    - tu programmes ce que tu veux faire
    - ça ne fait pas ce que tu veux
    - tu réfléchis pourquoi ça ne marche pas (ex: problème d'unification, priorité des opérateurs comme ";"...)
    - tu comprends pourquoi ça ne fait pas ce que tu veux
    - tu ne sais toujours pas comment faire ce que tu veux...
    Voila tu as bien résumé la situation, je passe des heures et des heures depuis le début des vacances sur ce projet et j'ai pas encore écrit 3 pages de code. Est-ce que par hasard il y aurait un logiciel qui permette de déboguer mes programmes ? Ca me simplifierait la vie de temps en temps..

  11. #11
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Je sais pas ce que c'est qu'un robot shrdlu, et je n'étais pas à la fac de Strasbourg (par contre, j'étais bien dans l'Est de la France, mais je ne dirai pas où...). Très jolie ville Strasbourg, et surtout très bonne bière !

    Citation Envoyé par solberg555
    Voila tu as bien résumé la situation, je passe des heures et des heures depuis le début des vacances sur ce projet et j'ai pas encore écrit 3 pages de code. Est-ce que par hasard il y aurait un logiciel qui permette de déboguer mes programmes ? Ca me simplifierait la vie de temps en temps..
    Je sais, je suis (malheureusement) également passé par là !

    Pour débugger un programme, tu as les prédicats trace (active la trace) et notrace (désactive la trace), mais personnellement, je te conseille de mettre des write un peu partout (sinon, tu risques d'user ta touche Entrée avant de voir ce qui cloche)

    Si tu veux, tu me files ton e-mail par mp et je t'envoie mon ébauche de didacticiel Prolog, comme ça j'aurai des retours et je pourrai éventuellement faire des modifs. (Note: cette proposition est valable pour tout le monde !)
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  12. #12
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    mp envoyé !
    En fait Shrdlu c'est l'un des tous premiers logiciels d'intelligence artificielle. Il s'agit d'un monde virtuel composé de blocs, et l'on doit pouvoir bouger les blocs dans le monde en donnant des ordres au robot en "langue naturelle".

  13. #13
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    tuto envoyé...
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  14. #14
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    J'ai un autre problème. Je souhaite savoir tous les blocs qui sont prenables, c'est-à-dire qui ne sont pas en-dessous d'un autre (un bloc est prenable s'il est au-dessus d'une pile de blocs).

    J'ai le prédicat suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    prenable(ID) :- position(ID, _, _, 0);
         		    \+ directSurUnAutre(X, ID).
    Si je fais par exemple ?- prenable(8), ça me renvoie bien yes. Par contre si je fais ?- prenable(X) afin de savoir tous les blocs prenables, ça ne me renvoie rien du tout. Comment arranger cela ?

    Désolé pour toutes ces questions !!

  15. #15
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Le "Not" (\+) ne marche pas du tout comme ça... En fait, tes variables X et ID doivent être unifiées pour que le "Not" ait un sens.

    Par exemple, un prédicat "sexeDifferent(X, Y)" n'est pas la négation du prédicat "memeSexe(X, Y)". Cela n'a de sens que si X et Y sont toutes deux unifiées.

    En fait, il faut réfléchir de la manière suivante: "on peut bouger si on occupe une certaine position, que de cette position on peut se déplacer vers une autre position, et que la position d'arrivée est libre" (j'ai pris l'exemple de bouger parce que je ne connais pas la règle associée à "prenable")

    Une fois le prédicat défini, pour avoir la liste de toutes ses solutions, il faut utiliser la fonction setof (bien pratique !).
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  16. #16
    Membre régulier
    Homme Profil pro
    Nom
    Inscrit en
    Juin 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Nom

    Informations forums :
    Inscription : Juin 2006
    Messages : 90
    Points : 89
    Points
    89
    Par défaut
    Pour écrire par exemple SI x=1 ALORS y = 2 SINON y=3, il y a plusieurs solutions :

    La première solution plutot traditionnelle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cond(X,Y) :- ( X = 1 -> Y = 2 ; Y = 3) .
    Une autre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cond(X,Y) :- if ( X=1, Y=2, Y=3) .
    La différence avec la première est que ce IF autorise le backtracking sur la condition.

    Encore une autre, apparentée au if :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cond(X,Y):- X= 1, Y = 2.
    cond(X,Y) :- \+(X=1), Y = 3.
    Ou encore
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cond(X,Y):- X= 1, !, Y = 2.
    cond(X,Y) :- \+(X=1), Y = 3.
    C'est selon si tu autorises le backtracking ou pas.

Discussions similaires

  1. Equivalent IF THEN ELSE Kettle
    Par guirobe dans le forum kettle/PDI
    Réponses: 1
    Dernier message: 20/05/2008, 15h33
  2. Equivalent "Select Case when then else end" sur Paradoxe
    Par Seuh.m dans le forum Bases de données
    Réponses: 4
    Dernier message: 29/06/2006, 08h23
  3. If Then Else
    Par Piout dans le forum MS SQL Server
    Réponses: 13
    Dernier message: 24/02/2005, 16h09
  4. IF THEN ELSE imbriqués
    Par nuke_y dans le forum Oracle
    Réponses: 2
    Dernier message: 15/11/2004, 14h57
  5. [CR 7] [débutante] pb avec if then else
    Par xs_nady dans le forum Formules
    Réponses: 8
    Dernier message: 28/05/2004, 15h36

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