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 :

Terminer programme prolog si un prédicat échoue


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 Terminer programme prolog si un prédicat échoue
    Salut,

    Est-ce que vous connaissez une façon de faire terminer un programme en Prolog si un prédicat échoue?
    En utilisant 'fail', je peux faire échouer un prédicat mais le programme retourne au prédicat antérieur, donc ne termine pas.
    C'est un peu comme le 'exit()' en C ce que je veux.

    Merci.

  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
    Dans la doc swi-prolog, je trouve les prédicats halt/0 et halt/1.

    Par contre, on s'éloigne de l'esprit de Prolog en essayant de coder à la manière du C (même en C, mettre un exit() en plein millieu d'un programme n'est d'ailleurs pas très élégant, d'autant qu'il faut s'assurer de la libération des ressources).
    "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
    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
    C'est vrai que c'est pas très élégant mais, dans ce cas-là, ça me facilite un peu les choses.
    Je suis en train de faire un analyseur de language naturel et je veux pas que le programme continue après avoir trouvé une erreur dans la frase.
    Il peut arriver qu'il y ait deux erreus de types différents dans la même frase (érreur sintactique ou érreur sémantique) et je veux qu'il s'arrête dès la première erreur, sinon après il va en chercher d'autres.

    Merci pour le 'halt'.

  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
    Et un:
    ça ne conviendrait pas?
    "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
    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 vais essayer le même si ça me donne un peu plus de boulot, le code restera plus dans l'esprit Prolog.

  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
    Lis (ou relis) mon article sur la programmation en Prolog, cela pourrait t'aider (ici, c'est le pattern 1 dont il est question) :
    http://pcaboche.developpez.com/artic...mation-prolog/
    "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
    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
    J'ai encore une petite question.
    Si j'ai plusieurs prédicats avec le même nom, comment je peut faira pour que si un échoue tous les autres avec le même nom ne soient pas executés.

    Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    prédicatX(param1,param2):-
    pred1,
    pred2,
    pred3.
     
    prédicatX(param1,param2):-
    pred4,
    pred5,
    pred6
    Dans ce cas-lá si pred1,pred2 ou pred3 échouent je ne veux pas que le deuxième prédicatX soit executé.

    Où est-ce que je doit mettre le '!,fail' dans ce cas-là (si le '!,fail' résout mon problème)

    Merci d'avance.

  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
    Petite leçon de vocabulaire: un prédicat Prolog est composé de clauses, le corps d'une clause est composé de buts.

    Tout cela est expliqué dans mon article de présentation du langage.

    Maintenant, pour le '!,fail', c'est bien cela qu'il faut et c'est expliqué dans mon article sur la programmation Prolog (pattern 1).

    En résumé:

    A titre d'exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    predicatX(Param1, Param2):- % une clause du prédicat predicatX/2
      but1,
      but2,
      but3,
      !, fail.
    "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
    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
    Citation Envoyé par C_C
    Dans ce cas-lá si pred1,pred2 ou pred3 échouent je ne veux pas que le deuxième prédicatX soit executé.
    Ce que je veux c'est que si l'un des buts échoue, le prédicat ne soit plus executé.

    Dans l'exemple suivant cela n'arrive pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    essai:- write(salut),nl,
           1<2,
           3<2,
           4<5,
           !,fail.
     
     
    essai:-
           write('je suis la').
    Et la réponse:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    146 ?- essai.
     salut
    je suis la
     
    Yes

  10. #10
    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
    Ok, je n'avais pas très bien compris.

    Dans ce cas, tu peux faire:
    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
    essai:- 
      write(salut),nl,
     
      (     
        1<2,
        3<2,
        4<5
      ) 
     
      ;
     
      (!, fail).
     
     
    essai:-
      write('je suis la').
    Mais ce n'est pas ce qu'il y a de plus propre.

    En Prolog, on s'attache plus à définir ce qu'est une solution plutôt qu'à décrire les étapes de résolution (comme dans la plupart des langage). Là, on est plus dans la 2ème logique, ce qui n'est pas très beau.
    "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...

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

Discussions similaires

  1. Exécuter plusieurs programmes Prolog automatiquement
    Par alexglvr dans le forum Prolog
    Réponses: 2
    Dernier message: 06/12/2008, 12h49
  2. Appel d'un programme Prolog depuis VBA
    Par egu07 dans le forum Prolog
    Réponses: 1
    Dernier message: 22/11/2008, 22h15
  3. Programme Prolog sous Turbo Prolog
    Par killer_instinct dans le forum Prolog
    Réponses: 3
    Dernier message: 18/12/2006, 12h01
  4. Réponses: 1
    Dernier message: 21/05/2006, 21h50
  5. "Philosophie" de la programmation Prolog
    Par Trap D dans le forum Prolog
    Réponses: 2
    Dernier message: 19/01/2006, 13h01

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