Précédent   Forum du club des développeurs et IT Pro > Autres langages > Autres langages > Prolog
Prolog Forum d'entraide sur la programmation en langage Prolog. Avant de poster : Cours Prolog
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 24/08/2012, 10h17   #1
sukoi
Futur Membre du Club
 
Inscription : juillet 2010
Messages : 16
Détails du profil
Informations forums :
Inscription : juillet 2010
Messages : 16
Points : 16
Points : 16
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 :
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
+++
sukoi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2012, 11h17   #2
Trap D
Rédacteur/Modérateur
 
Avatar de Trap D
 
Inscription : septembre 2003
Messages : 4 443
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 4 443
Points : 5 310
Points : 5 310
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 : Intérieur avec jeune femme de Vilhelm Hammershoi
Trap D est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2012, 12h45   #3
sukoi
Futur Membre du Club
 
Inscription : juillet 2010
Messages : 16
Détails du profil
Informations forums :
Inscription : juillet 2010
Messages : 16
Points : 16
Points : 16
Oui, mais le total est toujours bon.
en reprenant le code pour 2 opérations:
Code :
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 :
1
2
3
?- sol(10,4,2,10,Result).
false.
sukoi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2012, 14h23   #4
Trap D
Rédacteur/Modérateur
 
Avatar de Trap D
 
Inscription : septembre 2003
Messages : 4 443
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 4 443
Points : 5 310
Points : 5 310
Tu peux t'inspirer de ce code qui te donne une idée de ce qu'on peut faire :
Code :
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 :
Citation:
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 : Intérieur avec jeune femme de Vilhelm Hammershoi
Trap D est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 24/08/2012, 18h17   #5
sukoi
Futur Membre du Club
 
Inscription : juillet 2010
Messages : 16
Détails du profil
Informations forums :
Inscription : juillet 2010
Messages : 16
Points : 16
Points : 16
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.
sukoi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2012, 18h33   #6
Trap D
Rédacteur/Modérateur
 
Avatar de Trap D
 
Inscription : septembre 2003
Messages : 4 443
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 4 443
Points : 5 310
Points : 5 310
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 : Intérieur avec jeune femme de Vilhelm Hammershoi
Trap D est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 06h22.


 
 
 
 
Partenaires

Hébergement Web