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 :

prédicat somme plus court


Sujet :

Prolog

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 53
    Points : 28
    Points
    28
    Par défaut prédicat somme plus court
    Bonjour et merci pour la lecture et l'aide que vous pourrez m'apporter
    alors voilà mon petit problème, je souhaite faire la vérification d'une somme, le prédicat devra être écrit de cette façon par exemple :
    somme([20,[15,+,5]]).
    et devra retourner true si 15 + 5 égale bien 20.
    je dois vérifier l'opérateur.
    j'ai déjà écrit cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    somme([X,[A1,OP,A2]]) :- name(OP,S), S == "+", Y is A1 + A2, Y == X.
    mais il faut avouer que niveau performance/vitesse et écriture (lourde) ne sont pas au rendez vous =/.
    Donc ma question est : est-il possible de faire la même chose mais d'une manière plus rapide ?

    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
    Si on est sur que c'est une addition, on peut effectivement faire plus vite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    somme([X,[A1,+,A2]]) :-
    	X is A1 + A2.
    Attention X est unifié avec A1 + A2 dans mon code, ce qui n'est pas le cas dans ton code.
    "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
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 53
    Points : 28
    Points
    28
    Par défaut
    ha ok merci.
    Mais le truc c'est que tout dépend du signe de l'opération =/
    m'enfin dans tous les cas, je dois définir les 4 opérateurs ^_^.

    j'ai une autre question : bon voilà j'ai une fonction qui me permet de checker
    check([2,[2],3,[3],5,[3+2]).
    cela me permet de savoir si 5 égale à 3+2

    je voudrais créer un prédicat qui me permette de calculer la somme d'une liste en utilisant le prédicat check
    comment faire ?
    MonTotal([2,3,5],[R,Operation])
    R étant le résultat et Operation l'affichage de l'opération .

    Merci d'avance pour ton aide

  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
    Pour plusieurs opérations, on peut faire comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    operation([X,[A1,+,A2]]) :-
    	X is A1 + A2. 
     
    operation([X,[A1,*,A2]]) :-
    	X is A1 * A2.
    Pour le reste, ce n'est pas très clair. Pourquoi autant d'arguments pour check([2,[2],3,[3],5,[3+2]) ?
    Ce qu'on peut faire c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    % on amorce le calcul
    total([H| T], Res) :-
    	total(T, [H, [H]], Res).
     
    % quand la liste de nombre est terminér
    % on unifie le resultat courant avec le resultat final
    total([], [R, Op], [R, Op]).
     
    % sinon on appelle le prédicat check
    total([H | T], [R, L], Final) :-
    	check(H, R, TT, [H, Op, R]),
                ....
    Je n'ai pas utilisé dans check les arguments dont je ne comprenais pas l'utilité
    "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
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 53
    Points : 28
    Points
    28
    Par défaut
    ok merci désolé pour le manque d'informations concernant check()
    en fait on peut la voir comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    check([5,[2,+,3]],[6,[3,+,3]],[11,[5,+,6]]).
    où le premier terme de chaque listes (5,6 et 11) sont la somme de la deuxième liste.
    5 et 6 sont l'addition des résultats des 2 premiers termes de chaque sous listes.

    ainsi si j'appelle MonTotal([2,3,9],[R,O]),
    il devra appeler
    check([2,[2]],[3,[3]],[5,[2,+,3]]).
    puis check([5,[2,+,3]],[9,[9]],[11,[5,+,9]]). %[5,[2,+,3]] étant le résultat de l'appel précédent.

    le problème vient du fait comme tu peux le voir, c'est que si je définit mon prédicat en récupérant les 2 premiers à chaque fois, j'aurai une erreur quand il va récupérer les 2 suivants si c'est impair =/ donc je pense qu'il faut récupérer chaque éléments de la liste de nombres un par un.

Discussions similaires

  1. Calcul de plus court chemin dans un graphe
    Par Elmilouse dans le forum Prolog
    Réponses: 6
    Dernier message: 21/03/2010, 20h26
  2. [algo] plus courts chemins (au pluriel !!)
    Par ADSL[fx] dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 18/01/2006, 14h40
  3. néophyte, faire une requête plus courte
    Par LE NEINDRE dans le forum Requêtes
    Réponses: 8
    Dernier message: 10/10/2005, 09h44
  4. algorithme de Ford (recherche chemin le plus court)
    Par abstraite dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 19/05/2005, 10h39
  5. Réponses: 2
    Dernier message: 21/03/2004, 18h57

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