:- dynamic and_prod/3, and_godel/3, and_luka/3, or_prod/3, or_godel/3, or_luka/3, agr_aver/3, pri_prod/3, pri_div/3, pri_sub/3, pri_add/3, pri_min/3, pri_max/3.

member(info(X,W)):-number(X), 0=<X,X=<1, (W=infty,!; number(W),1=<W).

leq(info(X1,W1),info(X2,W2)):-X1 =< X2, (W1=infty,!; number(W2), W2 =< W1).

bot(info(0,infty)).
top(info(1,1)).

and_prod(info(X,W1),info(Y,W2),info(Z,W3)) :- pri_prod(X,Y,Z), pri_add(W1,W2,W3).
and_godel(info(X,W1),info(Y,W2),info(Z,W3)) :- pri_min(X,Y,Z), pri_add(W1,W2,W3).
and_luka(info(X,W1),info(Y,W2),info(Z,W3)) :- pri_add(X,Y,U1), pri_sub(U1,1,U2), pri_max(U2,0,Z), pri_add(W1,W2,W3).

or_prod(info(X,W1),info(Y,W2),info(Z,W3)) :- pri_prod(X,Y,U1), pri_add(X,Y,U2), pri_sub(U2,U1,Z), pri_add(W1,W2,W3).
or_godel(info(X,W1),info(Y,W2),info(Z,W3)) :- pri_max(X,Y,Z), pri_add(W1,W2,W3).
or_luka(info(X,W1),info(Y,W2),info(Z,W3)) :- pri_add(X,Y,U1), pri_min(U1,1,Z), pri_add(W1,W2,W3).

agr_aver(info(X,W1),info(Y,W2),info(Z,W3)) :- pri_add(X,Y,U1),pri_prod(U1,0.5,Z), pri_add(W1,W2,W3).

pri_prod(X,Y,Z) :- Z is X * Y.
pri_div(X,Y,Z) :- Z is X / Y.
pri_sub(X,Y,Z) :- Z is X-Y.
pri_add(X,Y,Z) :- number(X), number(Y), Z is X+Y.
pri_add(infty,_,infty).
pri_add(_,infty,infty).
pri_min(X,Y,Z) :- (X=<Y,Z=X;X>Y,Z=Y).
pri_max(X,Y,Z) :- (X=<Y,Z=Y;X>Y,Z=X). % max(x,y) 