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 :

Les variables Prolog


Sujet :

Prolog

  1. #1
    Nouveau membre du Club
    Inscrit en
    Août 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 40
    Points : 25
    Points
    25
    Par défaut Les variables Prolog
    Bonjour ,

    J'ai besoin d'exécuter ce prédicat:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    nbre_positif_couvert_H([Hyp|H],Nbre_couvert_H):-
    	nbre_positifs_couverts(Hyp,NbreP),
    	Nbre_couvert_H is Nbre_couvert_H + NbreP,
    	nbre_positif_couvert_H(H,Nbre_couvert_H).
    Mais il me donne l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    uncaught exception: error(instantiation_error,(is)/2)
    Je crois que je dois initialiser ma variable Nbre_couvert_H, mais commen t?

    Merci bien.

  2. #2
    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
    salut,

    En Prolog, une fois que tu as donné une valeur à une variable tu ne peux plus la modifier.
    Donc, le code suivant, qu'on voit beaucoup dans d'autres languages n'est pas possible en Prolog.Dans ton cas, c'est cette ligne qui pose problème:
    Nbre_couvert_H is Nbre_couvert_H + NbreP,
    Une solution possible:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    nbre_positif_couvert_H([Hyp|H],Nbre_couvert_H):-
    	nbre_positifs_couverts(Hyp,NbreP),
    	Nbre_couvert_H2 is Nbre_couvert_H + NbreP,
    	nbre_positif_couvert_H(H,Nbre_couvert_H2).

  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
    Dans une clause Prolog, une variable ne s'unifie qu'avec une seule valeur, donc effectivement Nbre_couvert_H is Nbre_couvert_H + NbreP, pose problème (sauf si NbreP est égal à 0.
    Maintenant, tu n'as peut-être pas donné de valeur à Nbre_couvert_H au premier appel...
    "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 confirmé Avatar de billynirvana
    Homme Profil pro
    Architecte technique
    Inscrit en
    Décembre 2004
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2004
    Messages : 472
    Points : 552
    Points
    552
    Par défaut
    Dans le prolog (le vrai) de Marseille, il existe la but suivant:

    val(x+1, y);

    qui affecte à la variable y la valeur de l'entier x augmenté de 1!


    Billy

  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
    Il existe le prédicat succ(M,N) qui réussit si N est le successeur de M (N = M+1).

    Pour le problème du P.O., en fait c'est uniquement que l'un des deux arguments Nbre_couvert_H ou NbreP n'était pas instancié, car sinon, et bien la clause Nbre_couvert_H is Nbre_couvert_H + NbreP échoue, c'est tout, il n'y a pas d'erreur.
    "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
    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 Trap D
    Pour le problème du P.O., en fait c'est uniquement que l'un des deux arguments Nbre_couvert_H ou NbreP n'était pas instancié, car sinon, et bien la clause Nbre_couvert_H is Nbre_couvert_H + NbreP échoue, c'est tout, il n'y a pas d'erreur.
    Je pense que oui, il y une erreur. Même si les variables Nbre_couvert_H et NbreP seraient toutes les deux instanciées, ce bout de code ne serait pas éxécuté avec succès.

    En remplaçant Nbre_couvert_H par X et NbreP par Y et en simplifiant un peu on arrive à cet exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    debut:-nbre_positif_couvert_H(1,1).
     
    nbre_positif_couvert_H(X,Y):-
            X is X + Y,
            write(X).
    Les variables X et Y sont instanciées mais il y toujours une erreur. Il n'est pas possible de faire.

  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
    On n'est pas d'accord sur le vocabulaire, le prédicat échoue, mais ce n'est pas une erreur au sens
    uncaught exception: error(instantiation_error,(is)/2)
    "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
    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 lu un peu trop vite et j'ai pas vu que tu disais que le prédicat échouait.
    En effet, il peut ne pas avoir d'erreur au niveau de la syntaxe du code mais le prédicat peut échouer.

Discussions similaires

  1. Effacer les variables de session
    Par glsn dans le forum ASP
    Réponses: 2
    Dernier message: 12/12/2003, 13h42
  2. question sur les variables globales et les thread posix
    Par souris_sonic dans le forum POSIX
    Réponses: 5
    Dernier message: 13/06/2003, 13h59
  3. [syntaxe] Gerer les variables dans une requete
    Par rastapopulos dans le forum MS SQL Server
    Réponses: 12
    Dernier message: 15/04/2003, 12h53
  4. [XSLT] les variables???
    Par Lydiane dans le forum XSL/XSLT/XPATH
    Réponses: 11
    Dernier message: 09/08/2002, 16h17
  5. les variables globales static
    Par gRRosminet dans le forum C
    Réponses: 8
    Dernier message: 27/04/2002, 08h34

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