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 :

Exercice comparaison arithmétique


Sujet :

Prolog

  1. #1
    Membre à l'essai
    Homme Profil pro
    Etudiant
    Inscrit en
    Février 2020
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Février 2020
    Messages : 17
    Points : 14
    Points
    14
    Par défaut Exercice comparaison arithmétique
    Bonjour tout le monde,

    Voici l'énoncé de l'exercice:
    1)Les entiers naturels sont munis d'un ordre naturel, essayez de définir la relation inférieur ou égal
    ainsi que la relation supérieur ou égal sachant que si l'on utilise une notation infixée comme on a
    l'habitude de le faire, cela donnerait les règles suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    X <= Y
    0 <= X :- entier_naturel(X).
    s(X) <= s(Y) :- X <= Y.
    2)Essayez de définir les mêmes règles avec une notation préfixée ≤(0, X).

    Voilà ce que j'ai écrit:
    pour le 1):
    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
    17
    18
    19
    20
    21
    22
    23
    entier_naturel(0).
    entier_naturel(s(X)):- 
        entier_naturel(X).
     
    entier_naturel(X):- 
        0 =< X.
     
    succ(0).
    succ(s(X)):- succ(X).
     
     
    %X inférieur ou egal a Y
    est_inferieur_ou_egal_a(X,Y):- 
        entier_naturel(X),
        entier_naturel(Y),
        X=<Y.
     
     
    %X supérieur ou egal a Y
    est_superieur_ou_egal_a(X,Y):-
        entier_naturel(X),
        entier_naturel(Y),
        X >= Y.
    Le soucis c'est que ça marche lorsque je je mets des nombres mais pas lorsque je teste par exemple: est_inferieur_ou_egal_a(s(s(0)),s(0)), le terminal me renvoit:ERROR: Arithmetic: `s/1' is not a function
    ERROR: In:
    ERROR: [9] s(s(0))=<s(0)
    ERROR: [7] <user>
    ERROR:
    ERROR: Note: some frames are missing due to last-call optimization.
    ERROR: Re-run your program in debug mode (:- debug.) to get more detail.
    Je ne comprends pas comment définir s
    Donc je n'arrives pas à mettre en place la succession.Du coup je ne suis pas convaincu que ce que j'ai écrit est bon et je n'ai d'ailleurs pas utilisé la règle s(X) <= s(Y) :- X <= Y.


    Pour la question 2), j'ai écris :
    /*NOTATION PREFIXEE des règles:
    =<(X,Y).
    =<(0,X).
    =<(s(X),s(Y)):-=<(X,Y).
    */

    Je ne suis là aussi pas convaincu de ma réponse car j'obtiens :
    Syntax error: Operator expected et No permission to modify static procedure `(=<)/2'

    Je suis un peu perdu!
    Merci pour vos réponses !

  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
    Bonjour.
    Première chose, il faut revoir la clause de succ.
    En Prolog un prédicat réussit ou échoue, il 'y a pas de variable renvoyée.
    Donc
    signifie que le successeur de X est s(X), quelque soit ce X.
    Vous avez bien commencé pour entier_naturel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    entier_naturel(0).
    entier_naturel(s(X)):- 
        entier_naturel(X).
    Par contre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    entier_naturel(X):- 
        0 =< X.
    ne sert à rien, et est même à mon avis trompeur.
    La "descente" de s(X) vers X amène sans problème à 0 donc si on n'arrive pas à 0, ce n'est pas un entier naturel !
    A partir de celà il est "facile" de définir est_inferieur_ou_egal_a(X,Y), en utilisant succ/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

  3. #3
    Membre à l'essai
    Homme Profil pro
    Etudiant
    Inscrit en
    Février 2020
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Février 2020
    Messages : 17
    Points : 14
    Points
    14
    Par défaut C'est bon!! il reste la question sur le préfixée..
    Citation Envoyé par Trap D Voir le message
    Bonjour.
    Première chose, il faut revoir la clause de succ.
    En Prolog un prédicat réussit ou échoue, il 'y a pas de variable renvoyée.
    Donc
    signifie que le successeur de X est s(X), quelque soit ce X.

    C'est dans l'énoncé de l'exercice ça...

    Vous avez bien commencé pour entier_naturel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    entier_naturel(0).
    entier_naturel(s(X)):- 
        entier_naturel(X).
    Par contre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    entier_naturel(X):- 
        0 =< X.
    ne sert à rien, et est même à mon avis trompeur.

    Ca aussi c'est dans l'énoncé
    mais je remarques qu'il y a des erreur dans le cours dans la globalité...

    La "descente" de s(X) vers X amène sans problème à 0 donc si on n'arrive pas à 0, ce n'est pas un entier naturel !
    A partir de celà il est "facile" de définir est_inferieur_ou_egal_a(X,Y), en utilisant succ/2.
    Merci tu m'as bien expliqué, du coup j'ai écris:
    est_inferieur_ou_egal_a(X,Y):- succ(X, s(X)) @=< succ(Y, s(Y)). et ça a marché!
    est_superieur_ou_egal_a(X,Y):-succ(X, s(X)) @>= succ(Y, s(Y)).

    Pour la notation préfixée ça te dit quelque chose ou pas?

    /*NOTATION PREFIXEE des règles:
    =<(X,Y).
    =<(0,X).
    =<(s(X),s(Y)):-=<(X,Y).
    */

  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
    Personnellement, je pensais à une définition de est_inferieur_ou_egal_a(X,Y) en utilisant uniquement succ/2 et non pas la comparaison@<= de Prolog.
    "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

  5. #5
    Membre à l'essai
    Homme Profil pro
    Etudiant
    Inscrit en
    Février 2020
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Février 2020
    Messages : 17
    Points : 14
    Points
    14
    Par défaut
    ah bon?
    comment tu ferais? récursivement?

  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
    Un bon départ est de remarquer que est_inferieur_ou_egal_a(X,s(X)). par exemple.
    Et bien sur utiliser la récursivité dans le cas général (attention au sens de la récursivité).
    "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

  7. #7
    Membre à l'essai
    Homme Profil pro
    Etudiant
    Inscrit en
    Février 2020
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Février 2020
    Messages : 17
    Points : 14
    Points
    14
    Par défaut
    Ah oui d'accord, je voulais le faire sans utiliser la récursivité.
    Mais c'est vrai c'est une solution j penses aussi.
    Merci!

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

Discussions similaires

  1. Exercices arithmétiques aléatoires
    Par hodalgatt dans le forum Pascal
    Réponses: 1
    Dernier message: 12/05/2015, 07h27
  2. Exercice tordu sur l'arithmétique des pointeurs
    Par Tamzoro dans le forum Débuter
    Réponses: 5
    Dernier message: 20/04/2015, 16h26
  3. [Toutes versions] Opérateurs arithmétiques et de comparaison
    Par pascal4782 dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 24/08/2011, 13h48
  4. Comparaison entre date et exercice
    Par gentilman_delphi dans le forum Débuter
    Réponses: 5
    Dernier message: 22/03/2008, 14h29
  5. Pouvez vous m'aider a resoudres ces 3 exercices
    Par algorithmique dans le forum Algorithmes et structures de données
    Réponses: 11
    Dernier message: 09/08/2002, 17h26

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