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 :

calcul à trous d'opération


Sujet :

Prolog

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 25
    Points : 24
    Points
    24
    Par défaut calcul à trous d'opération
    Bonjour,

    Comment écrire un code qui permet de trouver l'opération de base à effectuer:
    cas 1) 1 ? 2 = 3 :- ? = addition 1+2=3
    cas 2) 1 ? 2 ? 2= 1 :- ?? = addition et soustraction 1+2-2=1
    ?? = soustraction et addition 1-2+2=1

    sur 4 opérations, la priorité est la division puis le multiplication,
    (pas de parenthèse).

    en faisant simple pour le cas 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    sol(A,B,R,addition):-
    	A+B=:=R,
    	format('la solution est : ~d+~d=~d~n',[A,B,R]).
    sol(A,B,R,soustraction):-
    	A-B=:=R,
    	format('la solution est : ~d-~d=~d~n',[A,B,R]).
    sol(A,B,R,multiplication):-
    	A*B=:=R,
    	format('la solution est : ~d*~d=~d~n',[A,B,R]).
    sol(A,B,R,division):-
    	A/B=:=R,
    	format('la solution est : ~d/~d=~d~n',[A,B,R]).
    pour le cas 2 soit 16 prédicats ....
    mais pour 4 opérations cela 4*4*4*4= 128 prédicat

    Comment faire plus simple :
    - graphe, générer aléatoirement les 4 opérations
    +++

  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
    Tu veux faire un genre de compte est bon ?
    "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
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 25
    Points : 24
    Points
    24
    Par défaut
    Oui, mais le total est toujours bon.
    en reprenant le code pour 2 opérations:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ?- sol(10,2,2,10,Result).
    la solution est : 10+2-2=10
    Result = 'addition et soustraction' ;
    la solution est : 10-2+2=10
    Result = 'soustraction et addition' ;
    la solution est : 10*2/2=10
    Result = 'mutiplication et division' ;
    la solution est : 10/2*2=10
    Result = 'division et multiplication'.
    si pas les bon nombres, alors le resultat est FALSE.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ?- sol(10,4,2,10,Result).
    false.

  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
    Tu peux t'inspirer de ce code qui te donne une idée de ce qu'on peut 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
    17
    18
    19
    20
    21
    22
    23
    24
    sol(L_nombres, Resultat, L_op) :-
    	genere(L_nombres, L_op, Expr),
    	Resultat =:= Expr.
     
     
    genere([A | B], L_op, Expr) :-
    	genere(B, [], L_op, A, Expr).
     
     
    genere([], L_op, L_opf, Expr, Expr) :-
    	reverse(L_op, L_opf).
     
     
    genere([A | T], L_op, L_opf, Exp, Expr) :-
    	genere(T, [+ | L_op], L_opf, Exp + A, Expr).
     
    genere([A | T], L_op, L_opf, Exp, Expr) :-
    	genere(T, [- | L_op], L_opf, Exp - A, Expr).
     
    genere([A | T], L_op, L_opf, Exp, Expr) :-
    	genere(T, [* | L_op], L_opf, Exp * A, Expr).
     
    genere([A | T], L_op, L_opf, Exp, Expr) :-
    	genere(T, [/ | L_op], L_opf, Exp / A, Expr).
    Par exemple :
    1 ?- sol([10,2,2], 10, L_op).
    L_op = [+,-] ;
    L_op = [-,+] ;
    L_op = [*,/] ;
    L_op = [/,*] ;
    false.

    2 ?- sol([10,4,2], 10, L_op).
    false.
    "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
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 25
    Points : 24
    Points
    24
    Par défaut
    Merci TrapD,

    pour ma compréhension:
    genere/3 lance l'analyse de la liste des données
    genere/5 pour chaque élément de la liste on génère une opération(L_op), et une expression (Expr) à évaluer. Lorsque la liste est vide, on inverse la liste des opérations (chaînage arrière)
    puis on teste le résultat demandé à l'expression en retour.
    le "moteur" de PROLOG fait tout, il examine tous les cas du + à /

    une solution élégante et simple, je ne sais pas si dans un autre langage, on pourrait faire si efficacement.

  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
    C'est exactement ça, Prolog a parfois de bon côté grâce au backtrack.
    On déclare ce qu'on veut et, quand c'est bien fait, Prplog se charge du travail.
    "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

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

Discussions similaires

  1. calculer une opération contenue dans un texte
    Par Palo2009 dans le forum Forms
    Réponses: 6
    Dernier message: 17/02/2009, 16h55
  2. temps de calcul - Cout opération
    Par le_voisin dans le forum Langages de programmation
    Réponses: 17
    Dernier message: 24/06/2008, 23h55
  3. Calcul du temps de calcul d'une opération
    Par bejaad dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 25/05/2007, 19h49
  4. Opérations de calcul sur des beans struts
    Par DanZzz dans le forum Struts 1
    Réponses: 2
    Dernier message: 29/08/2006, 10h00

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