/*************************/ /* interval arithmetics */ /* (c) R. Bart‡k */ /* 1997 */ /*************************/ % module that implements interval arithmetics % functions: plus(+,+,?),minus(+,+,?),times(+,+,?) % example: ?-plus(1É5,3É7,X). :-op(600,xfx,É). plus(ALÉAU,BLÉBU,CLÉCU):- ((AL= -inf ; BL= -inf) -> CL= -inf ; CL is AL+BL), ((AU= +inf ; BU= +inf) -> CU= +inf ; CU is AU+BU). minus(ALÉAU,BLÉBU,CLÉCU):- ((AL= -inf ; BU= +inf) -> CL= -inf ; CL is AL-BU), ((AU= +inf ; BL= -inf) -> CU= +inf ; CU is AU-BL). times(ALÉAU,BLÉBU,CLÉCU):- num_times(AL,BL,T1),num_times(AL,BU,T2),num_times(AU,BL,T3),num_times(AU,BU,T4), min(T1,T2,L1),min(L1,T3,L2),min(L2,T4,CL), max(T1,T2,U1),max(U1,T3,U2),max(U2,T4,CU). num_times(-inf,B,C):-!, (lt(0,B) -> C= -inf ; B=0 -> C=0 ; C= +inf). num_times(+inf,B,C):-!, (lt(0,B) -> C= +inf ; B=0 -> C=0 ; C= -inf). num_times(A,-inf,C):-!, (lt(0,A) -> C= -inf ; B=0 -> C=0 ; C= +inf). num_times(A,+inf,C):-!, (lt(0,A) -> C= +inf ; B=0 -> C=0 ; C= -inf). num_times(A,B,C):- C is A*B. num_divide(LÉU,D,NLÉNU):- (L= -inf -> (D<0 -> A= +inf ; A= -inf) ; A is L/D), (U= +inf -> (D<0 -> B= -inf ; B= +inf) ; B is U/D), min(A,B,NL),max(A,B,NU). join_inters(ALÉAU,BLÉBU,CLÉCU):- min(AL,BL,CL), max(AU,BU,CU),!. intersection(ALÉAU,BLÉBU,CLÉCU):- max(AL,BL,CL), min(AU,BU,CU),!. leq(-inf,B):-!. leq(_,-inf):-!,fail. leq(+inf,B):-!,B= +inf. leq(A,+inf):-!. leq(A,B):-A= C=A ; C=B. max(A,B,C):- lt(A,B) -> C=B ; C=A.