swi-prolog et CHR: addition d'éléments sans utiliser des listes.
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:
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.