Bonjour,
Faire un calcul en utilisant le CHR du SWI-PROLOG.
En entrée j'ai une liste de données du genre :
a(1),bb(2),aaa(3),b(10), .....,a(20).
dans mon exemple j'ai 2 familles de 3 catégories de données que je souhaite totaliser et comparer
a(X),aa(X),aaa(X) et b(X),bb(X),bbb(X).
en sortie : ct(A) pour compter les a et ct(B) pour compter les B
enfin je compare ct(A) et ct(B)
le programme :
l'exécution donne :
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 :- use_module(library(chr)). :- chr_constraint a/1, aa/1, aaa/1, b/1, bb/1, bbb/1, cta/1, ctb/1, fin/0. %compare total A et total B cta(A),ctb(B),fin<=> A > B|cta(A),fin. cta(A),ctb(B),fin<=> A =< B|ctb(B),fin. %l'affichage cta(A),fin<=>cta(A). ctb(B),fin<=>ctb(B). % compte les A a(X)<=>cta(X). aa(X)<=>cta(X). aaa(X)<=>cta(X). cta(X),cta(Y)<=> Z is X+Y, cta(Z). %compte les B b(X)<=>ctb(X). bb(X)<=>ctb(X). bbb(X)<=>ctb(X). ctb(X),ctb(Y)<=> Z is X+Y, ctb(Z).
[1] 50 ?- a(1),aa(2),a(3),aaa(4),bb(1),b(2),a(5),b(30),aaa(6),a(7),fin.
ctb(33)
true ;
false.
[1] 51 ?- a(1),aa(2),a(3),aaa(4),bb(1),b(2),a(5),b(3),aaa(6),a(7),fin.
cta(28)
true ;
false.
Si j'enlève "fin" dans la requête, j'obtiens :
[1] 52 ?- a(1),aa(2),a(3),aaa(4),bb(1),b(2),a(5),b(30),aaa(6),a(7).
cta(28)
ctb(33)
true ;
false.
[1] 53 ?- a(1),aa(2),a(3),aaa(4),bb(1),b(2),a(5),b(3),aaa(6),a(7).
cta(28)
ctb(6)
true ;
false.
ma question, est il possible d'exécuter la comparaison sans utiliser "fin"? (de faire plus simple, et d'avoir le même affichage)
Merci d'avance.
Partager