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 :

[Débutant] More ?


Sujet :

Prolog

  1. #1
    Membre régulier
    Inscrit en
    Avril 2005
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 156
    Points : 76
    Points
    76
    Par défaut [Débutant] More ?
    Bonjour,

    Je viens de me mettre à la programmation logique via SWI-Prolog, cela fait plusieurs fois que j'ai ce message sans comprendre ce qu'il siginifie...

    Par exemple, je définis un prédicat réussissant si un élément est dans une liste :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    estdans(Elem, [Elem|_]).
    estdans(Elem, [_|Reste]) :- estdans(Elem, Reste).
    Dans l'interpréteur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ?- estdans(4, [1,2,3]).
    No
    ?- estdans(4, [1,2,3,4]).
    More ?
    Que signifie donc ce "More ?" ? Pourquoi l'interpréteur ne répond-il pas Yes ? Merci par avance !

  2. #2
    Membre régulier Avatar de yoshï
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 206
    Points : 88
    Points
    88
    Par défaut
    Bonjour,
    je n'ai pas bcp d'expérience en prolog...
    Mais j'ai testé ton prédicat avec ma version de prolog (SWI-prolog 5.6.22)
    et ça fonctionne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    4 ?- estdans(4, [1,2,3,4]).
     
    Yes
    Néanmoins tu devrais essayer de rajouter une coupure (c'est plus propre à mon avis).
    Testes avec ce code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    estdans(Elem, [Elem|_]):- ! .
    estdans(Elem, [_|Reste]) :- estdans(Elem, Reste).
    Bon courage ^^

  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
    Tu as quelle version de SWi-Prolog ?

    Avec la mienne, 5.6.27 je n'ai pas ce problème.
    "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
    Membre régulier
    Inscrit en
    Avril 2005
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 156
    Points : 76
    Points
    76
    Par défaut
    J'utilise la version 5.6.48...

    La coupure permet effectivement d'éviter d'avoir ce comportement.

    Merci pour votre aide !

  5. #5
    Membre expert

    Profil pro
    imposteur
    Inscrit en
    Avril 2003
    Messages
    3 308
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : imposteur

    Informations forums :
    Inscription : Avril 2003
    Messages : 3 308
    Points : 3 377
    Points
    3 377
    Par défaut
    Je me permets de te suggérer une petite amélioration dans ton code pour éviter les réponses multiples sans utiliser la coupure (qui reste un fonctionnement "non logique") :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    estdans(Elem, [Elem|_]).
    estdans(Elem, [Premier|Reste]) :- 
      Premier \= Elem,
      estdans(Elem, Reste).
    Ca devrait également résoudre ton problème (ce que je ne peux pas vérifier, ma version de SWI ne le reproduit pas).
    L'idée, c'est que quand tu écris plusieurs règles pour le même prédicat, il faut (en général) qu'elles décrivent des situations distinctes deux à deux pour éviter les réponses multiples. Dans ton code, une liste dont le premier élément peut être unifié avec l'élément à rechercher permettrait d'activer les deux règles, ce qui n'est pas souhaitable.

  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
    Je viens de voir la solution au problème du "more" dans la liste SWI-Prolog.

    Avec les nouvelles versions, il faut positionner un flag :
    dans le pl.ini obtenu par le menu /settings/user ini, il faut rajouter la directive:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    :- set_prolog_flag(prompt_alternatives_on, groundness).
    Voici l'extrait du message
    Citation Envoyé par Norbert E. Fuchs et kantze
    > Have a look at Prolog flags
    >
    >> The predicates current_prolog_flag/2 and set_prolog_flag/2 allow
    >> the user to examine and modify the execution environment. It
    >> provides access to whether optional features are available on this
    >> version, operating system, foreign-code environment, command-line
    >> arguments, version, as well as runtime flags to control the runtime
    >> behaviour of certain predicates to achieve compatibility with other
    >> Prolog environments.
    >>
    >
    > specifically
    >
    >> prompt_alternatives_on(atom, changeable)
    >> Determines prompting for alternatives in the Prolog toplevel.
    >> Default is determinism, which implies the system prompts for
    >> alternatives if the goal succeeded while leaving choicepoints. Many
    >> classical Prolog systems behave as groundness: they prompt for
    >> alternatives if and only if the query contains variables.
    >
    > Using the default "determinism" results in
    >
    > ?- test(a).
    > More?
    >
    > while using "groundness" results in
    >
    > ?- test(a).
    > Yes
    >
    >
    > Regards.
    "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

Discussions similaires

  1. [débutant] Erreur de procédure "Subquery returned more than 1 value"
    Par jeanmarc1234 dans le forum Développement
    Réponses: 4
    Dernier message: 11/12/2008, 23h09
  2. [Kylix] Re Re: débutant sur Kylix et Linux.....
    Par Eclypse dans le forum EDI
    Réponses: 2
    Dernier message: 08/06/2002, 22h53
  3. [Kylix] Le débutant en Kylix et Linux....
    Par Eclypse dans le forum EDI
    Réponses: 2
    Dernier message: 08/05/2002, 10h37
  4. Réponses: 3
    Dernier message: 07/05/2002, 16h06
  5. [HyperFile] 2 questions de débutant
    Par khan dans le forum HyperFileSQL
    Réponses: 2
    Dernier message: 29/04/2002, 23h18

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