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 :

Comment s'assurer qu'un prédicat retourne NO


Sujet :

Prolog

  1. #1
    C_C
    C_C est déconnecté
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 139
    Points : 92
    Points
    92
    Par défaut Comment s'assurer qu'un prédicat retourne NO
    Bonjour,

    Je suis en train de faire un jeu en prolog (le jeu s'apelle Fanorona) et je veux qu'un prédicat retourne NO quand ses clauses ne se vérifient pas.
    Ce qui m'arrive c'est que le programme ne se termine pas.

    Quelqu'un peut m'aider?
    Merci.

  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
    Il faudrait qu'il retourne 'fail' dans ce cas là, il ne le peut pas ?

  3. #3
    C_C
    C_C est déconnecté
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 139
    Points : 92
    Points
    92
    Par défaut
    Je ne peux pas parce-que 'fail' retournerait toujours 'no'.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    mouvement_valide(J, (X,Y)-(Xf,Yf), Etat_actuel):-
            pos_valides(J,Etat_actuel, (X,Y)-(Xf,Yf)),
            verifie_liaison(J, (X,Y)-(Xf,Yf), Etat_actuel),
            chemin_libre((X,Y)-(Xf,Yf),Etat_actuel).
    Ce qui arrive c'est que mon jeu a plusieurs mouvements possibles (c'est un peu comme aux échecs) et le prédicat mouvement_valide doit retourner 'yes' si les 3 autres retournent 'yes' et 'no' si au moins l'un d'entre eux répond 'no'.
    Je pense que il devrait le faire avec ce code.

    voici la fonction qui apelle cette dernière, peut_être que le problème est lá.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Trouve_jouée(J,humain,Mov,Etat_actuel):-
            write('Écrire une jouée'),nl,
            repeat,
                    demande_jouée(X,Y), 
                    demande_jouée(Xf,Yf),    
                    Mov = (X,Y)-(Xf,Yf),
                    mouvement_valide(J, Mov, Etat_actuel).
    Le prédicat 'demande _jouée' c'est juste pour lire le clavier.

  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
    Salut
    je crois que le problème vient du repeat qui boucle toujours.
    Il faudrait utiliser autre chose.
    Peut-être:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Trouve_jouée(J,humain,Mov,Etat_actuel):-
       write('Écrire une jouée'),nl,
       demande_jouée(X,Y),
       demande_jouée(Xf,Yf),   
       Mov = (X,Y)-(Xf,Yf),
       % Si le coup est n'est pas valide, on le recommence
       \+ mouvement_valide(J, Mov, Etat_actuel)->Trouve_jouée(J,humain,Mov,Etat_actuel).
    Ne connaissant pas trop le Prolog, je voudrais savoir si ta notation (X,Y)-(Xf,Yf) pourrait être transformée sans problème en [[X,Y], [Xf,Yf]] soit [PosDepart, PosArrivee] pour un pion ?

  5. #5
    C_C
    C_C est déconnecté
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 139
    Points : 92
    Points
    92
    Par défaut
    Bonjour,

    J'avais pas compris comment fonctionne le 'repeat'. 'repeat' ne termine pas tant que les clauses qui le suivent ne se vérifient pas. Alors, dans mon cas, tant que la jouée n'est pas valable il attend que le joueur mette une jouée valable pour continuer.

    Ta solution est valable mais pour cela il faut que je modifie les fonctions qui lisent le clavier. Ce qu'elle a de bien c'est que chaque fois que la jouée n'est pas valable elle écrit "Introduire une jouée" et avec la solution que j'avais il faut que le joueur "devine" qu'il doit introduire une autre jouée.

    Merci pour ton aide.

    Maintenant ta question. Tu peux facilement faire ce que tu dis. L'avantage de la notation (X,Y)-(Xf,Yf) c'est que tu peut faire réference à la coordonnée que tu veux sans avoir a parcourir une liste.

    Pour passer à la notation [[X,Y], [Xf,Yf]] tu peux simplement faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    test((X,Y)-(Xf,Yf)):-
            append([X], [Y], Depart),
            append([Xf],[Yf], Arrivee),
            append([Depart], [Arrivee], Jouee).
    Pour finir, je ne comprend pas très bien ce que fait '\+' dans ton code. Je sais que c'est une sorte de négation, mais quel type? Pourquoi tu l'utilises?

  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
    Et bien si mouvement_valide(J, Mov, Etat_actuel) renvoie no, \+mouvement(..) renvoie yes, donc la clause qui suit le -> est exécutée, celà simule un tant que.
    Je te renvoie ici
    Si je ne me trompe pas (je n'ai pas Prolog sous la main), on doit pouvoir aussi faire directement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    test((X,Y)-(Xf,Yf)):- 
            append([[X],[Y]], [[Xf],[Yf]], Jouee).
    Ma question était due au fait que j'ai cru un moment que le - était un opérateur que je ne connaissais pas.

  7. #7
    C_C
    C_C est déconnecté
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 139
    Points : 92
    Points
    92
    Par défaut
    Je vois. Le '\+' fait la même chose que un 'not'.

    J'ai essayé ton code et j'ai reçu:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    test((1,2)-(3,4)).
    [[1], [2], [3], [4]]
    Donc on peut le fair e directement mais pour obtenir ce que tu veux il faut faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    test((X,Y)-(Xf,Yf)):-
            append([[X,Y]], [[Xf,Yf]], Jouee),write(Jouee).
    et le résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    test((1,2)-(3,4)).
    [[1, 2], [3, 4]]
    Merci.

  8. #8
    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
    Citation Envoyé par Trap D
    Et bien si mouvement_valide(J, Mov, Etat_actuel) renvoie no, \+mouvement(..) renvoie yes, donc la clause qui suit le -> est exécutée, celà simule un tant que.
    Je te renvoie ici
    Si je ne me trompe pas (je n'ai pas Prolog sous la main), on doit pouvoir aussi faire directement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    test((X,Y)-(Xf,Yf)):- 
            append([[[X],[Y]]], [[[Xf],[Yf]]], Jouee).
    Ma question était due au fait que j'ai cru un moment que le - était un opérateur que je ne connaissais pas.

  9. #9
    C_C
    C_C est déconnecté
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 139
    Points : 92
    Points
    92
    Par défaut
    Et voilá le résultat


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    test((1,2)-(3,4)).
    [[[1], [2]], [[3], [4]]]

  10. #10
    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
    Je me suis un peu embrouillé dans mes posts pour append (je croyais avoir modifié le post)
    Le premier était le bon.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 28/11/2010, 19h01
  2. Comment m'assurer que mon fichier est bien un exec unix
    Par Khaled.Noordin dans le forum Apple
    Réponses: 5
    Dernier message: 05/07/2007, 18h37
  3. Comment s'assurer que "window.open" ouvre une nouvelle fenêtre
    Par lodan dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 14/03/2007, 11h12
  4. Réponses: 5
    Dernier message: 04/02/2007, 01h14
  5. Réponses: 9
    Dernier message: 07/10/2006, 10h54

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