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 :
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).
l'exécution donne :

[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.